Yaumen 0 24 сентября, 2010 Опубликовано 24 сентября, 2010 · Жалоба Кажется простейшая задача, которую когда-то легко и просто решалась на 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() и пройтись по шагам, то все передается нормально, но если запустить вышеприведенный код, то посылка обрезается. Что я делаю не так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smalcom 0 24 сентября, 2010 Опубликовано 24 сентября, 2010 · Жалоба Не особо силен в LPC, но предполагаю что проблема в том, что передатчик выключается по событию "Регистр данных свободен", а не "Байт отправлен"(аналоги в AVR UDREI и TXCEI) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
M_Andrey 0 24 сентября, 2010 Опубликовано 24 сентября, 2010 · Жалоба Ну незнай, у меня на LPC1768 это срабатывает: while(!U1LSR_bit.TEMT);// подождать окончания передачи правда я передатчик не выключаю, а только перевожу драйвер на прием. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
firstvald 20 1 октября, 2010 Опубликовано 1 октября, 2010 · Жалоба Может в подобной ситуации это поможет: попадался на том, что в Silabе прерывание при передаче возникало не в момент полной отправки байта, а в момент, когда в сдвиговый регистр из буферного загружался байт. Это собственно приводило к обрезке последнего байта, если сразу же в прерывании переключать драйвер 485. Посему, передачу надо усложнить введением задержки на пару-тройку времени передачи 1 байта на данной скорости после прерывания на последнем передаваемом байте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться