Код: Выделить всё
void UART0_IRQHandler (void)
{
uint8_t IIRValue, LSRValue;
uint8_t Dummy = Dummy;
IIRValue = LPC_UART0->IIR;
IIRValue >>= 1;
IIRValue &= 0x07;
if ( IIRValue == IIR_RLS )
{
LSRValue = LPC_UART0->LSR;
if ( LSRValue & (LSR_OE|LSR_PE|LSR_FE|LSR_RXFE|LSR_BI) )
{
UART0_Status = LSRValue;
Dummy = LPC_UART0->RBR;
return;
}
if ( LSRValue & LSR_RDR )
{
buff_PutChar(0,LPC_UART0->RBR);
}
}
else if ( IIRValue == IIR_RDA )
{
buff_PutChar(0,LPC_UART0->RBR);
}
else if ( IIRValue == IIR_CTI )
{
UART0_Status |= 0x100;
}
else if ( IIRValue == IIR_THRE )
{
LSRValue = LPC_UART0->LSR;
if (UART0_tx_rd_index<UART0_tx_counter)
LPC_UART0->THR = UART0_tx_Buffer[UART0_tx_rd_index++];//Передаем
else
{
UART0_tx_rd_index=0;
UART0_tx_counter=0;
rs485C0_RX;
// LPC_UART0->IER = IER_THRE | IER_RLS | IER_RBR; // Re-enable RBR
}
}
}Отсылка пакета
Здесь я запускаю процедуру отсылки - при каждом прерывании о том что байт отправлен - из прерывания отправляется следующий байт - и так до конца пакета
Код: Выделить всё
void RS485_StartTX(uint8_t PortNum)
{
// LPC_UART0->IER = IER_THRE | IER_RLS; //Disable RBR
rs485C0_TX;
UART0_tx_rd_index=0;
LPC_UART0->THR=UART0_tx_Buffer[UART0_tx_rd_index++];
}Перекопал кучу сайтов на эту тему и даже на NXP был (надо кстати туда тоже этот вопрос написать) -
не только у меня подобная проблема - люди тоже бьются с этими Уартами аля RS485
но пока ничего существенного так и не нашли - есть конечно одна мысль - но надо ее проверить).
