|
stm32f103 Странность DMA при передаче по UART2 |
|
|
|
Jun 30 2014, 06:07
|
Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
 |
Ответов
(1 - 8)
|
Jun 30 2014, 06:48
|

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

|
Цитата(Halfback @ Jun 30 2014, 09:07)  вижу что в этот момент передатчик UART2 выплюнул реально не 8 байт а 6. А 2 оставшихся потом досылаются. Все верно. В UART есть буферный регистр передачи (transmission holding register) и регистр, в котором собственно и происходит сдвиг битов в процессе передачи (shift register). Вот там ваши два байта и лежат (организована двойная буферизация). Задача DMA - донести байты до UART. Оно свою задачу выполнило, о чем и рапортует прерыванием. Все указанные вами байты будут отправлены и ничего не потеряется. Для отключения передатчика RS-485 вам надо в прерывании DMA включать прерывание окончания передачи (transmission complete, TC) UARTа, а уже в нем выключать передатчик RS-485. Не ленитесь читать документацию, там очень подробно расписано и про сдвигатель, и про буферизацию, и про DMA, и про то, какие флаги когда выставляются.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|