реклама на сайте
подробности

 
 
> STM32L151 USART в режиме SPI, LSB и MSB
MiklPolikov
сообщение May 28 2014, 20:53
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 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");
}


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
adnega
сообщение May 28 2014, 23:40
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Так можно байтик кувырнуть.
Код
rbit8:
    rbit r0, r0
    rev r0, r0
    bx lr
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение May 29 2014, 01:23
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



не понятно что такое rev, особенно если уже в начале есть rbit.

http://infocenter.arm.com/help/index.jsp?t...g/Cihfddaf.html

здесь еще предлагают
unsigned int __rbit(unsigned int val);

ну понятно что он тоже самое делает, что и в первом посте. только надо понимать что когда вы 32 битное слово реверсируете, ваши 8 бит улетают из начала в конец, то есть после такой реверсии еще надо посылать в другом формате little endian сменить на big endian
Go to the top of the page
 
+Quote Post
adnega
сообщение May 29 2014, 02:29
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Golikov A. @ May 29 2014, 09:33) *
ну понятно что он тоже самое делает, что и в первом посте. только надо понимать что когда вы 32 битное слово реверсируете, ваши 8 бит улетают из начала в конец, то есть после такой реверсии еще надо посылать в другом формате little endian сменить на big endian

rev меняет порядок байт в слове - типа rbit, но для байтов. Т.е. rbit8 как бы реверсит биты внутри байта.
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Aug 1 2014, 11:42
Сообщение #5


Гуру
******

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



Кто-нибудь может подсказать, почему программа изредка повисает при передаче байта по USART в режиме spi ?
Точно такое же зависание я когда-то наблюдал и в асинхронном режиме. В обеих случаях режим MASTER
Уже мозг сломал wacko.gif

Код
  while(!(USART2->SR & USART_SR_TXE))
   {
   }                        
  USART2->SR &=~ USART_SR_RXNE;
  USART2->DR=data;
  while(!(USART2->SR & USART_SR_RXNE))
  {
    //тут висит
  }


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
adnega
сообщение Aug 1 2014, 12:18
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(MiklPolikov @ Aug 1 2014, 15:42) *
Кто-нибудь может подсказать, почему программа изредка повисает при передаче байта по USART в режиме spi ?

Иногда мешает противный битик OVR. Вы его обрабатываете?
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Aug 1 2014, 12:53
Сообщение #7


Гуру
******

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



Цитата(adnega @ Aug 1 2014, 16:18) *
Иногда мешает противный битик OVR. Вы его обрабатываете?

Нет. Но я несколько раз , под отладкой, убедился в том что когда повисло этот бит не стоит.
Как и в каком место кода его обрабатываете вы ?


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 1 2014, 13:29
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



while(!(USART2->SR & USART_SR_RXNE))

почему вы завершение передачи ожидаете по заполнению приемника, а не по опустошению передатчика?
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Aug 1 2014, 13:45
Сообщение #9


Гуру
******

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



Цитата(Golikov A. @ Aug 1 2014, 17:29) *
while(!(USART2->SR & USART_SR_RXNE))

почему вы завершение передачи ожидаете по заполнению приемника, а не по опустошению передатчика?

Потому что USART в синхронном режиме , как SPI. Передача байта происходит одновременно с приёмом.


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
adnega
сообщение Aug 1 2014, 14:46
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Может, нарушение кадра имеет место быть. Типа, нет стоп-бита. Или какой-то бит считался с ошибкой. Нужно следить за ORE, NF, FE.
Я работаю по прерываниям, поэтому если байт принят с ошибкой, то он просто будет потерян. В вашем же случае потеря байта не допустима.
UART это не SPI - можно ведь и не принять))
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 1 2014, 15:46
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
Потому что USART в синхронном режиме , как SPI. Передача байта происходит одновременно с приёмом.

ну то есть у вас все хорошо работаетsm.gif?

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?

Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Aug 2 2014, 06:55
Сообщение #12


Гуру
******

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



Golikov A, огромное спасибо, с флагом TC висеть перестало !

Может ещё подскажете :
Почему при работе USART+DMA иногда не происходит прерывание конца передачи DMA TC ( Transmission complete) ?


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Aug 2 2014, 11:03
Сообщение #13


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



А кто-нибудь может объяснить, зачем флаг USART_SR_RXNE сбрасывают вручную, хотя он сбрасывается при чтении регистра данных?
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Aug 2 2014, 14:23
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 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"


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 2 2014, 17:37
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
Почему при работе USART+DMA иногда не происходит прерывание конца передачи DMA TC ( Transmission complete) ?


ну блин, а я то откуда знаюsm.gif это к стешникам. ДМА надо читать, механизм сложный, много сложностей бывает.

Цитата
А кто-нибудь может объяснить, зачем флаг USART_SR_RXNE сбрасывают вручную, хотя он сбрасывается при чтении регистра данных

Я так понимаю это как дополнительная опция для более простого для понимания кода.
К примеру если у вас несколько обменов с 1 2 3 устройством, по прерыванию или полингом у вас идет чтения, в котором проверяется адрес ответа. И вы отключаете обработку 2 устройства, чтобы это место в коде было более читабельно, делаете вместо чтения при адресе равном 2, просто сброс. Операция равносильна, но идеологически более верная.

вторая вещь которая приходит в голову, это для процов с FIFO на входе, в LPC1768 к примеру это востребовано. У него очередь по 16(8) байт на входе, можно либо сделать 16(8) чтений чтобы очередь была гарантированна пуста, либо 1 раз сбросить через спец регистр. Думаю что механизм от подобного блока тянется
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 09:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.0148 секунд с 7
ELECTRONIX ©2004-2016