Easyelectronics.ru

Электроника для всех
Текущее время: 21 июн 2018, 23:08

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



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

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

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

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


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

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

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


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

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


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

Сейчас этот форум просматривают: shalfey


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

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

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