ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
24 ноября
39399 Топик полностью
by-pass (19.09.2005 12:43, просмотров: 1) ответил by-pass на Подскажите где я накосячил? не генерятся прерывания, LPC21, IAR.
И еще вдогонку. Как правильно принимать данные через UART по прерыванию? Прерывания возникают нормально. Если отправлять по одному байту то все хорошо. Но если отправитьт несколько подряд то 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.
                //U0THR = 15;
                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;
            //--------------------------------------
        }
    }
}