"USB Microchip Driver" problem PIC18F2550
Masz problem? Zapytaj na forum elektroda.pl
From: "buke" <cubah_at_nospam_tlen.pl>
Subject: "USB Microchip Driver" problem PIC18F2550
Date: Mon, 24 Apr 2006 11:01:27 +0200
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
From: "Piotrek" <piotrd__at_nospam_wp.pl>
Subject: Re: "USB Microchip Driver" problem PIC18F2550
Date: Mon, 24 Apr 2006 12:30:15 +0200
jak czas ten wydluze ponad 1ms to menedzer zadan pokazuje wykrzyknik i
odlacza modul USB...
I prawidlowo.... HOST probowal sie "dogadac po trzykroc :)" z Twoja koscia
i zamiast odpowiadac na zadania czekales w petli.
Na monitorze portu (hardware'owy) widze ze PIC odpowiada NAK'ami non stop,
Hmm, hardware'owy monitor portu USB ? Odpowiadal ze jest zajety, wiec HOST
probowal ponowic probe a ty co.... - Czekales w petli !
co dziwne bo przeciez caly czas obsluguje zdarzenie wewnatrz petli wiec
kiedys powinien dac ACK!.
Jak odbierzesz dane odpowiadasz ACK, NAK lub STALL i teraz albo ustawiasz to
w rejestrze albo robione jest to automatycznie prze uP.
From: "buke" <cubah_at_nospam_tlen.pl>
Subject: Re: "USB Microchip Driver" problem PIC18F2550
Date: Mon, 24 Apr 2006 14:04:33 +0200
Użytkownik "Piotrek" <piotrd__at_nospam_wp.pl> napisał w wiadomości
news:e2i8un$9h2$1_at_nospam_nemesis.news.tpi.pl...
jak czas ten wydluze ponad 1ms to menedzer zadan pokazuje wykrzyknik i
odlacza modul USB...
I prawidlowo.... HOST probowal sie "dogadac po trzykroc :)" z Twoja koscia
i zamiast odpowiadac na zadania czekales w petli.
Na monitorze portu (hardware'owy) widze ze PIC odpowiada NAK'ami non
stop,
Hmm, hardware'owy monitor portu USB ? Odpowiadal ze jest zajety, wiec
HOST
probowal ponowic probe a ty co.... - Czekales w petli !
co dziwne bo przeciez caly czas obsluguje zdarzenie wewnatrz petli wiec
kiedys powinien dac ACK!.
Jak odbierzesz dane odpowiadasz ACK, NAK lub STALL i teraz albo ustawiasz
to
w rejestrze albo robione jest to automatycznie prze uP.
No wlasnie:)
Gdy czekam w tej petli opozniajacej(to moze byc tez moje zadanie!) to mam
bufor USB (UOWN bit ustawiony na uP). Jesli tak to uP powinien wysylac przez
te 2ms NAK'i - i to robie. Ale przeciez po tych 2ms znow powinien odczytac
transakcje od hosta bo przeciez ustawilem bit UOWN tak aby host mogl pisac
do buforka:) . Czemu wiec PIC odpowiada caly czas NAK'iem??
From: "buke" <cubah_at_nospam_tlen.pl>
Subject: Re: "USB Microchip Driver" problem PIC18F2550
Date: Mon, 24 Apr 2006 14:10:24 +0200
Użytkownik "Piotrek" <piotrd__at_nospam_wp.pl> napisał w wiadomości
news:e2i8un$9h2$1_at_nospam_nemesis.news.tpi.pl...
jak czas ten wydluze ponad 1ms to menedzer zadan pokazuje wykrzyknik i
odlacza modul USB...
I prawidlowo.... HOST probowal sie "dogadac po trzykroc :)" z Twoja koscia
i zamiast odpowiadac na zadania czekales w petli.
Na monitorze portu (hardware'owy) widze ze PIC odpowiada NAK'ami non
stop,
Hmm, hardware'owy monitor portu USB ? Odpowiadal ze jest zajety, wiec
HOST
probowal ponowic probe a ty co.... - Czekales w petli !
co dziwne bo przeciez caly czas obsluguje zdarzenie wewnatrz petli wiec
kiedys powinien dac ACK!.
Jak odbierzesz dane odpowiadasz ACK, NAK lub STALL i teraz albo ustawiasz
to
w rejestrze albo robione jest to automatycznie prze uP.
Wlasnie przed chwila wyczytalem ze pakiety z kontrolnego endpointa (SETUP)
powinny byc potwierdzane wylacznie ACK! Jesli wiec PIC bedzie zajety, to wg.
specyfikacji wysle NAK, ciekawe tylko co wtedy robi host(?)...
From: Piotr <piotrd_at_nospam_wp.pl>
Subject: Re: "USB Microchip Driver" problem PIC18F2550
Date: Mon, 24 Apr 2006 19:19:26 +0200
Wlasnie przed chwila wyczytalem ze pakiety z kontrolnego endpointa (SETUP)
powinny byc potwierdzane wylacznie ACK! Jesli wiec PIC bedzie zajety, to wg.
specyfikacji wysle NAK, ciekawe tylko co wtedy robi host(?)...
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
From: "buke" <cubah_at_nospam_tlen.pl>
Subject: Re: "USB Microchip Driver" problem PIC18F2550
Date: Tue, 25 Apr 2006 13:53:12 +0200
Użytkownik "Piotr" <piotrd_at_nospam_wp.pl> napisał w wiadomości
news:e2j8c7$2fiq$1_at_nospam_news.enterpol.pl...
Wlasnie przed chwila wyczytalem ze pakiety z kontrolnego endpointa
(SETUP) powinny byc potwierdzane wylacznie ACK! Jesli wiec PIC bedzie
zajety, to wg. specyfikacji wysle NAK, ciekawe tylko co wtedy robi
host(?)...
Zeby to najlatwiej zrozumiec musisz sobie to debagowac, zrzucaj stan
rejestrow UARTEM, zobaczyc jak odpowiada host.
UART zajety - w picu to te same wyjscia co USB:(
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
Sek w tym ze enumeracja u mnie nastepuje pomyslnie, tak naprawde to ten
delay_ms(2) wstawiam:
if(USB_state_ => USB_CONFIGURED) // tego brakuje w kodzie na poczatku posta
delay_ms(2);
I host sie wiesza podczas GetReport(HID)... dostaje pozniej same NAKI:(
Wszystko ogladam na hardwareowym monitorze USB.
Zauwazylem ze PIC18F2550 posiada 4 poziomowy stos transakcji (USTAT), no
ale jesli sie przepelni to przeciez w petli predzej czy pozniej bede
pojedyncze transakcje oblugiwal wiec chyba co ktorys ACK powinien wyjsc od
pica ... a tu same NAKI kurde...
From: "Piotrek" <piotrd__at_nospam_wp.pl>
Subject: Re: "USB Microchip Driver" problem PIC18F2550
Date: Tue, 25 Apr 2006 15:06:24 +0200
Zauwazylem ze PIC18F2550 posiada 4 poziomowy stos transakcji (USTAT), no
ale jesli sie przepelni to przeciez w petli predzej czy pozniej bede
pojedyncze transakcje oblugiwal wiec chyba co ktorys ACK powinien wyjsc od
pica ... a tu same NAKI kurde...
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)
.............................