реклама на сайте
подробности

 
 
> Непонятное поведение RS485-UART1
srg_co
сообщение May 26 2008, 19:30
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 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;


Мозг кипит, смотрел анализатором принимаемые данные, все правильно sad.gif причем кривится только первые байты в пакете, если передать что-то типа 5501160801234567890… данные придут правильно начиная с «01234567890» такое ощущение, что нарушается синхронизация при приеме первых байтов. help.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
evgn
сообщение Sep 5 2008, 05:09
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 4-10-06
Пользователь №: 20 954



А проверьте baud rate и вообще все настройки uart-ов передатчика и приемников... Когда я начинал работу с rs485 была такая проблема с немного отличающимися настройками по baud rate у разных устройств, в результате приходит стабильно повторяющаяся ошибка на некоторых байтах. Можно кстати проверить, послав Ваш пакет наоборот.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
- - HEX   Мусор может появляться если выходы драйвера ни куд...   Sep 4 2008, 11:11
|- - Dog Pawlowa   Цитата(HEX @ Sep 4 2008, 14:11) Мусор мож...   Sep 4 2008, 11:29
|- - aaarrr   Цитата(Dog Pawlowa @ Sep 4 2008, 15:29) Э...   Sep 4 2008, 11:42
|- - Dog Pawlowa   Цитата(aaarrr @ Sep 4 2008, 14:42) Это по...   Sep 4 2008, 12:13
|- - aaarrr   Цитата(Dog Pawlowa @ Sep 4 2008, 16:13) Т...   Sep 4 2008, 12:26
|- - srg_co   Тема ожила ! ЦитатаКак минимум, протокол долж...   Sep 4 2008, 19:11
|- - 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 15:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.01376 секунд с 7
ELECTRONIX ©2004-2016