Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AT91sam7x256 + USB + CDC
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
owl
Разбираюсь с USB от Atmel. Столкнулся со следующей проблемой.
Проц ведет обмен с ПК, иногда пропадают OUT пакеты при Bulk конфигурации.
Вскрытие показывает, что проблемы начинаются (сейчас так кажется), когда происходит одновременное заполенение двух банков USB.
В DataSheets сказано что следует завести переменную на выбор очередного банка. - Это понятно но, тогда такой дурацкий вопрос, а как узнать размер
данных в банках приема? - Регистр то один. Или я что-то не понимаю.
Использую в качестве базы at91lib_softpack_1.5.

Может кому поможет.
Были проблемы с зависанием передачи в функции USBD_Write(), помогла замена макроса SET_CSR(bEndpoint, AT91C_UDP_TXPKTRDY), на:

volatile unsigned int reg, i_mask;
i_mask = AT91C_BASE_UDP->UDP_IMR;
i_mask &= 1<<bEndpoint;
AT91C_BASE_UDP->UDP_IDR = i_mask;
reg = AT91C_BASE_UDP->UDP_CSR[bEndpoint] ;
reg |= REG_NO_EFFECT_1_ALL;
reg |= (AT91C_UDP_TXPKTRDY);
AT91C_BASE_UDP->UDP_CSR[bEndpoint] = reg;
while ( (AT91C_BASE_UDP->UDP_CSR[bEndpoint] & (AT91C_UDP_TXPKTRDY)) != (AT91C_UDP_TXPKTRDY)){
if (AT91C_BASE_UDP->UDP_CSR[bEndpoint] & AT91C_UDP_TXCOMP) break;
}
AT91C_BASE_UDP->UDP_IER = i_mask;

Происходило прерывание и передача оказывалась завершенной до момента проверки условия флага. - проц вешался.
Может быть есть более красивое решение?
aaarrr
Цитата(owl @ Mar 18 2009, 12:35) *
В DataSheets сказано что следует завести переменную на выбор очередного банка. - Это понятно но, тогда такой дурацкий вопрос, а как узнать размер
данных в банках приема? - Регистр то один. Или я что-то не понимаю.

Дата-регистр тоже один, но это же не мешает. В регистре UDP_CSR будет длина того буфера, к которому сейчас есть доступ через FIFO.
singlskv
Цитата(owl @ Mar 18 2009, 12:35) *
Может кому поможет.
Были проблемы с зависанием передачи в функции USBD_Write(), помогла замена макроса SET_CSR(bEndpoint, AT91C_UDP_TXPKTRDY), на:
Происходило прерывание и передача оказывалась завершенной до момента проверки условия флага. - проц вешался.
Может быть есть более красивое решение?
Макрос менять не обязательно, трабла возникает только при вызове USBD_Write() не
из прерваний, поэтому:
DWORD cpu_state = sys_disable_irq();
SET_CSR(bEndpoint, UDP_CSR_TXPKTRDY);
sys_restore_irq(cpu_state);
в USBD_Write()
решает все проблеммы.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.