Вопрос по UART0 у LPC2138 Принимаю данные по UART0 на скорости 250к, при приходе байта возникает прерывание , где я смотрю не битый ли фрейм пришел (проверяю флажок FE)и записываю принятый байт в переменную curbyte
Вот пример конфигурациии прерывания
U0IER = 0x00; // disable all interrupts
PINSEL0_bit.P0_1 = 1;// RXD0 input
U0LCR_bit.DLAB = 1; //enable DLAB
U0LCR_bit.WLS = 3; //8 bit
U0LCR_bit.SBS = 0; //1 stop bit
U0LCR_bit.PE = 0; //no parity
divisor=3; // 250k, frequence VPB 12 MHz
U0DLM = divisor/256; //highbyte
U0DLL = divisor%256 ; //lowbyte
U0LCR_bit.DLAB = 0; //disable DLAB
U0FCR=0xC1; // 14 characters FIFO and enable the FIFO's
U0IER_bit.RDAIE =1 ; Interrupt enable
Вот сам обработчик прерывания
void UART0Interrupt(void)
{
intoccursuart=1;
if(U0LSR_bit.FE > 0) //Yes--> framing error
{//2
fe_flag=1;
badbyte=U0RBR;
}//2
else {//2
curbyte=U0RBR;
}//2
}
1).Все работает нормально, но если я делаю буфер FIFO меньше чем 14 байт все перестает работать
U0FCR=0xC1; // 14 characters FIFO and enable the FIFO's
2). Если я переношу обработку полученного байта в основную программу, а в прерывании устанавливаю только флаг intoccursuart=1; то все перестает работать. Хотя какая казалось бы разница где считывать регистр U0RBR в прерывании или в основной программе.
т.е. программа выглядит так:
main()
.......
while
{
if (intoccursuart==1) {//1
intoccursuart=0;
if(U0LSR_bit.FE > 0) //Yes--> framing error
{//2
fe_flag=1;
badbyte=U0RBR;
}//2
else {//2
curbyte=U0RBR;
// U0FCR_bit.RFR = 1; //RESET FIFO
}//2
}//1
}
в прерывании устанавливается только флажок intoccursuart=1;
Эта программа раньше работала на mega16 никаких проблем не было мега все успевала обрабатывать.