Полная версия этой страницы:
FIFO в LPC2138
Вот пытаюсь зделать прерывание по приему 8 байт на УАПП0 включил FIFO настроил вроде но все равно вызывается прерывание только когда принелось 14 байт не знает что такое может быть ума не приложу !
вот инит какой
/ Setup UART interrupt
void InitUART0Interrupt(void)
{
// Setup uart1 callback functions.
// uart0rx_function = uart0rx_func;
// uart0tx_function = uart0tx_func;
VICIntSelect &= ~VIC_UART0_bit; // IRQ on UART0.
VICVectAddr15 = (unsigned int)&UART0Interrupt;
VICVectCntl15 = 0x20 | VIC_UART0; // Enable vector interrupt for UART0.
VICIntEnable |= VIC_UART0_bit; // Enable UART 0 interrupt.
U0IER=1;
}
/**** UART0 ****/
void UART0Initialize(unsigned int baud)
{
unsigned int divisor = peripheralClockFrequency() / (16 * baud);
//set Line Control Register (8 bit, 1 stop bit, no parity, enable DLAB)
U0LCR_bit.WLS = 0x3; //8 bit
U0LCR_bit.SBS = 0x0; //1 stop bit
U0LCR_bit.PE = 0x0; //no parity
U0LCR_bit.DLAB = 0x1; //enable DLAB
//with one row
// U0LCR = 0x83;
//devisor
U0DLL = divisor & 0xFF;
U0DLM = (divisor >> 8) & 0xFF;
U0LCR &= ~0x80;
//set functionalite to pins: port0.0 -> TX0, port0.1 -> RXD0
PINSEL0_bit.P0_0 = 0x1;
PINSEL0_bit.P0_1 = 0x1;
U0FCR_bit.RTLS=0x01;
U0FCR_bit.FCRFE=1;
U0FCR_bit.RFR=1;
U0FCR_bit.TFR=1;
//with one row
//PINSEL0 = PINSEL0 & ~0xF | 0x5;
}
вот работающий код
static void LpcUsartIsr(void) { // Прерывание.
INT8U cTemp;
INT8U cByte;
OS_CPU_SR cpu_sr;
OS_ENTER_CRITICAL();
cTemp = USART_IIR;
if(!(cTemp & 0x01)){
switch(cTemp&0x0E){
case RLS: { // line status.
cTemp = USART_LSR;
if(cTemp & ULSR_PE)
nComError |= COM_PEERR;
if(cTemp & ULSR_FR)
nComError |= COM_FRERR;
if(cTemp & ULSR_OR)
nComError |= COM_ORERR;
if(cTemp & ULSR_BI)
nComError |= COM_BIERR;
if(((cTemp & ULSR_RDR)|(cTemp & ULSR_RXFE)) == 0x00){
break;
}
}
case RDA: { // Read Data Avaliable.
cByte = USART_RHR;
LpcUsartRxComplete(cByte);
break;
}
case CTI: { // timeout - fifo enabled
cByte = USART_RHR;
LpcUsartRxComplete(cByte);
if (!(USART_LSR & 1)) LpcUsartTimeout(); // all fifo read
break;
}
case THRE: { // transmit empty.
LpcUsartTxReady();
break;
}
}
}
else{
}
VICVectAddr = 0;
OS_EXIT_CRITICAL();
}
нет вроде с самим обработчиком все в поряде а вот насчет инициализатции не уверен
можете привести инит с прерыванием по приему 8 байт
Зарание благодарен !
у вас только 1 прерывание срабатывает... надо разрешать CTI и RDA, точно номера битов не помню.. даташита под рукой нет..
типа такого..
U0IER=CTI+RDA;
инициализация у меня просто по всему файлу здоровому раскидана... вырезать замучаюсь, да еще все регистры передефайнены..
инициализация у меня просто по всему файлу здоровому раскидана... вырезать замучаюсь, да еще все регистры передефайнены..
Простите но в регистре U0IER нет битов CTI и RDA там есть только биты RDAIE, THREIE и RXLSIE. А биты CTI и RDA есть в регистре U0IIR но он доступен тольк для чтения !
или я чтото не понемаю !
Прочитайте ERRATA SHEET ver. 1.4! В связи с некоторыми глюками в UART LPC2138, в НЕКОТОРЫХ случаях рекомендуется только побайтное считывание из UART!
точно, таких битов там нет =)) я ошибся.. разрешите прерывания RXLSIE, RDAIE и поставьте на rx мой обработчик.. у меня работает.. кстати, еще прикол.. при включенном фифо у меня не работает аппаратный таймаут..
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.