Цитата
Я бы, на Вашем месте, не пилил чей-то код, а начал писать свой (подглядывая в чужой), понимая каждую строку кода и ожидаемую реакцию на нее.
Начните с инициализации UDP, прерывания от него. В обработчике прерывания поймайте AT91C_UDP_ENDBUSRES != 0 и двигайтесь дальше.
Я хочу сперва разобраться с этим кодом, а потом уже писать своё.
Сейчас меня гложет невозможность передать в гипертерминал больше 1го пакета. Как я понимаю алгоритм передачи:
1) проверяем не заполнен ли TXPKTRDY в UDP_CSR.
2) заполняем UDP_FDR.
3) сообщаем что мы готовы отправлять данные, устанавливая TXPKTRDY в единицу.
4) ожидаем пока хост не вернет нам TXCOMP. (одновременно с этим, как я понимаю, он обнуляет TXPKTRDY)
5) обнуляем TXCOMP.
Мой код функции записи:
Код
AT91PS_UDP pUdp = pCdc->pUdp;
// проверяем, готов ли юсб к передаче
if (pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXPKTRDY) {
return 0;
}
pUdp->UDP_FDR[AT91C_EP_IN] = 0x74; // хотим передать символ "t"
pUdp->UDP_CSR[AT91C_EP_IN] |= AT91C_UDP_TXPKTRDY; // готовы отправлять
while ( !(pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXCOMP) ); // ждем пока нам не вернут TXCOMP
pUdp->UDP_CSR[AT91C_EP_IN] &= ~(AT91C_UDP_TXCOMP); // обнуляем TXCOMP
Символ 't' в гипертерминале появляется, но вот дождаться бита TXCOMP программа не может. В результате этот while зависает. В чем теоретически может быть проблема?