Easyelectronics.ru

Электроника для всех
Текущее время: 19 сен 2018, 04:42

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



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин комплектующих.

Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Сбои в работе UART на C8051F580
СообщениеДобавлено: 11 май 2018, 18:51 
Старожил
Аватара пользователя

Зарегистрирован: 28 сен 2012, 22:11
Сообщения: 328
Откуда: г.Таганрог/г.Геленджик/г.Одесса
Всем привет. Пишу программу для C8051F580. Девайс работает по Ethernet через микруху Wiznet и связывается с другим девайсом по UART. Точнее даже не связывается, а тупо пробрасывает пакеты с определенными адресами по пути UART->Ethernet | Ethernet->UART. Работает все это дело на MODBUS RTU. Данные в UART попадают через преобразователь RS485->UART. В процессе отладки обнаружился странный баг. Сначала проброска пакетов работает нормально, но в какой-то определенный момент (рандомный) вместо данных, отправляемых девайсу по UART, он выдает пакет забитый одним и тем же байтом (байт встречается в пакете). Т.е. вместо 11 03 01 05 12 34 56 78 приходит что-то вроде 03 03 03 03 03 03 03 03. Причем длина равна длине пакета, принятого по UART. Судя по данным отладчика именно буфер приема UART забит такой фигней. И она больше не меняется, что бы ни приходило в UART. Меняется только длина пакета. Помогает только перезапуск МК.

Работа с UART сделана так:
Код:
volatile uint8_t xdata UART_RxBuffer[110], UART_TXBuffer[110];
volatile uint8_t xdata UART_RXBuffer_Size, UART_TXBuffer_Size, UART_Tx_Index = 0;

void UART0_ISR() interrupt INTERRUPT_UART0
{
   ET2 = 0;
   
    if (RI0 == 1)
   {
       RI0 = 0;                         

        data_wait = 0;
      
        UART_RxBuffer[UART_RXBuffer_Size] =SBUF0;

        UART_RXBuffer_Size ++;

        UART_Rx_Ready = 1;      
   }

   if (TI0 == 1)                     
   {
      TI0 = 0;                       

        if(UART_Tx_Index < UART_TXBuffer_Size){
            SBUF0 = UART_TXBuffer[UART_Tx_Index++]; 
         }else{
            UART_Tx_Index = 0;         
         }
   }
   
    ET2 = 1;
}


Обработка пакета выполняется по истечении счетчика data_wait
Код:
void TIM2_ISR() interrupt INTERRUPT_TIMER2
{
   if(data_wait == 10){
      if(UART_Rx_Ready == 1){
         UART_Rx_Ready = 2;
      }else{
         UART_RXBuffer_Size = 0;
      }
   }
   
   if(data_wait < 11){
      data_wait ++;
   }


Далее по флагу в главном цикле выполняется следующее:

Код:
      
if(UART_Rx_Ready == 2){
UART_Rx_Ready = 0;

FROM_UART_TO_LAN(UART_RxBuffer, UART_RXBuffer_Size, LAN);

UART_RXBuffer_Size = 0;
}


Собственно, никак не могу понять, в чем причина. Вроде как все предельно просто сделано. К приемному буферу больше нигде обращения нет, только в прерывании UART и главном цикле. Ошибка возникает не систематически. Могут пройти 10000 пакетов, а может всего 2000. Какие могут быть причины?

_________________
Количество полученного опыта прямо пропорционально выведенному из строя оборудованию....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сбои в работе UART на C8051F580
СообщениеДобавлено: 14 май 2018, 11:12 
Старожил
Аватара пользователя

Зарегистрирован: 28 сен 2012, 22:11
Сообщения: 328
Откуда: г.Таганрог/г.Геленджик/г.Одесса
Нашел еще один баг. На плате есть два Ethernet (работает только один из них, не одновременно). Для того, чтобы знать, откуда пришел пакет завел переменную, в которую запивается 0, 1 или 2. Записывается оно туда либо по приему данных, либо по закрытию сокета. Баг заключался в том, что при приеме из UART пакета, больше определенной длины, в переменной оказывалось значение 5. Откуда оно там бралось - загадка. Перемещение переменной из xdata ничего не дало. А вот стоило переименовать переменную, как все заработало, как надо. Причем повторилось это на двух платах. Как такое вообще может быть?

_________________
Количество полученного опыта прямо пропорционально выведенному из строя оборудованию....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сбои в работе UART на C8051F580
СообщениеДобавлено: 22 май 2018, 15:02 
Старожил
Аватара пользователя

Зарегистрирован: 28 сен 2012, 22:11
Сообщения: 328
Откуда: г.Таганрог/г.Геленджик/г.Одесса
Пока все так же непонятно. Выяснилось лишь то, что проблему решает повторная настройка UART. Т.е. начала приниматься чушь -> прописываем настройки UART -> все начинает работать. Т.е. проблема не в буфере, а в самом UART...

_________________
Количество полученного опыта прямо пропорционально выведенному из строя оборудованию....


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

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


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

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


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

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB