Разбираюсь с 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;
Происходило прерывание и передача оказывалась завершенной до момента проверки условия флага. - проц вешался. Может быть есть более красивое решение?
|