|
STM32L151 USART в режиме SPI, LSB и MSB |
|
|
|
May 28 2014, 20:53
|

Гуру
     
Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702

|
Пытаюсь использовать USART в синхронном режиме, т.е. сделать из него SPI . Но вот беда : бит 0 передаётся первым, а мне нужно в противоположном порядке. Я правильно понимаю, что этой настройки в USART нету ? Заранее спасибо за ответ ! Отвечу сам на свой вопрос :Действительно, настройки нет. Вот тут http://forum.micromouseonline.com/index.php?topic=460.0 приведён ответ из службы поддержки STM. Но есть быстрый способ перекодировать MSB в LSB uint32_t __RBIT(uint32_t value) { __ASM("rbit r0, r0"); __ASM("bx lr"); }
--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 19)
|
Aug 1 2014, 11:42
|

Гуру
     
Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702

|
Кто-нибудь может подсказать, почему программа изредка повисает при передаче байта по USART в режиме spi ? Точно такое же зависание я когда-то наблюдал и в асинхронном режиме. В обеих случаях режим MASTER Уже мозг сломал Код while(!(USART2->SR & USART_SR_TXE)) { } USART2->SR &=~ USART_SR_RXNE; USART2->DR=data; while(!(USART2->SR & USART_SR_RXNE)) { //тут висит }
--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
|
|
|
|
|
Aug 1 2014, 15:46
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата Потому что USART в синхронном режиме , как SPI. Передача байта происходит одновременно с приёмом. ну то есть у вас все хорошо работает  ? if RXNE=0, then it means that the last valid data has already been read and thus there is nothing to be read in the RDR. This case can occur when the last valid data is read in the RDR at the same time as the new (and lost) data is received. It may also occur when the new data is received during the reading sequence (between the USART_SR register read access and the USART_DR read access). вижу много причин пропадания этого флага... кстати если у вас в отладке где то просматривается RDR, то это тоже наверняка может сбросить флаг.... Почему не использовать идеологически более правильный флаг TC - Transmission complete?
|
|
|
|
|
Aug 2 2014, 14:23
|

Гуру
     
Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702

|
Цитата(Genadi Zawidowski @ Aug 2 2014, 15:03)  А кто-нибудь может объяснить, зачем флаг USART_SR_RXNE сбрасывают вручную, хотя он сбрасывается при чтении регистра данных? The RXNE flag can also be cleared by writing a zero to it. This clearing sequence is recommended only for multibuffer communication. Как я понимаю, рекомендуется. Очищать. Но не понимаю, что значит "multibuffer"
--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
|
|
|
|
|
Aug 2 2014, 17:37
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата Почему при работе USART+DMA иногда не происходит прерывание конца передачи DMA TC ( Transmission complete) ? ну блин, а я то откуда знаю  это к стешникам. ДМА надо читать, механизм сложный, много сложностей бывает. Цитата А кто-нибудь может объяснить, зачем флаг USART_SR_RXNE сбрасывают вручную, хотя он сбрасывается при чтении регистра данных Я так понимаю это как дополнительная опция для более простого для понимания кода. К примеру если у вас несколько обменов с 1 2 3 устройством, по прерыванию или полингом у вас идет чтения, в котором проверяется адрес ответа. И вы отключаете обработку 2 устройства, чтобы это место в коде было более читабельно, делаете вместо чтения при адресе равном 2, просто сброс. Операция равносильна, но идеологически более верная. вторая вещь которая приходит в голову, это для процов с FIFO на входе, в LPC1768 к примеру это востребовано. У него очередь по 16(8) байт на входе, можно либо сделать 16(8) чтений чтобы очередь была гарантированна пуста, либо 1 раз сбросить через спец регистр. Думаю что механизм от подобного блока тянется
|
|
|
|
|
Aug 3 2014, 08:29
|
Частый гость
 
Группа: Свой
Сообщений: 91
Регистрация: 9-09-07
Из: Минск
Пользователь №: 30 406

|
Цитата(MiklPolikov @ Aug 2 2014, 09:55)  Может ещё подскажете : Почему при работе USART+DMA иногда не происходит прерывание конца передачи DMA TC ( Transmission complete) ? А вы смотрели что в DMA_CNDTRx? если до нуля не декрементирует, то прерывание не произойдет.
|
|
|
|
|
Aug 3 2014, 14:58
|

Гуру
     
Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702

|
Цитата(Jekin @ Aug 3 2014, 12:29)  А вы смотрели что в DMA_CNDTRx? если до нуля не декрементирует, то прерывание не произойдет. Нет, не смотрел. Ну наверно, если посмотреть, то так и окажется. Цитата(jcxz @ Aug 3 2014, 15:40)  "Иногда" - это насколько часто? Недавно переносил проект на F103, так не заметил такого - UART-DMA работает без единого сбоя. Раз в несколько ч непрерывной передачи. Когда у меня SD карты висели на SPI , всё было без сучка без задоринки. А сейчас перевесил на USART в синхронном режиме, и началась эта нестабильная работа. И в другом проекте USART то же глючит, нет-нет да и не пройдёт передача. Я так понимаю, что это специфика USART. Успех передачи почему-то не гарантирован, и надо обрабатывать не успех. Но непонятно, что ему мешает работать стабильно ? В асинхронном режиме ещё бы можно было понять, но в синхронном-то почему ? Видимо он и в синхронном режиме не до конца превращается в SPI
--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|