Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AT91RM9200 USB Device (CDC)
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
junkl
Не понимаю, как работает обмен данными с хостом, а точнее передача данных хосту.
Размер точки IN = 64.
1. Если я передаю сообщение меньше 64 байт или более 64 байт (но не равно 64), то оно
передается полностью и отображается в гипертерминале нормально. Но
следующая передача данных не работает (передаю данные, но не возникает прерывания по
флагу TXCOMP).

2. Если передаю сообщение длиной ровно 64 байта, то оно передается (все
нужные прерывания срабатывают), но не отображается в гипертерминале.
Если затем передаю еще один байт, то он нормально передается, и ВСЕ 64
+ 1 байт выводятся в терминал.
После этого передача данных не работает (как и в первом случае).

3. Если передавать несколько раз подряд сообщения длиной 64 байта, то формально они как бы передаются хосту (срабатывают все соответствующие прерывания), но не отображаются в терминале. А после передачи еще одного байта (или любого кол-ва байт меньше 64) - в терминале отображаются все переданные данные. Но последующие передачи не работают, как и в случае 1.

Не подскажете, с чем это может быть связано? Может с какими-нибудь некорректными
переключениями DATA0 - DATA1? или еще с чем-нибудь? Не могу найти в
своей программе каких-то принципиальных отличий от стандартного примера для ARM7.
ig_z
Цитата(junkl @ Jun 6 2007, 08:40) *
Не понимаю, как работает обмен данными с хостом, а точнее передача данных хосту.
Размер точки IN = 64.
1. Если я передаю сообщение меньше 64 байт или более 64 байт (но не равно 64), то оно
передается полностью и отображается в гипертерминале нормально. Но
следующая передача данных не работает (передаю данные, но не возникает прерывания по
флагу TXCOMP).

2. Если передаю сообщение длиной ровно 64 байта, то оно передается (все
нужные прерывания срабатывают), но не отображается в гипертерминале.
Если затем передаю еще один байт, то он нормально передается, и ВСЕ 64
+ 1 байт выводятся в терминал.
После этого передача данных не работает (как и в первом случае).

3. Если передавать несколько раз подряд сообщения длиной 64 байта, то формально они как бы передаются хосту (срабатывают все соответствующие прерывания), но не отображаются в терминале. А после передачи еще одного байта (или любого кол-ва байт меньше 64) - в терминале отображаются все переданные данные. Но последующие передачи не работают, как и в случае 1.

Не подскажете, с чем это может быть связано? Может с какими-нибудь некорректными
переключениями DATA0 - DATA1? или еще с чем-нибудь? Не могу найти в
своей программе каких-то принципиальных отличий от стандартного примера для ARM7.


Очень неуверенно, но попробую предположить, что для завершения передачи кратных пакетов (64) необходимо передавать пакет нулевой длины (или как в вашем случае длиной меньше 64). Вроде когда то на телесисах это обсуждали.
Monk Eastman
а можно на код глянуть? так сложно сказать в чем может быть причина.

З.Ы. увидел в конце фразу, что код мало чем отличается от стандартного... в стандартном коде была ошибка из-за которой TX_COMP на второй передаче не поднимался. Попробуйте найти строку типа:
pUDP->UDP_CSR[3] = (wValue) ? (AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_ISO_IN) : 0;
это в обработке стандартного USB сообщения STD_SET_CONFIGURATION и замените на:
pUDP->UDP_CSR[3] = (wValue) ? (AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_INT_IN) : 0;
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.