Миландр

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

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




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

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


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

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

Т.е. надо гарантировать, что к концу пакета в FIFO что-то осталось. Во-вторых, вроде в RTU длительность time-out 3,5 символа, т.е. 35 бит.


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

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


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

Зарегистрирован: 2009-сен-21 12:39
Сообщения: 481
Вроде-как 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
Сообщения: 56
ЧумА писал(а):
Вроде-как 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
Сообщения: 56
Похоже нашел решение как использовать аппаратный таймаут для реализации протокола Модбас. Надо установить объем FIFO в 1/8 его полного объема, т.е. прерывания будут возникать при приеме двух байт. Вы заходите в обработчик, считываете только один байт оставляя в буфере еще 1 байт. и т.д. пока не появится прерывание по таймауту.


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

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


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

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


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

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