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

 
 
> LPC21xx. Криво принимаются данные по UART.
by-pass
сообщение Sep 19 2005, 09:53
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 13-09-05
Пользователь №: 8 518



LPC2129
Прерывания возникают нормально.
Если отправлять по одному байту то все хорошо(каждую мс.).
Но если отправитьт несколько подряд(без задержек) то U0RBR хранится только последний байт.
Такое ощущение что буфер не заполняется.

Если настроить прерывания после каждого байта, то все равно, принимается только последний из очереди, и прерывание генерируется только одни раз.


Код
void UART0Init(U16 baud)
{
 U16 divisor = getperipheralClockFreq() / (16 * baud);

 U0FCR_bit.FCRFE = 1;
 U0FCR_bit.RFR = 1;  
 U0FCR_bit.TFR = 1;  
 U0FCR_bit.RTLS = 2;

 U0LCR_bit.WLS=3;  //8 bits
 U0LCR_bit.SBS=1;  //1 stop bit

 U0LCR_bit.DLAB=1; //Enable DLAB                      
 U0DLL = LSB(divisor);
 U0DLM = MSB(divisor);
 U0LCR_bit.DLAB=0; //Disable DLAB                      


 PINSEL0 = PINSEL0 & ~0xF | 0x5;

 // Set Interrupt Enable Register
 U0IER_bit.RDAIE =1;  //(Receive Data Interrupt Enable)
}

//////////////////////////////////////////////////////

static void ISR_UART0Interrupt(void)
{
 unsigned char ISR_type,temp;
 while(((ISR_type = U0IIR) & 0x01) == 0)
   {
       switch (ISR_type & 0x0e)
       {
           case 0x02:        //THRE Interrupt.
                break;
           //--------------------------------------
           case 0x04:        //Receive Data Available (RDA)
               while( (U0LSR&0x01) == 1 )    //Вот тут всегда хранится один, последний байт из посылки
                   UART_PutChar(0, U0RBR+1);    //а по идее должны бытьт данные из буфера
               A_LED1_OFF;
               A_LED2_ON;
               break;
           //--------------------------------------
           case 0x06:        //Receive Line Status (RLS)
               temp = U0LSR;
               A_LED2_ON;
               A_LED1_ON;
               break;
           //--------------------------------------
           case 0x0c:        // по таймауту //Character Time-out Indicator (CTI)
               A_LED2_OFF;
               A_LED1_ON;
               while( (U0LSR&0x01) == 1 ) //тоже самое. всегда один байт
                   UART_PutChar(0, U0RBR-1);
               break;
           //--------------------------------------
           default :
               break;
           //--------------------------------------
       }
   }
}
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 16:50
Рейтинг@Mail.ru


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