Миландр

Ключевым подразделением нашей компании
является Центр Проектирования интегральных микросхем
Текущее время: 2021-апр-18 21:33

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 7 сообщений ] 
Автор Сообщение
 Заголовок сообщения: Контроль бита четности UART 1986ВЕ92У
СообщениеДобавлено: 2019-апр-16 15:15 
Не в сети

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


Вернуться к началу
СообщениеДобавлено: 2019-апр-16 15:38 
Не в сети

Зарегистрирован: 2014-июн-25 09:29
Сообщения: 139
В МК 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;


Вернуться к началу
СообщениеДобавлено: 2019-апр-16 16:27 
Не в сети

Зарегистрирован: 2019-апр-16 15:01
Сообщения: 7
Организация: АО "РИРВ"@
andelie писал(а):
А вообще-то лучше пока отключить прерывание по RX, чтобы убедиться в правильности выполнения прерывания по PE.
Еще проверьте в обработчике прерываний от UART последовательность действий, которая ОЧЕНЬ важна:
Цитата:

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

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


Вернуться к началу
СообщениеДобавлено: 2019-апр-16 17:05 
Не в сети

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


Вернуться к началу
СообщениеДобавлено: 2019-апр-16 17:15 
Не в сети

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


Вернуться к началу
СообщениеДобавлено: 2019-апр-16 17:29 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 761
Откуда: г. Санкт-Петербург
Для каждого модуля UART имеется 1 вектор прерывания в NVIC. Соответственно вызывается один обработчик.


Вернуться к началу
СообщениеДобавлено: 2019-апр-16 18:14 
Не в сети

Зарегистрирован: 2019-апр-16 15:01
Сообщения: 7
Организация: АО "РИРВ"@
Попробовал запретить прерывания по RX, оставил только PE, бит четности всегда 0, запретил FIFO, 115200 бод. Для проверки заставил его дополнительно при старте выплевывать несколько байт "приветствия", они приходят и с ними все в порядке, но вот реакции на PE при отправке ему в ответ байт с фиксированной единицей бита четности пока не обнаружил. Попробую еще потом принудительно маскирование выполнить.

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


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 7 сообщений ] 

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти: 

Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB