Код
Инициализация UART1:
//UART1 - 38400 - RS485
PINSEL0 |= 0x00050000; //Enable RxD and TxD pins
U1LCR = 0x83; //8 bits, no Parity, 1 Stop bit
U1DLL = (VPB_CLOCK/16/BAUD_RATE1) & 0xFF; //Setup Baudrate
U1DLM = ((VPB_CLOCK/16/BAUD_RATE1) >> 8) & 0xFF;
U1LCR = 0x03; //DLAB = 0
U1FCR = 0x07; // Разрешение работы и сброс TX and RX FIFO, граница - 1 байт
//настройка прерывания UART1
VICVectAddr7 = (unsigned long)uart1_interrupt; //прерывание на 7 векторе
VICVectCntl7 = 0x20 | 0x07;
VICIntEnable |= 0x00000080; //включить прерывание от UART1
U1IER = IER_RBR | IER_THRE;
Обработка прерываний:
IIRValue = U1IIR;
IIRValue = (IIRValue & 0x0E) >> 1; // Выделяем информацию об источнике прерывания
if ( IIRValue == 0x03 ) {
//Изменился статус приемной линии
//сбросим времени счетчик последнего обмена
LSRValue = U1LSR;
if ( LSRValue & (LSR_OE|LSR_PE|LSR_FE|LSR_RXFE|LSR_BI) ) {
//Пустое чтения для сброса флага прерывания
Dummy = U1RBR;
VICVectAddr = 0;
return;
}
if ( LSRValue & LSR_RDR ) {
// В FIFO остаются не прочитанные данные
RBRValue = U1RBR;
RecvByte( RBRValue );
if ( DebugMode == 2 )
PutStr( PrintNumb( HEX, 2, FALSE, '0', RBRValue ) );
if ( RBRValue == 0xaa )
PutStr( CrLf );
}
}
if ( IIRValue == IIR_RDA ) {
//Принят новый байт данных и достигнута граница тригера
//количества принятых байт в FIFO
//сбросим времени счетчик последнего обмена
//данные приняты
FlgRecv = 1;
RBRValue = U1RBR;
RecvByte( RBRValue );
if ( DebugMode == 2 )
PutStr( PrintNumb( HEX, 2, FALSE, '0', RBRValue ) );
if ( RBRValue == 0xaa )
PutStr( CrLf );
}
if ( IIRValue == IIR_THRE ) {
//Прочитаем статус и убедимся, что действительно THR пуст
LSRValue = U1LSR;
if ( LSRValue & LSR_THRE ) {
//буфер передачи пуст
if ( SendByte( &ch ) )
U1THR = ch;
}
}
//сброс прерывания
VICVectAddr = 0;
//UART1 - 38400 - RS485
PINSEL0 |= 0x00050000; //Enable RxD and TxD pins
U1LCR = 0x83; //8 bits, no Parity, 1 Stop bit
U1DLL = (VPB_CLOCK/16/BAUD_RATE1) & 0xFF; //Setup Baudrate
U1DLM = ((VPB_CLOCK/16/BAUD_RATE1) >> 8) & 0xFF;
U1LCR = 0x03; //DLAB = 0
U1FCR = 0x07; // Разрешение работы и сброс TX and RX FIFO, граница - 1 байт
//настройка прерывания UART1
VICVectAddr7 = (unsigned long)uart1_interrupt; //прерывание на 7 векторе
VICVectCntl7 = 0x20 | 0x07;
VICIntEnable |= 0x00000080; //включить прерывание от UART1
U1IER = IER_RBR | IER_THRE;
Обработка прерываний:
IIRValue = U1IIR;
IIRValue = (IIRValue & 0x0E) >> 1; // Выделяем информацию об источнике прерывания
if ( IIRValue == 0x03 ) {
//Изменился статус приемной линии
//сбросим времени счетчик последнего обмена
LSRValue = U1LSR;
if ( LSRValue & (LSR_OE|LSR_PE|LSR_FE|LSR_RXFE|LSR_BI) ) {
//Пустое чтения для сброса флага прерывания
Dummy = U1RBR;
VICVectAddr = 0;
return;
}
if ( LSRValue & LSR_RDR ) {
// В FIFO остаются не прочитанные данные
RBRValue = U1RBR;
RecvByte( RBRValue );
if ( DebugMode == 2 )
PutStr( PrintNumb( HEX, 2, FALSE, '0', RBRValue ) );
if ( RBRValue == 0xaa )
PutStr( CrLf );
}
}
if ( IIRValue == IIR_RDA ) {
//Принят новый байт данных и достигнута граница тригера
//количества принятых байт в FIFO
//сбросим времени счетчик последнего обмена
//данные приняты
FlgRecv = 1;
RBRValue = U1RBR;
RecvByte( RBRValue );
if ( DebugMode == 2 )
PutStr( PrintNumb( HEX, 2, FALSE, '0', RBRValue ) );
if ( RBRValue == 0xaa )
PutStr( CrLf );
}
if ( IIRValue == IIR_THRE ) {
//Прочитаем статус и убедимся, что действительно THR пуст
LSRValue = U1LSR;
if ( LSRValue & LSR_THRE ) {
//буфер передачи пуст
if ( SendByte( &ch ) )
U1THR = ch;
}
}
//сброс прерывания
VICVectAddr = 0;
Мозг кипит, смотрел анализатором принимаемые данные, все правильно

