Миландр
https://forum.milandr.ru/

Контроль бита четности UART 1986ВЕ92У
https://forum.milandr.ru/viewtopic.php?f=22&t=4031
Страница 1 из 1

Автор:  DDA [ 2019-апр-16 15:15 ]
Заголовок сообщения:  Контроль бита четности UART 1986ВЕ92У

Столкнулся со следующей проблемой:
Разрешил для UART2 прерывания UART_IT_RX и UART_IT_PE, в обработчике прерываний проверяю первым флаг PE и если он установился считываю данные, сбрасываю PE и RX, а далее должен отправить обратно фиксированный байт уже в теле main функции (0x077), в противном случае просто считываю данные в массив.
Пока для удобства сделал обычное эхо (байт принял-вернул) и меняю четность в терминале, но как бы я не менял четность в ответ не получаю ничего (отправленный байт или 0x077).
В чем может быть проблема, куда копать?
Работаю на отладочном комплекте Миландра.

Автор:  andelie [ 2019-апр-16 15:38 ]
Заголовок сообщения:  Re: Контроль бита четности UART 1986ВЕ92У

В МК UART надо сконфигурировать в режим контроля четности Space:
Цитата:
UARTInitStructure.UART_Parity = UART_Parity_0;
А в терминалке порт надо сконфигурировать в режим контроля четности Mark. Тогда любой принятый символ должен вызвать прерывание по PE.
Также проверьте, чтобы был отключен буфер FIFO, чтобы прерывания RX возникали сразу при приеме каждого очередного символа:
Цитата:
UARTInitStructure.UART_FIFOMode = UART_FIFO_OFF;
А вообще-то лучше пока отключить прерывание по RX, чтобы убедиться в правильности выполнения прерывания по PE.
Еще проверьте в обработчике прерываний от UART последовательность действий, которая ОЧЕНЬ важна:
Цитата:

// 1. Сбросить флаг прерывания по ошибке четности при приеме данных
MDR_UART2->ICR = UART_IT_PE;

// 2. Сохранить принятый символ в переменную
data = MDR_UART2->DR;

Автор:  DDA [ 2019-апр-16 16:27 ]
Заголовок сообщения:  Re: Контроль бита четности UART 1986ВЕ92У

andelie писал(а):
А вообще-то лучше пока отключить прерывание по RX, чтобы убедиться в правильности выполнения прерывания по PE.
Еще проверьте в обработчике прерываний от UART последовательность действий, которая ОЧЕНЬ важна:
Цитата:

// 1. Сбросить флаг прерывания по ошибке четности при приеме данных
MDR_UART2->ICR = UART_IT_PE;

// 2. Сохранить принятый символ в переменную
data = MDR_UART2->DR;
Спасибо за совет, попробую. С порядком сброса/сохранения пробовал разные варианты, вплоть до двухкратного считывания и сбросов флагов, но результата не дало.
Так общая цель контролировать бит четности, и при ошибке отправлять описанное протоколом сообщение об ошибке обратно на УУ (массив 4 байта).

Автор:  vasili [ 2019-апр-16 17:05 ]
Заголовок сообщения:  Re: Контроль бита четности UART 1986ВЕ92У

DDA писал(а):
Столкнулся со следующей проблемой:...
Обращаю Ваше внимание на то, что прерывание по ошибке четности возникает в момент приема бита четности, а данные в регистр DR попадают при приеме стопового бита. Т.о. имеется задержка по времени в 1 бит между прерыванием по четности и принятыми данными в DR.
viewtopic.php?t=1676#p7785

Автор:  DDA [ 2019-апр-16 17:15 ]
Заголовок сообщения:  Re: Контроль бита четности UART 1986ВЕ92У

vasili писал(а):
DDA писал(а):
Столкнулся со следующей проблемой:...
Обращаю Ваше внимание на то, что прерывание по ошибке четности возникает в момент приема бита четности, а данные в регистр DR попадают при приеме стопового бита. Т.о. имеется задержка в по времени в 1 бит между прерыванием по четности и принятыми данными в DR.
viewtopic.php?t=1676#p7785
Об этом в одной из тем форума видел пост с рекомендацией дважды считывать DR. Хочу еще уточнить, при работе со стандартными библиотеками, два этих прерывания вызывают один обработчик, или же я что-то упустил и их несколько? Насколько понял они сгруппированы по ИЛИ и вызывают 1 обработчик, а причина прерывания уточняется путем проверки флагов.

Автор:  vasili [ 2019-апр-16 17:29 ]
Заголовок сообщения:  Re: Контроль бита четности UART 1986ВЕ92У

Для каждого модуля UART имеется 1 вектор прерывания в NVIC. Соответственно вызывается один обработчик.

Автор:  DDA [ 2019-апр-16 18:14 ]
Заголовок сообщения:  Re: Контроль бита четности UART 1986ВЕ92У

Попробовал запретить прерывания по RX, оставил только PE, бит четности всегда 0, запретил FIFO, 115200 бод. Для проверки заставил его дополнительно при старте выплевывать несколько байт "приветствия", они приходят и с ними все в порядке, но вот реакции на PE при отправке ему в ответ байт с фиксированной единицей бита четности пока не обнаружил. Попробую еще потом принудительно маскирование выполнить.

UPD. Ошибка нашлась, и как обычно время поиска бага пропорциональна его глупости: опрашивал флаг UART1, при работе с UART2 :lol: . В любом случае огромное спасибо за наводки и помощь. Совсем недавно на данный МК перешел, ловлю грабли)

Страница 1 из 1 Часовой пояс: UTC+03:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/