Перейти к содержанию
    

stm32f407 SPI обнаружил косяк

2 hours ago, Arlleex said:

есть синтаксический промах

Точно, спасибо)

2 hours ago, Arlleex said:

TXE взведется, когда TXFIFO будет заполнен наполовину или меньше.

Quote

Tx buffer empty flag (TXE)
When set, this flag indicates that the Tx buffer is empty and the next data to be transmitted 
can then be loaded into it. The TXE flag is reset when the Tx buffer already contains data to 
be transmitted. It is also reset when the I2S is disabled (I2SE bit is reset).

А я так понял, что он будет установлен в лог. 1, когда этот буфер пустой. Т.е. если он заполнен хотя бы на 1/4 (1 байт из 4 возможных), то он станет нулём. Т.е. при заполнение мы ориентируемся на FTLVL.

2 hours ago, Arlleex said:

RXNE взведется, когда RXFIFO будет заполнен не менее, чем на размер, определяемый битом FRXTH (0 - 16 бит; 1 - 8 бит).

Да, верно. Но у меня FRXTH утставноленен в инизиализации

    pRegs->CR2 = 0
                 | SPI_CR2_FRXTH
                 | DATA_SIZE_8_BIT
                 | SPI_CR2_ERRIE
    ;

И, по идее, RXNE должен быть в 1 всегда, пока есть данные. Но если ориентироваться только на него, я теряю эти данные. Помогает только мониторинг FRLVL. И 

это меня беспокоит, ибо я не до конца понял выходит как этот SPI работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

56 минут назад, haker_fox сказал:

А я так понял, что он будет установлен в лог. 1, когда этот буфер пустой. Т.е. если он заполнен хотя бы на 1/4 (1 байт из 4 возможных), то он станет нулём.

Цитата

28.5.10 SPI status flags

Three status flags are provided for the application to completely monitor the state of the SPI bus.

Tx buffer empty flag (TXE)

The TXE flag is set when transmission TXFIFO has enough space to store data to send. TXE flag is linked to the TXFIFO level. The flag goes high and stays high until the TXFIFO level is lower or equal to 1/2 of the FIFO depth. An interrupt can be generated if the TXEIE bit in the SPIx_CR2 register is set. The bit is cleared automatically when the TXFIFO level becomes greater than 1/2.

Rx buffer not empty (RXNE)

The RXNE flag is set depending on the FRXTH bit value in the SPIx_CR2 register:

If FRXTH is set, RXNE goes high and stays high until the RXFIFO level is greater or equal to 1/4 (8-bit).

If FRXTH is cleared, RXNE goes high and stays high until the RXFIFO level is greater than or equal to 1/2 (16-bit). An interrupt can be generated if the RXNEIE bit in the SPIx_CR2 register is set. The RXNE is cleared by hardware automatically when the above conditions are no longer true.

 

Также

Цитата

28.5.9 Data transmission and reception procedures

RXFIFO and TXFIFO

...

A read access to the SPIx_DR register must be managed by the RXNE event. This event is triggered when data is stored in RXFIFO and the threshold (defined by FRXTH bit) is reached. When RXNE is cleared, RXFIFO is considered to be empty.

 

То есть, если в FRXTH установлена 1, то RXNE будет установлен в 1 до тех пор, пока RXFIFO не будет вычитан полностью (FRLVL == 0).

Поэтому у Вас правильно все сделано:

1. Ловим прерывание по RXNE. Оно будет значить, что в RXFIFO прилетел хотя бы один фрейм. А то и больше.

2. В прерывании узнаем по FRLVL, сколько же там реально успело прийти. А прийти там могло уже больше 1 фрейма.

3. Тупо вычитываем RXFIFO до тех пор, пока в нем есть данные (FRLVL > 0 или RXNE != 0).

 

Или у Вас проблема с 3 пунктом? Т.е. если в цикле использовать FRLVL > 0 то все работает, а с проверкой RXNE != 0 нет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Arlleex said:

Или у Вас проблема с 3 пунктом? Т.е. если в цикле использовать FRLVL > 0 то все работает, а с проверкой RXNE != 0 нет?

Да. Т.е. если проверку FXNE заменить на FRLVL (изменив, конечно знак равенства), то да, начинает как-то пропускать байт. У меня сейчас тут почти 12 ночи) Завтра утром на свежую голову проверю. Может быть я и подзатупил маленько...

 

А на счёт BUSY я правильно делаю, что тупо поллингом проверяю? Дело в том, что CS дёргаю программно. Но, CS поднять в 1 нужно, когда гарантированно крайний байт будет вытолкан на MOSI. Но не нашёл никакого способа вызвать прерывание по этому событию. Может быть чего-то пропустил?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 минуты назад, haker_fox сказал:

Но, CS поднять в 1 нужно, когда гарантированно крайний байт будет вытолкан на MOSI. Но не нашёл никакого способа вызвать прерывание по этому событию. Может быть чего-то пропустил?

