MAX487 подключен к UART1-LPC2138, скорость 38400, VPB_CLOCK= 14745600. Передатчик передает 16 байт (пакет) 5501160800000000000000000000E0AA(HEX) на приемник LPC2138 приходит 55408B0800000000000000000000E0AA00, последний байт (00) левый, в лучшем случае из 20 отправленный пакетов приходит 6 правильных. В сети несколько различных устройств на AVR, везде установлена MAX487, они обмениваются с передатчиком нормально.
Код
Инициализация 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;
Мозг кипит, смотрел анализатором принимаемые данные, все правильно

причем кривится только первые байты в пакете, если передать что-то типа 5501160801234567890… данные придут правильно начиная с «01234567890» такое ощущение, что нарушается синхронизация при приеме первых байтов.