Миландр

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

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




Начать новую тему  Ответить на тему  [ 6 сообщений ] 
Автор Сообщение
 Заголовок сообщения: Регистры RIS и MIS
СообщениеДобавлено: 2017-дек-21 13:44 
Не в сети

Зарегистрирован: 2017-авг-09 12:38
Сообщения: 147
Организация: НПФ "Авангард"
В чем отличие этих регистров? В IMSC мы можем разрешать или запрещать прерывания. Регистр RIS, согласно спецификации должен показывать от чего произошло прерывание. А вот регистр MIS что должен показывать?. Кто делал связь по MODBUS (RTU), можно ли обойтись только штатными прерываниями, в основном имею в виду прерыванием по таймауту. Или для того, чтобы отделить посылки друг от друга надо использовать что то типа SysTick?


Вернуться к началу
 Заголовок сообщения: Re: Регистры RIS и MIS
СообщениеДобавлено: 2017-дек-21 16:37 
Не в сети

Зарегистрирован: 2009-сен-21 12:39
Сообщения: 537
Сдается, что приспособить UARTRTINTR для определения time-out не получится.
Цитата:
"Прерывание по таймауту приемника возникает в случае, если буфер FIFO приемника не пуст, и на вход приемника не поступало новых данных в течение периода времени, необходимого для передачи 32 бит"
Т.е. надо гарантировать, что к концу пакета в FIFO что-то осталось. Во-вторых, вроде в RTU длительность time-out 3,5 символа, т.е. 35 бит.


Вернуться к началу
 Заголовок сообщения: Re: Регистры RIS и MIS
СообщениеДобавлено: 2017-дек-21 16:53 
Не в сети

Зарегистрирован: 2017-авг-09 12:38
Сообщения: 147
Организация: НПФ "Авангард"
[quote="ЧумА"]Сдается, что приспособить UARTRTINTR для определения time-out не получится. [quote]
Вот и я так рассуждаю. А Вы как, я понимаю, еще не делали Модбас? и По поводу RIS, MIS. В чем различие? В процессе отладки они мне демонстрируют одинаковые флаги.


Вернуться к началу
 Заголовок сообщения: Re: Регистры RIS и MIS
СообщениеДобавлено: 2017-дек-21 17:31 
Не в сети

Зарегистрирован: 2009-сен-21 12:39
Сообщения: 537
Вроде-как MIS это RIS с учетом масок заданных в IMSC. В обработчике прерываний от UART для определения источника мы (давно и успешно) проверяем как-раз MIS.
MODBUS конкретно на 1986 "ещё не делали". Для тех протоколов, что пользуем, time-out формируем способом "что то типа SysTick" :) (таймером ОС-а).
Пример из тела обработчика прерывания UART:
	if ( UARTx->MIS & ((1 << UART_MIS_RXMIS_Pos) | (1 << UART_MIS_RTMIS_Pos)) )
		{
		do
			{
		#ifdef	UART_9_BIT
			uart->RxBuffer[uart->rxTail] = UARTx->DR;		// хвост - сюда пишем
		#else
			uart->RxBuffer[uart->rxTail] = (u8)UARTx->DR;		// хвост - сюда пишем
		#endif
			if(++uart->rxTail == UART_RX_BUF_SIZE)
				uart->rxTail = 0;
		#ifdef UART_RXBUF_ERR
			if(uart->rxTail == uart->rxHead)	// хвост догнал голву
				SoS_Error(UART_RXBUF_ERR, ERR_POSITION);
		#endif
			}
		while( (UARTx->FR & (1 << UART_FR_RXFE_Pos)) == 0 );	// пока не появится FIFO пуст
		
		UARTx->RSR_ECR = 0x0F;
		
		SetToQueue(RX_EVENT, uart->rxTail, (u32)uart, RX_EVENT);	// первая свободная позиция в буфере и указатель на буфер
		}


Вернуться к началу
 Заголовок сообщения: Re: Регистры RIS и MIS
СообщениеДобавлено: 2017-дек-22 09:08 
Не в сети

Зарегистрирован: 2017-авг-09 12:38
Сообщения: 147
Организация: НПФ "Авангард"
ЧумА писал(а):
Вроде-как MIS это RIS с учетом масок заданных в IMSC. В обработчике прерываний от UART для определения источника мы (давно и успешно) проверяем как-раз MIS.
MODBUS конкретно на 1986 "ещё не делали". Для тех протоколов, что пользуем, time-out формируем способом "что то типа SysTick" :) (таймером ОС-а).
Пример из тела обработчика прерывания UART:
	if ( UARTx->MIS & ((1 << UART_MIS_RXMIS_Pos) | (1 << UART_MIS_RTMIS_Pos)) )
		{
		do
			{
		#ifdef	UART_9_BIT
			uart->RxBuffer[uart->rxTail] = UARTx->DR;		// хвост - сюда пишем
		#else
			uart->RxBuffer[uart->rxTail] = (u8)UARTx->DR;		// хвост - сюда пишем
		#endif
			if(++uart->rxTail == UART_RX_BUF_SIZE)
				uart->rxTail = 0;
		#ifdef UART_RXBUF_ERR
			if(uart->rxTail == uart->rxHead)	// хвост догнал голву
				SoS_Error(UART_RXBUF_ERR, ERR_POSITION);
		#endif
			}
		while( (UARTx->FR & (1 << UART_FR_RXFE_Pos)) == 0 );	// пока не появится FIFO пуст
		
		UARTx->RSR_ECR = 0x0F;
		
		SetToQueue(RX_EVENT, uart->rxTail, (u32)uart, RX_EVENT);	// первая свободная позиция в буфере и указатель на буфер
		}
Я вот сейчас провел эксперимент. Установил разрешение только на прерывание от приемника. Включил FIFO на 1/2. При посылке от 1 до 8 байт ни один флаг прерывания не срабатывает. Для регистра MIS это правильно, поскольку маска стоит только на приемник, а в приемнике кол-во символов еще не достигло половины. Но вот в регистре RIS, по моим понятиям, должен был бы выскочить флаг по таймауту(!), поскольку данные в FIFO появлялись и затем передача прекращалась. Далее я увеличивал кол-во передаваемых символов до 16. Появились флаги прерывания от приемника и в MIS и в RIS. После увеличения количества посылаемых байт более 16 в RIS появляется флаг OERIS прерывание по переполнению буфера. Поскольку в маске такого прерывания нет в регистре MIS этот флаг не возникает. Отсюда я делаю вывод, что регистр RIS должен быть более информативен. Но вот то, что он почему то не отобразил прерывание по таймауту? Далее, включил разрешение прерываний по таймауту. И теперь флаг по таймауту появляется и в RIS и в MIS, даже если посылается один символ, т.е. данные в FIFO не попадают.
И еще одна мысль. Если аппаратно заложен таймаут в 3,5 символа это значит, что разработчики рассчитывали его использовать как разделитель фреймов. Но как это они предполагали делать?
И спасибо за фрагмент кода.


Вернуться к началу
 Заголовок сообщения: Re: Регистры RIS и MIS
СообщениеДобавлено: 2017-дек-22 10:55 
Не в сети

Зарегистрирован: 2017-авг-09 12:38
Сообщения: 147
Организация: НПФ "Авангард"
Похоже нашел решение как использовать аппаратный таймаут для реализации протокола Модбас. Надо установить объем FIFO в 1/8 его полного объема, т.е. прерывания будут возникать при приеме двух байт. Вы заходите в обработчик, считываете только один байт оставляя в буфере еще 1 байт. и т.д. пока не появится прерывание по таймауту.


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

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


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

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


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

Перейти: 

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