Иногда 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 про это ни слова, на форумах тоже