Кажется простейшая задача, которую когда-то легко и просто решалась на 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() и пройтись по шагам, то все передается нормально, но если запустить вышеприведенный код, то посылка обрезается.
Что я делаю не так?