Перейти к содержанию
    

RS485 на LPC2366

Кажется простейшая задача, которую когда-то легко и просто решалась на 51-х процессорах, с LPC поставила меня в тупик.

Проблема состоит в том, чтобы вычислить момент переключения полудуплексный приемо-передатчик RS485 в режим приема после окончания передачи.

 

Попробую описать упрощенно алгоритм работы:

 

1. Включаю режим передачи микросхемы RS485

	    TxEnable();

 

2. Заполняю буфер FIFO передатчика данными, но не более 16-ти:

            RemainDataCount -= byCount; //Запоминаем количество еще не переданных данных
           while (byCount)
           {
               U2THR = *lpData++;
               byCount--;
           } //while

 

3. В обработчике прерывания обрабатываю THE прерывание:

            BYTE IIRValue = U2IIR;
           if((IIRValue & 0x0E) == 2)
    {
    	// ПЕРЕДАЮЩИЙ БУФЕР ПУСТ
       	DWORD dwLSRValue = U2LSR;		/* Check status in the LSR to see if valid data in U0THR or not */
        if (dwLSRValue & 0x20)
                   DataSent(); //Отправляем следующий байт
           }

 

4. Анализирую количество оставшихся данных на передачу и подгружаю следующий 1 байт на передачу или завершаю передачу

	    DataSent()
    {
        if (RemainDataCount != 0)
        {
            U2THR = *lpData++;
            RemainDataCount--;
        }
        else
        {
            while(!(U2LSR & 0x40)); //Дожидаюсь когда же опустеет передатчик (U2THR и U2TSR пусты)
            DisableTx(); //Выключаю приемопередатчик RS485
        }
    }

 

Так вот, теперь о проблеме. Если закомментировать DisableTx() и пройтись по шагам, то все передается нормально, но если запустить вышеприведенный код, то посылка обрезается.

Что я делаю не так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не особо силен в LPC, но предполагаю что проблема в том, что передатчик выключается по событию "Регистр данных свободен", а не "Байт отправлен"(аналоги в AVR UDREI и TXCEI)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну незнай, у меня на LPC1768 это срабатывает:

 

while(!U1LSR_bit.TEMT);//    подождать окончания передачи

 

правда я передатчик не выключаю, а только перевожу драйвер на прием.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может в подобной ситуации это поможет:

попадался на том, что в Silabе прерывание при передаче возникало не в момент полной отправки байта, а в момент, когда в сдвиговый регистр из буферного загружался байт. Это собственно приводило к обрезке последнего байта, если сразу же в прерывании переключать драйвер 485. Посему, передачу надо усложнить введением задержки на пару-тройку времени передачи 1 байта на данной скорости после прерывания на последнем передаваемом байте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...