Цитата(HEX @ May 22 2008, 22:45)

Чего-то не приходят прерывания CTI от uart (работаю с uart0), если размер посылки >= RxFIFITrigerLevel. Если размер < все нормально. Модуль работы с uart перенес с lpc2292 там все работало. Попадалось сообщение в конфе про глюк в uart lpc2138, ни чего подробно не нашел. Искать у себя или проц такой? пожалуйста кто использует lpc213x отзовитесь.
Инициализация:
Код
#define RxFIFOTrigger8 0x80
...
{
Word W;
//Line control register
U0LCR = ByteSize + StopBits + Parity;
//BaudRate
W = Fvpb/16/BaudRate;
U0LCR = U0LCR | DivisorLatchAccessBit;
U0DLM = Hi(W);
U0DLL = Lo(W);
U0LCR = U0LCR & (~DivisorLatchAccessBit);
//FIFO
U0FCR = RxFIFORstFlag + TxFIFORstFlag;
U0FCR = FIFOEnableFlag + RxFIFOTrigger;
// Set Interrupt Enable Register
U0IER = RBRInterruptEnable + RLSInterruptEnable;
//Инициализация вектора прерываний
VICProtection = 0x00;
//Установка вектора прерывания
VICIntSelect &= ~(1<<VIC_UART0);
VICVectAddr6 = (unsigned long)&IRQHandler;
VICVectCntl6 = 0x20|VIC_UART0;
VICIntEnable = VICIntEnable|(1<<VIC_UART0);
VICProtection = 0x01;
}
Обработчик прерывания:
Код
{
Byte B;
Byte Src;
int i;
do {
Src = U0IIR;
switch(Src & InterruptIDMask) {
case RLSInterruptID: {
DoOnRLSEvent(U0LSR);
break;
}
case RDAInterruptID: {
while ((U0LSR & ReceiverDataReady) != 0)
FInQueue.Put(U0RBR);
break;
}
case CTIInterruptID: {
while ((U0LSR & ReceiverDataReady) != 0)
FInQueue.Put(U0RBR);
DoOnCTIEvent();
break;
}
case THREInterruptID: {
i = TxFIFODepth;
do
{
if (FOutQueue.Get(&B)) {
U0THR = B;
}
else {
U0IER = U0IER & (~THREInterruptEnable);
break;
}
i = i - 1;
}
while(i != 0);
break;
}
}
}
while((Src & IntPendingFlag) == 0);
В LPC213x нужно обрабатывать прерывание наличие данных в буфере FIFO
оно срабатывает если количество принятых данных равно установленому в настройке тригера FIFO.
Прерывание CTI будет свормировано при количестве данных меньше установленого тригера FIFO с задержкой.
switch(U0IIR&0x0F)
{
case 0xC: //Character time out indicator interrupt (CTI)
case 0x4: //Receive data available
//обрабатываем полученые данные
break;
case 0x2: //THRE interrupt
break;
case 0x0: //Modem interrupt
case 0x6: //Receive line status interrupt (RDA)
default:
break;
}