Ну так стандартно - прерывание по приёму. И в нём уже поднимать CS. Чем не устраивает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 minutes ago, jcxz said:

Ну так стандартно - прерывание по приёму. И в нём уже поднимать CS. Чем не устраивает?

Блин! Ну почему у Вас так всё просто?)))))))))))) И как я сам не догадался((( Ведь. дейсвтительно, приняли последний байт, и взводим CS вверх... @jcxz, респектище!!!!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, haker_fox сказал:

Блин! Ну почему у Вас так всё просто?)))))))))))) И как я сам не догадался((( Ведь. дейсвтительно, приняли последний байт, и взводим CS вверх... @jcxz, респектище!!!!!!

Так это вроде как стандартный приём, использую много лет уже на разных МК где нет аппаратного управления CS.  :wink:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тут, вроде как, на первых страницах была ожесточенная битва между всех за и против управления CS по RXNE vs BSY. Вроде как. Я тоже по RXNE CS поднимаю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 hours ago, Arlleex said:

Тут, вроде как, на первых страницах была ожесточенная битва между всех за и против управления CS по RXNE vs BSY

Да, я читал этот "дисскусьён". Но не знаю, насколько инфу от f407 можно применить к 091... Да и ладно, проще потестировать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я ещё раз повторю на всякий случай: событие RXNE может случиться раньше, чем полностью закончится передача байта. Потому что RXNE взводится сразу, как только защёлкнулся последний бит. А момент этого защёлкивания зависит от режима SPI, и при CPHA = 0 соответствует переднему фронту сигнала синхронизации.

Поэтому, сбрасывая CS по флагу RXNE, можно получить проблемы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 минут назад, AHTOXA сказал:

Поэтому, сбрасывая CS по флагу RXNE, можно получить проблемы.

В чём именно "проблемы" состоят? Какой бы ни был режим, но в любом случае бит сперва выводится на шину и только потом - вводится. Так что к моменту ввода и передатчик и приёмник оба отсчитают требуемое число бит. А деактивация CS к тому же дополнительно должна сбрасывать машину состояний SPI в слэйве.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

23 minutes ago, AHTOXA said:

Поэтому, сбрасывая CS по флагу RXNE, можно получить проблемы.

А как вы делаете? Я пока вот оставил поллинг флага BUSY в конце функции приёма-передачи, которая в целом соответствует событийной модели с использованием сервисов ОСРВ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, AHTOXA сказал:

Я уже всё описывал в этой теме. Вот здесь пост с картинками : тынц.

1. Сами себе противоречите. В том посте утверждаете, что нельзя использовать BUSY:

В 11.01.2013 в 18:01, AHTOXA сказал:

Вывод. Я не знаю, для чего придумали флаг BSY, но для управления чипселектом он точно не подходит:)

А сейчас - что нельзя использовать RXNE. И что же тогда прикажете использовать если и то и другое нельзя?  :unknw:

 

2. Из картинок по той ссылке, не видно никаких проблем в работе. Для первой картинки очевидно, что выдвигание бита на шину происходит по спаду SCLK, а защёлкивание - по фронту SCLK. А чтобы вообще всё было красиво, лучше использовать режим SPI с пассивным состояние SCLK==1.

 

PS: Так что все замечания - невразумительные и мимо кассы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

50 минут назад, jcxz сказал:

1. Сами себе противоречите. В том посте утверждаете, что нельзя использовать BUSY:

А сейчас - что нельзя использовать RXNE. И что же тогда прикажете использовать если и то и другое нельзя?  :unknw:

И то и другое можно, но с умом. Добавляя необходимую задержку перед снятием CS.

56 минут назад, jcxz сказал:

2. Из картинок по той ссылке, не видно никаких проблем в работе.

Если вы не видите проблем, это не означает, что их нет. Существуют устройства, которые отменяют транзакцию, если CS снят до окончания нужного количества тактов SCLK.

[ jcxz mode on ]Очевидно, вы просто не умеете писать действительно быстрые программы, и ваш код просто не успевает снять CS достаточно быстро, чтобы вы смогли заметить проблему[ jcxz mode off ]

57 минут назад, jcxz сказал:

Так что все замечания - невразумительные и мимо кассы. 

Ну я и не ожидал, что вы поймёте. Умение читать  и понимать - это не ваше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

37 minutes ago, AHTOXA said:

И то и другое можно, но с умом. Добавляя необходимую задержку перед снятием CS.

Ок, понятно. Пока снимаю CS по BUSY поллингом. Оставленная на ночь шина с двумя озушками на ней прошла тесты. Логический анализатор тоже показывает запас по таймингам. Если проблемы появятся, просто решу их по мере поступления. Спасибо за консультацию!!!

39 minutes ago, AHTOXA said:

Ну я и не ожидал, что вы поймёте. Умение читать  и понимать - это не ваше.

Коллеги...:girl_cray2:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...