Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: RS485 на LPC2366
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Yaumen
Кажется простейшая задача, которую когда-то легко и просто решалась на 51-х процессорах, с LPC поставила меня в тупик.
Проблема состоит в том, чтобы вычислить момент переключения полудуплексный приемо-передатчик RS485 в режим приема после окончания передачи.

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

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


2. Заполняю буфер FIFO передатчика данными, но не более 16-ти:
CODE
RemainDataCount -= byCount; //Запоминаем количество еще не переданных данных
while (byCount)
{
U2THR = *lpData++;
byCount--;
} //while


3. В обработчике прерывания обрабатываю THE прерывание:
CODE
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 байт на передачу или завершаю передачу
CODE
DataSent()
{
if (RemainDataCount != 0)
{
U2THR = *lpData++;
RemainDataCount--;
}
else
{
while(!(U2LSR & 0x40)); //Дожидаюсь когда же опустеет передатчик (U2THR и U2TSR пусты)
DisableTx(); //Выключаю приемопередатчик RS485
}
}


Так вот, теперь о проблеме. Если закомментировать DisableTx() и пройтись по шагам, то все передается нормально, но если запустить вышеприведенный код, то посылка обрезается.
Что я делаю не так?
smalcom
Не особо силен в LPC, но предполагаю что проблема в том, что передатчик выключается по событию "Регистр данных свободен", а не "Байт отправлен"(аналоги в AVR UDREI и TXCEI)
M_Andrey
Ну незнай, у меня на LPC1768 это срабатывает:

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

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

firstvald
Может в подобной ситуации это поможет:
попадался на том, что в Silabе прерывание при передаче возникало не в момент полной отправки байта, а в момент, когда в сдвиговый регистр из буферного загружался байт. Это собственно приводило к обрезке последнего байта, если сразу же в прерывании переключать драйвер 485. Посему, передачу надо усложнить введением задержки на пару-тройку времени передачи 1 байта на данной скорости после прерывания на последнем передаваемом байте.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.