Миландр

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

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 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
Сообщения: 115
В МК 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
Сообщения: 698
Откуда: г. Санкт-Петербург
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
Сообщения: 698
Откуда: г. Санкт-Петербург
Для каждого модуля UART имеется 1 вектор прерывания в NVIC. Соответственно вызывается один обработчик.


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

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

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


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

Часовой пояс: UTC + 3 часа


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

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


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

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB