Миландр

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

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




Начать новую тему  Ответить на тему  [ 3 сообщения ] 
Автор Сообщение
СообщениеДобавлено: 2013-ноя-21 12:52 
Не в сети

Зарегистрирован: 2013-авг-20 13:36
Сообщения: 2
Здравствуйте! В ходе решения одной задачи возникла внезапная проблема. Суть задачи следующая: нужно, чтобы устройство на контроллере 1986ВЕ92У при передаче данных с компьютера реагировало только на байты с определенным битом четности, а остальные игнорировало (требуется для организации сетевого обмена). В этом контроллере нет прерывания по определенному биту четности, однако есть прерывание по ошибке четности UARTPEINTR. В соответствии с документацией, если выставить биты PEN = 1, EPS = 1, SPS = 1 регистра LCR_H, ошибка четности будет фиксироваться, если пришедший байт будет иметь бит четности, равный единице. Если при этом еще и запретить все остальные прерывания, то контроллер будет реагировать только на байты с битом четности, равным единице. Именно то, что нам нужно. Также логично запретить буфер FIFO приемника, иначе он будет заполняться байтами с нулевым битом четности, которые нам не нужны.
Тогда работа устройства по идее должна выглядеть следующим образом:
1) Пока приходят байты с нулевым битом четности, прерываний не происходит. Первый байт сохраняется в единственном буферном регистре, последующие теряются. При этом устанавливается флаг переполнения (OE).
2) Как только приходит байт с единичным битом четности, срабатывает прерывание по ошибке четности. При обработке прерывания нужно считать регистр данных DR дважды. В первый раз мы считыванием старый байт с нулевым битом четности, а второй раз считывается уже актуальный для нас байт с единичным.
Вроде бы все просто. Однако была установлена следующая особенность: при считывании старого байта с нулевым битом четности регистр DR обновляется вовсе не сразу, а через некоторое время. Опытным путем было установлено, что примерно через 16 тактов HCLK, причем независимо от частоты UARTCLK. При этом, регистр флагов FR до первого считывания имеет установленный бит RXFF (буфер заполнен). После считывания первого байта этот флаг сбрасывается и устанавливается флаг RXFE (буфер пуст). При этом бит OE (переполнение буфера) регистра DR не сбрасывается (что, кстати, противоречит документации). Затем примерно через 16 тактов бит RXFF опять устанавливается, и значение в регистре DR обновляется. То есть какое-то время буферный регистр считается пустым, а затем снова заполняется пришедшим байтом. Собственно, это и есть основной вопрос данной темы. Откуда появляется эта задержка? Так и должно быть? Перерыли всю документацию, но ответа не нашли. Быть может, мы что-то делаем не так?
Единственная теория, которая пришла в голову - это связано с буфером FIFO приемника. Хотя он и отключен, возможно новому байту все равно нужно пройти все 16 буферных регистров по очереди?


Вернуться к началу
СообщениеДобавлено: 2013-ноя-26 12:54 
Не в сети

Зарегистрирован: 2013-авг-20 13:36
Сообщения: 2
Прошу разработчиков контроллера ответить на вопрос. Для дальнейшей работы нам желательно получить четкий ответ, что это за недокументированная особенность.


Вернуться к началу
СообщениеДобавлено: 2013-ноя-28 16:37 
Не в сети
Аватара пользователя

Зарегистрирован: 2012-авг-07 09:58
Сообщения: 132
Maestro писал(а):
Прошу разработчиков контроллера ответить на вопрос. Для дальнейшей работы нам желательно получить четкий ответ, что это за недокументированная особенность.
Прерывание по ошибке контроля четности возникает в момент приема бита четности, а данные в регистр DR поступают после приема стоп бита.
Вам надо реализовать что-то вроде этого:
void UART2_IRQHandler(void)
{
	if (UART_GetITStatusMasked(MDR_UART2, UART_IT_PE ) == SET) {
		UART_Data1 = UART_ReceiveData(MDR_UART2);
		while(UART_GetFlagStatus(MDR_UART2, UART_FLAG_RXFF) != SET);
		UART_Data2 = UART_ReceiveData(MDR_UART2);
		UART_ClearITPendingBit(MDR_UART2, UART_IT_PE );
	}
}


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

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


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

Сейчас этот форум просматривают: Google [Bot] и 7 гостей


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

Перейти: 

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