|
|
  |
STM32F407 Проблемы с SPI, Не отсылается байт сразу после проверки бита ТХЕ в регистре SR |
|
|
|
Apr 21 2013, 18:21
|

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

|
Да, как яуже говорил, если например ставлю брейк межу циклом и между отправкой, то все работает (если SPI2 были бы сконфигурированы не верне, не работало бы вообще!)
еще работает тогда, когда я например в дебаггере по очереди пальцем жму на исполнение каждой строки этого кода..
а прогоняя весь код не работает! причем проблема именно в этих двух линиях! но какая именно понять не могу?
еще вот какой вариант работает:
никаких циклов, ничего, ставлю только это: SPI2->DR = d0; НО! перед этой строкоы ставлю брейк!
в дебаггере исполняю, доходит до брейка, и на осциллографе вижу как преже поднятй SCK и нулевой MOSI! Но потом, нажимаю кнопку Run опять, и уже исполняыется вышеописанная команда!И вот вижу свой байт на осциллографе и переключение SCK!
А вот если без брейка... т.е. сразу запустить всю прогу! то только вижу приподнятй SCK и нулевой MOSI!
Это на какие либо мысли толкает? что это может быть?
--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
|
|
|
|
|
Apr 21 2013, 18:41
|

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

|
вот по вашему образцу код мой: Код (void) SPI2->DR; /* clear SPI_SR_RXNE in status register */ // breakpoint here! SPI2->DR = (d0 & SPI_DR_DR);
while ((SPI2->SR & SPI_SR_TXE) == 0) ; Видите коммент где про breakpoint сказано?так вот если ставлю туда брейкпоинт, дохожу до него и опять стартую то работает! если без брейк поинта, то не работает когда исполняется все сразу! не могу понать почему?
--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
|
|
|
|
|
Apr 21 2013, 19:05
|

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

|
естесственно хватает, вот что вижу на осциллографе когда работает: [DELETED]а вот когда не работает: [DELETED]чтото пост большой какойто стал :Р без дебаггера тоже не работает! т.е. если на чип заливаю, и включаю, то не работает! Никакой функции нету! исполняю прямо кодом для простоты! вот один из кодов привожу еще раз, где в комменте указано если там стоит брейк то работает, если нет брейка то не работает. Код (void) SPI2->DR; /* clear SPI_SR_RXNE in status register */ // breakpoint here! SPI2->DR = (d0 & SPI_DR_DR);
while ((SPI2->SR & SPI_SR_TXE) == 0) ; да! я знаю! проблема сократилась! но дело в том что непонятно в чем сейчас дело... все просто...убираю брейк не работает если прогорняыется код сразу! ставлю брейк вижу сначала изображение №2 в посте, потом вновь запускаю как только достиг брейка, и вижу изображение №1 (т.е. рабочее) а если нет брейка, т.е. сразу прогоняыется весь код, то тока изображение №2!
Сообщение отредактировал IgorKossak - Apr 22 2013, 08:01
Причина редактирования: изображения следует прикреплять к сообщению, а не вставлять
--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
|
|
|
|
|
Apr 21 2013, 19:14
|

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

|
Цитата(Golikov A. @ Apr 21 2013, 22:50)  все выглядит каким то чудом. а вот так если сделать
int dummy = SPI2->DR; SPI2->DR = 0xAA; while(1);
что будет? ничего не будет, тоже не работает! а вот если ставлю брейк на линии int dummy = SPI2->DR; исполняю код, дохожу до брейка, затем опять исполняют, то работает! не могу понять в чем дело! Цитата(Genadi Zawidowski @ Apr 21 2013, 23:12)  Так... 1) А что с выходом чипселекта? Сказать что есть и не подкдючаться к нему: const uint_fast32_t cr1bits = SPI_CR1_MSTR | SPI_CR1_SSM | SPI_CR1_SPE | baudrate; const uint_fast32_t cr1bits16w = cr1bits | SPI_CR1_DFF;
0) У STM32F1xxx есть errata: // Silicon errata: // 2.6.7 I2C1 with SPI1 remapped and used in master mode // Workaround: // When using SPI1 remapped, the I2C1 clock must be disabled.
ВЫ не дожидаетесь пока байт передастся (когда примется обратно!). Зачем сократили мой код? Там же это было! да но ведь я же использую SPI2 а не SPI1!
--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
|
|
|
|
|
Apr 21 2013, 19:31
|

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

|
попробовал добавление SPI_CR1_DFF, тоже самое, не работает если прогонять код сразу. NSS я не использую! И не используя его но исполняя код по строчкам все работает! Пытатся использовать ег сейчас думаю только усложнит проблему! Ведь ллогически, если сам интерфейс работае в дебаггере когда исполняется по строчкам.. почему он не должен работать когда разом исполняется весь код! вот в чем дело я не думаю чтоэто какое то отношение имеет к NSS. Просто я не могу понять что еще тут может быть? Цитата(Golikov A. @ Apr 21 2013, 23:20)  Не ну тоды магия.
А во придумал!!! А если так? while ( (SPI2->SR & SPI_SR_TXE) ==0 ); int dummy = SPI2->DR; SPI2->DR = 0xAA; while(1);
и как проверить что прием окончен?
Может у вас вызов идет во время приема потому ничего и не работает? А когда перед записью регистра есть брек поинт, проц успевает что-то принять или передать... нет. и так не работает! И нет у меня никакого приема! все просто в тех строчках которые я привел! просто использую пины SCK и MOSI и подключаю их к осциллографу! никакого приема или ччего то еще!
--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
|
|
|
|
|
Apr 21 2013, 19:53
|

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

|
Ну а что там разбиратся? у меня и SSM=1 и SSI = 1 Когда SSM=1 то програмное управление слейвом включено. в таком случае значение бита SSI передается на ногу NSS, и то что на ноге NSS извне игнорируется! Цитата Bit 8SSI:Internal slave select This bit has an effect only when the SSM bit isset. The value of this bit is forced onto the NSS pin and the IO value of the NSS pin is ignored. иными словами этим битом можно ногой NSS управлять. в моемслучае это вообще не принципиально... т.е. с этим я разобрался и это думаю к данной проблеме не имеет отношения. Ил я не прав в чем то?
--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
|
|
|
|
|
Apr 21 2013, 20:41
|

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

|
проц нормально запускается и работает без дебаггера, т.к. я другие рабочие куски вставлял в программу перед своим тестовым кодом. вот как я считываю сейчас регистры: SR,CR1,CR2 кодом своим: Код while ( (SPI2->SR & SPI_SR_TXE) ==0 ); sr_t = SPI2->SR; cr1_t = SPI2->CR1; cr2_t = SPI2->CR2; // breakpoint here! SPI2->DR = 0xAA; и вот что вижу в дебаггере, все вроде нормально CR1=б1101010111 (SSM=1,SSI=1,SPE=1,BR=010,MSTR=1,CPOL=1,CPHA=1) SR=0х2 (т.е. только ТХЕ=1) CR2=0 сделал так как Вы предлагли через USART тоже. вот код: Код 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; в USART увидел только два полученных байта: 00 02 что говорит о том что, то что внутри while цикла не выполнилось, т.к. ТХЕбыл уже равен 1 (т.е. буфер отправки данных изначально ыл свободен) А затем я получилдва байта 00 02, перед SPI2->DR = d0; как Вы и предлагали изначение 02 говорит что ТХЕ по пренему равен 1, т.е. буфер свободен. но не работает это! на осцилографе вижу подтянутый ввех SCK и нулевой MOSI есть какие идеи?
--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|