|
|
  |
STM32F407 Проблемы с SPI, Не отсылается байт сразу после проверки бита ТХЕ в регистре SR |
|
|
|
Apr 21 2013, 21:04
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
ну тогда только что есть какое то прерывание, которое непонятно как все ставит раком. Потому что я так понимаю данные попавшие в регистр DR должны выдавиться полюбому, а мы видим что они не выдавливаются...
а если в том месте где вы ставите брекпоинт поставить for(volatile int i=0;i<32000;i++) __NOP(); ну вообщем любую тупую задержку, да на побольше, чтобы секунда прям вышла... несколько раз цикл воткните... хотя отправки по уарту уже сделали эту задержку...
А воткните циклы выдачи на уарт значения SR после строчки SPI2->DR = Data; ну так для полноты картины...
думаю что уже все проверили, может чип какой то подгоревший? Фиг же его знает, если бы SPI так странно не работал это бы все заметили...
Есть у меня последняя идея.
Может там какая просадка или помеха по питанию при попытке отправки по SPI, которая реально вешает проц... Циклы выдачи после DR=d0; Должны помочь понять. Если вы ставите брек поинт или медленно идете тока хватает, а если программа быстро летит, что-то проседает и кирдык?
|
|
|
|
|
Apr 21 2013, 21:10
|

Знающий
   
Группа: Свой
Сообщений: 618
Регистрация: 7-06-08
Из: USSR
Пользователь №: 38 121

|
ладно, мне кажется я частичто решил проблему. Сейчас работаю БЕЗ дебаггера, компилирую заливаю на чип включаю плату (хотя в дебаггере поведение такоеже) вот фрагмент кода №1, как уже знаете просто цикл проверки и отправка байта. Код while ( (SPI2->SR & SPI_SR_TXE) ==0 ) {
}
SPI2->DR = d0; А вот фрагмент кода №2 Код for(;;) {
if ((USART3->SR & USART_SR_RXNE)) if (USART3->DR == 0x01) break; } Этот код просто бесконечный цикл, пока с USART3 не будет получена команда 01, как только эта команда получена цикл прерывается, и исполнение программы переходит к фрагменту кода №1 Так вот, компилю, заливаю на флеш. Затем включаю плату, естесственно ничег не происходит т.к. цикл фрагмента кода №2 работает, затем подаю команду 01 с USART3 и немедленно вижу свой байт на осциллографе! Вобщемто заработало на чипе и без дебаггера с брейк поинтами... но просто интерестно, в чем же была проблема? Выходит проблема была в том что когда я подаю питание на плату (и на чип естесственно) то толи порт вывода толи SPI2 периферия еще не успела войти в рабочий режим необходимый для отправки данных? Или чтото вроде того? Что думаете?
--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
|
|
|
|
|
Apr 21 2013, 21:37
|

Знающий
   
Группа: Свой
Сообщений: 618
Регистрация: 7-06-08
Из: USSR
Пользователь №: 38 121

