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

 
 
> stm32f103 Странность DMA при передаче по UART2
Halfback
сообщение Jun 30 2014, 06:07
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 322
Регистрация: 28-05-05
Пользователь №: 5 512



Всем доброго дня!

Проблема такая: есть 8 байт, которые надо отправить по UART2. Использую DMA1 канал 7. Так вот, когда возникает прерывание DMA о полной передаче пакета то реально осциллом вижу что в этот момент передатчик UART2 выплюнул реально не 8 байт а 6. А 2 оставшихся потом досылаются. Т.е, допустим, у меня RS-485 с микрухой, где пеерключение приемника и передатчика заведено на один пин, и если управлять этим пином по запуску ДМА и вышеуказанному прерыванию то приемная сторона в моем случае недосчитается 2-х последних байт. Что, собственно, в железе и происходит.
Еррату читал, ничего похожего не нашел.

Кто нибудь с таким явлением сталкивался?

Пока вставил костыль - после прерывания ДМА вставил задержку на 3мс на отключение передатчика и включения приемника. Работает. Но на душе не спокойно.

Сообщение отредактировал Halfback - Jun 30 2014, 06:08
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Halfback
сообщение Jun 30 2014, 08:39
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 322
Регистрация: 28-05-05
Пользователь №: 5 512



Всем спс за коментарии.
исходя из задачи работы с RS-485 вижу что проще с DMA не связываться, а отправлять байты используя только прерывание TXE UART, декрементируя счетчик исходящих байтов. Когда будет 0 то включать приемник. Согласен, что можно в ДМА включить прерывание TXE, в котором потом переключать драйвер на приемник. Но вариант выше как то выглядит более "классическим" со всеми вытекающими.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 30 2014, 09:13
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Halfback @ Jun 30 2014, 11:39) *
а отправлять байты используя только прерывание TXE UART, декрементируя счетчик исходящих байтов. Когда будет 0 то включать приемник.
Получите то же яйцо что и сейчас, только в профиль. Прерывание TXE выставляется по освобождению буферного регистра. То есть досчитав до нуля вы будете точно так же иметь один байт в буфере и один в сдвигателе. Вам надо включать приемник в прерывании TC, transmit complete.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 25th August 2025 - 01:20
Рейтинг@Mail.ru


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