|
Непонятное поведение RS485-UART1 |
|
|
|
May 26 2008, 19:30
|
Частый гость
 
Группа: Свой
Сообщений: 131
Регистрация: 22-03-05
Из: Краснодар
Пользователь №: 3 600

|
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» такое ощущение, что нарушается синхронизация при приеме первых байтов.
|
|
|
|
|
 |
Ответов
|
Sep 4 2008, 11:11
|
Участник

Группа: Свой
Сообщений: 54
Регистрация: 25-11-04
Из: Тула
Пользователь №: 1 228

|
Мусор может появляться если выходы драйвера ни куда не подтянуты: "прямой" должен быть подтянут к "+", "инверсный" к земле.
|
|
|
|
|
Sep 4 2008, 11:29
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(HEX @ Sep 4 2008, 14:11)  Мусор может появляться если выходы драйвера ни куда не подтянуты: "прямой" должен быть подтянут к "+", "инверсный" к земле. Это классическое левое решение типа конденсатора на выводах ТТЛ-логики. И не объясняет искажения символов внутри посылки. В данном случае осциллограф - лучший друг программиста, и если он показал отличие данных в линии от принятых, то ясно, что контроллер неправильно принимает, то есть ничего не ясно.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Sep 4 2008, 12:13
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(aaarrr @ Sep 4 2008, 14:42)  Это почти нормальное решение. По-хорошему, конечно, протокол верхнего уровня должен игнорировать мусор между посылками, но это не повод испытывать его на прочность, этот мусор специально подсовывая. Осталось третий провод обсудить :-) Как минимум, протокол должен быть. Т.е. время включения и отключения приемопередатчика у мастера и слэйва должны быть определены и соответствовать друг другу. Цитата(aaarrr @ Sep 4 2008, 14:42)  Внутри посылки ничего не искажается. Тогда я ничего не понимаю. Автор в первом посте пишет... 5501160800000000000000000000E0AA(HEX) на приемник LPC2138 приходит 55408B0800000000000000000000E0AA00, Последний нуль можно списать на дефекты реализации протокола, а искажения после 55 - на что?
--------------------
Уходя, оставьте свет...
|
|
|
|
Сообщений в этой теме
srg_co Непонятное поведение RS485-UART1 May 26 2008, 19:30 sensor_ua Неясно где и как идёт переключение, есть/нужны ли ... May 26 2008, 20:31 Altemir У меня работа по RS485 на UART1 реализована так:
... May 26 2008, 20:49 srg_co Цитата(sensor_ua @ May 27 2008, 00:31) Не... May 27 2008, 07:13    aaarrr Цитата(Dog Pawlowa @ Sep 4 2008, 16:13) Т... Sep 4 2008, 12:26     srg_co Тема ожила !
ЦитатаКак минимум, протокол долж... Sep 4 2008, 19:11 evgn А проверьте baud rate и вообще все настройки uart-... Sep 5 2008, 05:09 IEC Цитата(evgn @ Sep 5 2008, 09:09) А провер... Sep 5 2008, 07:43 srg_co На всех 38400, кварц 14,7456M, ошибка = 0. Sep 5 2008, 05:44 Dog Pawlowa Цитата(srg_co @ Sep 5 2008, 08:44) На все... Sep 5 2008, 05:59 vesago Действительно ли в конце происходит прерывание и и... Sep 5 2008, 07:51 srg_co Цитата(vesago @ Sep 5 2008, 11:51) Если у... Sep 5 2008, 08:18 vesago Полудуплексный это понятно. Я пользую алм485 и во ... Sep 5 2008, 09:22
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|