Цитата(Kaplinsky @ Sep 27 2005, 18:08)
Я же вызываю функцию
BulkOrInterruptIn(...) из функции
main().
В этом случае необходимо гарантировать отсутствие прерываний на все время работы с выбранной
IN endpoint. Простое и грубое решение - запретить все прерывания на время выполнения функции
BulkOrInterruptIn(...), т.е.:
void BulkOrInterruptIn (...){
BYTE bCsrL, bCsrH;
EA =0; // Turn off interrupts
...
...
...
EA =1; // Turn on interrupts
}
Если этого не сделать, то возможны самые разнообразные "глюки" от отсутствия обмена до "зависания" контроллера.
Цитата(Kaplinsky @ Sep 27 2005, 18:08)
Короче говоря у меня на второй раз этот кусок затыкается - при первой проверке у меня FIFO slot NOT is open
Будет понятнее, если написать так: при первом вызове функции
BulkOrInterruptIn(...) в FIFO есть место для записи пакета (из 64 байт). А при следующем вызове этой функции в FIFO нет места для нового пакета. Такая ситуация возможна, если SIE не успевает передать пакет за время между первым и вторым вызовом функции
BulkOrInterruptIn(...). То есть, или промежуток времени слишком мал, или Windows не распознала устройство и не подключила драйвер устройства.
Цитата(Kaplinsky @ Sep 27 2005, 18:08)
Что нужно делать в USB_ISR()
В случае вызова функции
BulkOrInterruptIn(...) из функции
main() можно ничего не делать.