|
да было иначе периферия не работала бы вообще. Вот еще один интересный тест сделал(как вы говорили проверил также статус после записи), вот код (в этот раз убрал бесконечный цикл в начале): Код while ( (SPI2->SR & SPI_SR_TXE) ==0 ) { while(!(USART3->SR & USART_SR_TXE)); // check if TXE bit is set USART3->DR = (uint8_t)( (SPI2->SR)>>8 ); // sending a byte while(!(USART3->SR & USART_SR_TC)); // check if TC bit is set
while(!(USART3->SR & USART_SR_TXE)); // check if TXE bit is set USART3->DR = (uint8_t)( SPI2->SR); // sending a byte while(!(USART3->SR & USART_SR_TC)); // check if TC bit is set }
while(!(USART3->SR & USART_SR_TXE)); // check if TXE bit is set USART3->DR = (uint8_t)( (SPI2->SR)>>8 ); // sending a byte while(!(USART3->SR & USART_SR_TC)); // check if TC bit is set
while(!(USART3->SR & USART_SR_TXE)); // check if TXE bit is set USART3->DR = (uint8_t)( SPI2->SR); // sending a byte while(!(USART3->SR & USART_SR_TC)); // check if TC bit is set
SPI2->DR = d0;
while(!(USART3->SR & USART_SR_TXE)); // check if TXE bit is set USART3->DR = (uint8_t)( (SPI2->SR)>>8 ); // sending a byte while(!(USART3->SR & USART_SR_TC)); // check if TC bit is set
while(!(USART3->SR & USART_SR_TXE)); // check if TXE bit is set USART3->DR = (uint8_t)( SPI2->SR); // sending a byte while(!(USART3->SR & USART_SR_TC)); // check if TC bit is set И вот некоторые наблюдения: 1) Когда я скомпилировал и зашил контроллер, то я не только не увиден на осциллографе свой байт, но я еще и не увидел байты полученные от USART3!! Интерестно нет? 2) Затем перед кодом который показан выше я добавляю фрагмент кода №2из моего предыдущего поста(непрерывный цикл с ожиданием команды от USART3), комилю, заливаю, включаю..естесственно ничего пока не происходит т.к. нет команды от USART3 на прерывание цикла, подаю команду на прерывание цикла, И вижу свой отправленныйбайт на осциллографе! А также вижу уже 4 полученных байта, и вот они: 00 02 до посылки 00 03 после посылки! Как видите интерестно то что после посылки не только TXE=1 но и RXNE=1 что говорит о том что приемник полный.. (хотя странно ничего я не принимаю..) Тем не менее... явно видно то что некоторые периферии почемуто не хотят работать почти сразу после того как чип запустился.. Ну по крайней мере такой вывод можно сделать из этих наблюдений? Если есть какие то еще идеи интерестно было бы узнать Цитата(Golikov A. @ Apr 22 2013, 02:15)  думаю стоит ли у вас микросхема рессета проца? стоит просто ресет кнопка на плате, сбрасывание не помогало ничем
--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
|
|
|
|
|
Apr 22 2013, 03:29
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
 а как SPI должен отличить есть что-то на входе или нет? Входная нога в каком то состоянии, клоки тикают, значит через 8-9 клоков входной регистр наберет значение. В примере кода что вам давали выше, была проверка не только на отправку, ну и на прием, а перед отправкой байта всегда еще происходил забор пришедшего. Такова суть СПИ, как включили клок генератор, так байт не только отправиться но и примется... Кстати вот интересный момент, а где вы включаете клок генератор? Он в STM автоматом что ли включается по записи байта в DR? Думаю что после загрузки первое что надо делать это настроить клоки, дождаться везде выставленных флагов, что все клоковые линии работают как надо, а уж потом инициализировать и включат периферию... Но в целом крайне странное поведение, что после старта и передачи управления в main процессор полурабочий. Там же должен быть еще файл стартапа....
|
|
|
|
|
Apr 22 2013, 03:48
|
Местный
  
Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126

|
Цитата(BlackOps @ Apr 22 2013, 00:37)  Интерестно нет? Ничего интересного... подобная тема уже была... SPI работает так, как заявлено в даташите... остальное всё от недопонимания... Цитата Если есть какие то еще идеи интерестно было бы узнать Читать даташит до просветления... в части тактирования ядра, тактирования SPI и работы самого SPI... Исходите из того, что транзакция начинается не сразу после загрузки DR... следовательно... и изменение TXE происходит не сразу...
Сообщение отредактировал HHIMERA - Apr 22 2013, 03:49
|
|
|
|
|
Apr 22 2013, 04:26
|

Знающий
   
Группа: Свой
Сообщений: 618
Регистрация: 7-06-08
Из: USSR
Пользователь №: 38 121

|
Цитата(Golikov A. @ Apr 22 2013, 08:29)  Кстати вот интересный момент, а где вы включаете клок генератор? Он в STM автоматом что ли включается по записи байта в DR? Его я включаю перед тем как начать работать с СПИ. Вот так: Код //============================================================================= // SPI2 Related configuration //============================================================================= // enable SPI2 clock ((RCC_TypeDef *) (RCC_BASE))->APB1ENR |= RCC_APB1ENR_SPI2EN;
// configure SPI2 ((SPI_TypeDef *) (SPI2_BASE)) -> CR1 |= (SPI_CR1_SPE | SPI_CR1_CPOL | SPI_CR1_CPHA | SPI_CR1_MSTR | SPI_CR1_BR_1 | SPI_CR1_SSM | SPI_CR1_SSI); Цитата(Golikov A. @ Apr 22 2013, 08:05)  А тем более упоминания о паузе перед посылкой которая влияет на его работоспособность. Также не нашел никаких битиков говорящих о неработоспособности или о том что еще не вышло время подготовки SPI. тоже самое делал и я после тех двух описанных мною тестов в посте №34 и №32. Согласен, Пустые умные посты типа "все происходит от недопонимания" никому не интерестны, если кто понял и знает в чем именно проблема и желает поделится, буду рад посмотреть, если нет то и постить не стоит. Цитата(HHIMERA @ Apr 22 2013, 07:48)  транзакция начинается не сразу после загрузки DR... следовательно... и изменение TXE происходит не сразу... а это не важно, т.к. я отправляю первый байт, и ТХЕ уже заведомо имеет значение 1. Об этом я тоже писал, Вы видимо не прочли ветку и поспешили дать банальный совет.
--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
|
|
|
|
|
Apr 22 2013, 07:07
|
Местный
  
Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126

|
Цитата(Golikov A. @ Apr 22 2013, 07:05)  то увы... Как прочитали - так и работает... увы... Цитата(BlackOps @ Apr 22 2013, 07:26)  Вы видимо не прочли ветку и поспешили дать банальный совет. Угу... Ещё раз... разногласия/разночтения по SPI присутствуют только в F0 и F3...
|
|
|
|
|
Apr 22 2013, 10:39
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(BlackOps @ Apr 22 2013, 08:26)  Его я включаю перед тем как начать работать с СПИ. Вот так: Код //============================================================================= // SPI2 Related configuration //============================================================================= // enable SPI2 clock ((RCC_TypeDef *) (RCC_BASE))->APB1ENR |= RCC_APB1ENR_SPI2EN;
// configure SPI2 ((SPI_TypeDef *) (SPI2_BASE)) -> CR1 |= (SPI_CR1_SPE | SPI_CR1_CPOL | SPI_CR1_CPHA | SPI_CR1_MSTR | SPI_CR1_BR_1 | SPI_CR1_SSM | SPI_CR1_SSI); Где-то есть упоминание (для F4), что между установкой битика включения тактирования блока и работы с блоком должно пройти какое-то время. У меня так FSMC не заработал) Попробую найти это в доках... UPD: STM32F405/407xx and STM32F415/417xx device limitations 2.1.12 Delay after an RCC peripheral clock enabling Description A delay between an RCC peripheral clock enable and the effective peripheral enabling should be taken into account in order to manage the peripheral read/write to registers. This delay depends on the peripheral’s mapping: ● If the peripheral is mapped on AHB: the delay should be equal to 2 AHB cycles. ● If the peripheral is mapped on APB: the delay should be equal to 1 + (AHB/APB prescaler) cycles. Workarounds 1. Use the DSB instruction to stall the Cortex-M CPU pipeline until the instruction is completed. 2. Insert ”n” NOPs between the RCC enable bit write and the peripheral register writes (n = 2 for AHB peripherals, n = 1 + AHB/APB prescaler in case of APB peripherals).
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|