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

 
 
> RS485 на LPC2366
Yaumen
сообщение Sep 24 2010, 08:01
Сообщение #1


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

Группа: Свой
Сообщений: 187
Регистрация: 22-06-05
Из: Минск, Беларусь
Пользователь №: 6 213



Кажется простейшая задача, которую когда-то легко и просто решалась на 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() и пройтись по шагам, то все передается нормально, но если запустить вышеприведенный код, то посылка обрезается.
Что я делаю не так?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 3)
smalcom
сообщение Sep 24 2010, 09:15
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



Не особо силен в LPC, но предполагаю что проблема в том, что передатчик выключается по событию "Регистр данных свободен", а не "Байт отправлен"(аналоги в AVR UDREI и TXCEI)
Go to the top of the page
 
+Quote Post
M_Andrey
сообщение Sep 24 2010, 15:12
Сообщение #3


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

Группа: Свой
Сообщений: 158
Регистрация: 15-10-07
Из: Й-Ола
Пользователь №: 31 376



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

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

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

Go to the top of the page
 
+Quote Post
firstvald
сообщение Oct 1 2010, 14:43
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 580
Регистрация: 3-06-08
Пользователь №: 38 041



Может в подобной ситуации это поможет:
попадался на том, что в Silabе прерывание при передаче возникало не в момент полной отправки байта, а в момент, когда в сдвиговый регистр из буферного загружался байт. Это собственно приводило к обрезке последнего байта, если сразу же в прерывании переключать драйвер 485. Посему, передачу надо усложнить введением задержки на пару-тройку времени передачи 1 байта на данной скорости после прерывания на последнем передаваемом байте.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 03:44
Рейтинг@Mail.ru


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