реклама на сайте
подробности

 
 
> LPC2148 UART: Постоянный вызов прерывания CTI
ivstech
сообщение Sep 2 2008, 07:43
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 204
Регистрация: 5-01-06
Пользователь №: 12 860



Иногда UART переходит в такое состояние, что вызывается прерывание CTI (U1IIR=0b11001100). Если в обработчике прочитать U1LSR, то там хранится значение 0x60, т.е. младший бит (RDR)=0, якобы в FIFO данных нет. Если не прочитать U1RBR, прерывание вызовется снова. Получется, фрагмент обработчика должен быть такого вида:

Код
   case IIR_CTI:
     for(;;)
     {
       temp = rU1LSR;

       data=rU1RBR; // изначально чтение U1RBR было ниже

       // Если данных нет (RDR=0), выходим
       if ((temp&0x11)==0)
         break;

       //data=rU1RBR; // <- здесь

       // Если ошибка, продолжаем цикл без обработки принятых данных
       if (temp&(7<<2)) // PE,FE,BI
         continue;
       tn_my_queue_isend_polling(&queue,data);
     }


Странно, что в ERRATA про это ни слова, на форумах тоже
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Alex03
сообщение Sep 2 2008, 08:46
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034



Странно...
у меня вполне работает
Код
        case U0IIR_INT_ID_RX_TIMEOUT:   // прерывание по отсутствию данных
        case U0IIR_INT_ID_RDA:          // прерывание по приему

            while(U0LSR & U0LSR_RDR)
            {
                uchar uc = U0RBR;
                ...
            }
            break;

А что в начале/конце обработчика прерывания (главный switch как выглядит)?
И не пользуетесь ли отладчиком для просмотра регистров проца в(от) которых сбрасываются флаги по чтению (тот же UхRBR)?

О! кстати!
Видимо вместо
Код
if ((temp&0x11)==0)
надо
Код
if (!(temp&0x03))
а то и
Код
if (!(temp&0x01))
???
Go to the top of the page
 
+Quote Post
ivstech
сообщение Sep 2 2008, 09:21
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 204
Регистрация: 5-01-06
Пользователь №: 12 860



Цитата(Alex03 @ Sep 2 2008, 14:46) *
Странно...
у меня вполне работает
Код
        case U0IIR_INT_ID_RX_TIMEOUT:   // прерывание по отсутствию данных
        case U0IIR_INT_ID_RDA:          // прерывание по приему

            while(U0LSR & U0LSR_RDR)
            {
                uchar uc = U0RBR;
                ...
            }
            break;


Сначала у меня стояла такая же проверка как у Вас. Потом обнаружилось, что иногда бывает включен бит Break interrupt, а RDR - нет. И нужно считать U1RBR, иначе обработчик постоянно вызывается.

Цитата(Alex03 @ Sep 2 2008, 14:46) *
А что в начале/конце обработчика прерывания (главный switch как выглядит)?
И не пользуетесь ли отладчиком для просмотра регистров проца в(от) которых сбрасываются флаги по чтению (тот же UхRBR)?


Код
void tn_uart1_int_func(void)
{
   volatile char temp;
   char data;
   int i;
   int rc;
   temp=rU1IIR;
   switch((temp>>1)&0x7) //-- and clear int source
   {

       ....

   }

   VICVectAddr = 0xFF;
}

В отладчике окно с регистрами закрыто. Обычно такой глюк происходит при отладке при перезапуске программы. Помогает только выключение питания. Код инициализации (со сбросом FIFO). Может, проблема именно в сбросе FIFO при старте? Попробую это отключить

Код
//---- pinout -----
  rPINSEL0.....

  ...

  //-- enable access to divisor latch regs
  rU1LCR = LCR_ENABLE_LATCH_ACCESS;
  //-- set divisor for desired baud
  rU1DLM = 0;
  rU1DLL = 32; // 32;    // (60'000'000)/(16*115200)  = 32

  //-- disable access to divisor latch regs (enable access to xmit/rcv fifos
  //-- and int enable regs)
  rU1LCR = LCR_DISABLE_LATCH_ACCESS;

  //-- Enable UART1 rx interrupts
  rU1IER = 0x0F;  //-- Enable int
  //-- setup line control reg - disable break transmittion, even parity,
  //-- 1 stop bit, 8 bit chars
  rU1LCR = 0x03; // нет четности
  rU1FCR = (0x03<<6) | 7;  //-- Int Trigger - 14 bytes, Enable FIFO,Reset Tx FIFO & Rx FIFO

  // DTR не используется
  // AutoCTS=1, AutoRTS=1
  rU1MCR = (3<<6)|3;
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st August 2025 - 23:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.01364 секунд с 7
ELECTRONIX ©2004-2016