"USB Microchip Driver" problem PIC18F2550

Witam Pytanie do tych co robili cos z driverem ze strony Microchip (PIC18F2550)...

Domyslnie driver ten ma obsluge zdarzen USB na pollingu (nie na przerwaniach!)

Mam prosta petle typu:

while (1) { restart_wdt(); USBTasks(); stat = USBCheckBusStatus(); ProcessIO(); // See user\user.c & .h DecodeCommand(); // dekodowanie komendy USB

delay_ms(2);// maksymalnie 1 ms aby dzialalo! // MyTask(); }

i w lini delay_ms jak dam czas <=1ms to USB dziala caly czas OK. natomiast jak czas ten wydluze ponad 1ms to menedzer zadan pokazuje wykrzyknik i odlacza modul USB...

Na monitorze portu (hardware'owy) widze ze PIC odpowiada NAK'ami non stop, co dziwne bo przeciez caly czas obsluguje zdarzenie wewnatrz petli wiec kiedys powinien dac ACK!.

PS. W wielu driverach USB pod PIC jest napisane aby polling byl co najmniej co

10ms a tu wychodzi ze musze miec czesciej niz 1ms (czas ramki USB).

Dzieki

Reply to
buke
Loading thread data ...

I prawidlowo.... HOST probowal sie "dogadac po trzykroc :)" z Twoja koscia i zamiast odpowiadac na zadania czekales w petli.

Hmm, hardware'owy monitor portu USB ? Odpowiadal ze jest zajety, wiec HOST probowal ponowic probe a ty co.... - Czekales w petli !

Jak odbierzesz dane odpowiadasz ACK, NAK lub STALL i teraz albo ustawiasz to w rejestrze albo robione jest to automatycznie prze uP.

Reply to
Piotrek

Zeby to najlatwiej zrozumiec musisz sobie to debagowac, zrzucaj stan rejestrow UARTEM, zobaczyc jak odpowiada host. Z tym nakiem jest roznie otoz zaraz po podlaczeniu urzadzenia przy pierwszej probie pobrania deskryptora przez HOST na zapowiedz typu IN ladujesz pierwsze 8 bajtow do Hosta, powinienes dostac ACK lecz tak nie jest otrzymasz NAK pomimo tego ze odebral on te 8 bajtow. Zostaniesz zresetowany ponownie przez Host, w tych pierwszych 8 bajtach ktore mu przeslales byl zapisany rozmiar device descriptor, wiec zaraz po drugim resecie magistrali Host poprosi Cie jeszcze raz o deskryptor urzadzenia juz w celu jego pobrania , zna juz rozmiar i wie ile razy ma wyslac do Ciebie zapowiedz IN a potem zostaniesz poproszony o deskryptor konfiguracji i tu pomimo zwrocenia jego rozmiaru Host poprsi cie o 255B pomimo ze twoj deskryptor jest mniejszy, w celu zakonczenia procesu enumeracji musisz mu chyba wyslac pakiet zerowy

Reply to
Piotr

Sprobuj jeszcze zmienic wartosc pola (Polling interval) w deskryptorze dla kazdego endpointa.... Ponizej podaje przyklad

...................... /* HID Class-Specific Descriptor */ ..........

/* Endpoint Descriptor */ sizeof(USB_EP_DSC), // Size of this descriptor in bytes DSC_EP, // Endpoint descriptor type _EP01_IN, // Endpoint 1 IN _INT, // Interrupt transfers HID_INT_IN_EP_SIZE, // Maximum packet size 0x0A, // Polling interval (milliseconds) (tu jest ustawione na 10ms sprobuj zmienic na 0xFF) .............................

Reply to
Piotrek

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.