Здравствуйте!
Работает прерывание приёма и опустошения регистра передачи. Очень хочется, чтобы было прерывание и по окончании передачи.
Ниже обработчик прерывания
CODE
#define RBR_Interrupt_Enable (1<< 0)
#define THRE_Interrupt_Enable (1<< 1)
#define LS_Interrupt_Enable (1<< 2)
#define Receive_Line_Status 6
#define Receive_Data_Available 4
#define Character_TimeOut_Indicator 0x0C
#define THRE_Interrupt 2
#define msk_ULSR_Errors 0x9E
void UART0VectoredIRQ (void) __irq
{
char
Msg,
dummy;
if(((Msg = U0IIR) & 0x01) == 0) // Flag Status of RX Int
{
switch(Msg & 0x0E) // Filter Msg
{
case Receive_Line_Status:
if (IOPIN & LED_G)
LEDS_ON = LED_G;
else
LEDS_OFF = LED_G;
if (U0LSR & msk_ULSR_Errors)
break;
else
if ((RTS0) && (U0LSR & (1<< TEMP))) // Transmition Finish
{
// Run Tx handler
/* if (IOPIN & LED_G)
LEDS_ON = LED_G;
else
LEDS_OFF = LED_G; */
U0IER = RBR_Interrupt_Enable | LS_Interrupt_Enable;
RTS0 = 0;
break;
}
case Receive_Data_Available:
RTS0 = 1;
U0IER = THRE_Interrupt_Enable;
U0THR = U0RBR + 3;
/* if (IOPIN & LED_G)
LEDS_ON = LED_G;
else
LEDS_OFF = LED_G; */
break;
case THRE_Interrupt:
if (IOPIN & LED_G)
LEDS_ON = LED_G;
else
LEDS_OFF = LED_G;
U0IER = LS_Interrupt_Enable;
/*
if (RTS0) // Transmition
if (amount_SIO0--)
U0THR = *ptr_SIO0++;
else
dummy = U0LSR; */
break;
default:
break;
}
}
VICVectAddr = 1;// Dummy write to signal end of interrupt
}
Программа должна возвращать один байт на один байт запроса. Как я себе представляю, при обработке прерывания опустошения регистра передачи, включается прерывание "состояние линии" (LS_Interrupt_Enable). Когда произойдёт это прерывание, отследить в регистре состояния линии (LSR) бит TransmitterEmpty(TEMT). Однако, управление не переходит на Receive_Line_Status
Что не так?
Сообщение отредактировал IgorKossak - Mar 12 2015, 18:30
Причина редактирования: [codebox] для длинного кода, [code] - для короткого