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