Миландр 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У | ||
А вообще-то лучше пока отключить прерывание по 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У | |
Столкнулся со следующей проблемой:...
Обращаю Ваше внимание на то, что прерывание по ошибке четности возникает в момент приема бита четности, а данные в регистр DR попадают при приеме стопового бита. Т.о. имеется задержка по времени в 1 бит между прерыванием по четности и принятыми данными в DR.viewtopic.php?t=1676#p7785 |
Автор: | DDA [ 2019-апр-16 17:15 ] | ||
Заголовок сообщения: | Re: Контроль бита четности UART 1986ВЕ92У | ||
Столкнулся со следующей проблемой:...
Обращаю Ваше внимание на то, что прерывание по ошибке четности возникает в момент приема бита четности, а данные в регистр DR попадают при приеме стопового бита. Т.о. имеется задержка в по времени в 1 бит между прерыванием по четности и принятыми данными в DR.viewtopic.php?t=1676#p7785 |
Автор: | 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 ![]() |
Страница 1 из 1 | Часовой пояс: UTC+03:00 |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |