logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

PIC18F45K50 - [MikroPascal] USB - awaria nieznanego urządzenia

Urgon 08 Paź 2014 21:20 2754 24
REKLAMA
  • #1 14026321
    Urgon
    Poziom 38  
    Posty: 7297
    Pomógł: 197
    Ocena: 2636
    AVE...

    Będąc młodym programistą chciałem stworzyć urządzenie USB HID na bazie PIC18F45K50 i języka MikroPascal. Użyłem do tego szczytnego celu gotowej biblioteki z tego linka: http://www.libstock.com/projects/view/72/usb-na
    Z jakiegoś powodu program testowy nie chce działać, komputer wystawia błąd 43, VID i PID są równe zeru. Poniżej kody główny i konfiguracji.
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Kod: text
    Zaloguj się, aby zobaczyć kod

    Konfiguracja:
    PLLx3, PLL enabled, CPU postscaler disabled, Low Speed USB 48MHz, divider = 8, INTOSC = 1, reszta ustawiona domyślnie. Cała konfiguracja:
    CONFIG1L   :$300000 : 0x0023
    CONFIG1H   :$300001 : 0x0028
    CONFIG2L   :$300002 : 0x0046
    CONFIG2H   :$300003 : 0x003C
    CONFIG3H   :$300005 : 0x0091
    CONFIG4L   :$300006 : 0x0081
    CONFIG5L   :$300008 : 0x000F
    CONFIG5H   :$300009 : 0x00C0
    CONFIG6L   :$30000A : 0x000F

    Pin MCRL podciągnięty rezystorem do Vdd i połączony stosownym kondensatorem z Vss, reszta niezbędnych kondensatorów obecna, łącznie z kondensatorem głównym 10µF. Vusb3v3 posiada kondensator MLCC 1µF i monolityczny 100nF. Urzadzenie zaprogramowane poprawnie...
  • REKLAMA
  • Pomocny post
    #2 14026969
    Konto nie istnieje
    Konto nie istnieje  
  • #3 14027144
    Urgon
    Poziom 38  
    Posty: 7297
    Pomógł: 197
    Ocena: 2636
    AVE...

    Zmieniłem procedurę uCinit() by dodać sprawdzanie stanu oscylatora. Dodałem też uruchamianie modułu ACT, który zwyczajnie przegapiłem. Do tego źle ustawiłem zegar. Teraz to wygląda tak:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Nadal nie działa...
    Co do Low Speed USB, to we wszelkich przykładach konfiguracji dla HID właśnie z takim ustawieniem się spotkałem. A prędkość dla mnie nie ma wielkiego znaczenia.

    EDIT:

    Okazało się, że kompilator skompilował kod, ale nie stworzył poprawnego pliku .HEX (Windows uznał, iż kompilator nie ma prawa do zapisania czegokolwiek nawet na życzenie użytkownika). Zaktualizowałem go do najnowszej wersji i zmieniłem odrobinę kod procedury uCinit(). Teraz wygląda tak:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Mimo to urządzenie nadal nie działa. Sprawdziłem więc jeszcze status DevNode i skonsultowałem się z tą stroną MSDN.
    Na podstawie statusu wyszła mi taka rozpiska:
    DevNode status: 01806400
    DNF_RESOURCE_REQUIREMENTS_CHANGED (0x00000400)
    DNF_HAS_PROBLEM (0x00002000)
    DNF_HAS_PRIVATE_PROBLEM (0x00004000)
    DNF_ASYNC_ENUMERATION_NOT_SUPPORTED (0x00800000)
    DNF_LOCKED_FOR_REBALANCE (0x01000000)

    Co dalej?
  • #4 14027449
    Konto nie istnieje
    Konto nie istnieje  
  • #5 14027646
    Urgon
    Poziom 38  
    Posty: 7297
    Pomógł: 197
    Ocena: 2636
    AVE...

    Skorzystałem z wersji demo narzędzia do podglądu transmisji USB USBTrace. Załączam log z procesu enumeracji.
    Komunikaty 11, 17, 27, 29, 33, 35, 37, 39, 41, 49 są oznaczone jako błędne. Dalej nie mam pojęcia, co się dzieje, ale problem można chyba zawęzić do samej biblioteki i procesu enumeracji.
    Załączniki:
    • log.txt (9.83 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • Pomocny post
    #6 14027764
    Konto nie istnieje
    Konto nie istnieje  
  • #7 14027811
    Urgon
    Poziom 38  
    Posty: 7297
    Pomógł: 197
    Ocena: 2636
    AVE...

    W części ProjectItems zmieniałem wielkość buforów na mniejsze, oraz parametr odpowiedzialny za pobór energii. Przeprowadziłem właśnie próbę z użyciem biblioteki USB dostarczanej przez Mikroelektronikę.
    Mój kod wygląda tak:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Plik deskryptora wzięty z przykładu:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Tym razem błędne są komunikaty 16, 22, 32, 34, 38, 40, 42, 44, 46, 54.
    Załączniki:
    • log.txt (9.85 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #8 14027914
    Konto nie istnieje
    Konto nie istnieje  
  • #9 14027968
    Urgon
    Poziom 38  
    Posty: 7297
    Pomógł: 197
    Ocena: 2636
    AVE...

    Wedle deskryptora interfejs jest skonfigurowany jako USB 2.0. Zmieniłem VID i PID i konfigurację na USB 1.1. Błędy się powtarzają, chyba wedle tego samego wzoru, tym razem od komunikatu 12 (Log2). Zmiana na USB 1.0 też nie działa (Log3).
    Załączniki:
    • log3.txt (9.17 KB) Musisz być zalogowany, aby pobrać ten załącznik.
    • log2.txt (9.17 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #11 14030210
    Urgon
    Poziom 38  
    Posty: 7297
    Pomógł: 197
    Ocena: 2636
    AVE...

    USBLyzer pokazał mi dokładnie miejsce i znaczenie błędu w komunikacji. Ten sam błąd zdarza się niezależnie od tego, czy używam oryginalnej biblioteki USB czy nowej, z linku w pierwszym poście. Konkretnie chodzi o odpowiedź na IRP_MN_QUERY_DEVICE_RELATIONS (Removal Relations). Czy mogę te relacje dodać do deskryptora, a jeśli tak, to jak to powinno wyglądać?
    Załączam logi dla wersji oryginalnej biblioteki i biblioteki NA.
    Załączniki:
    • USBlyzer_logNA.txt (1.98 KB) Musisz być zalogowany, aby pobrać ten załącznik.
    • USBlyzer_log.txt (1.96 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #12 14031953
    Konto nie istnieje
    Konto nie istnieje  
  • #13 14033527
    Urgon
    Poziom 38  
    Posty: 7297
    Pomógł: 197
    Ocena: 2636
    AVE...

    Zgłębiłem się we wnętrze biblioteki NA i znalazłem w niej dwie przydatne rzeczy, które zupełnie nie pomogły. Pierwszą jest opcja debugowania, którą pozostawił twórca. Po jej włączeniu za pomocą stosownej dyrektywy sprzętowy USART powinien zeznać, co się dzieje krok po kroku w trakcie enumeracji i komunikacji. Jednak po jej włączeniu nie dzieje się absolutnie nic, i bladego pojęcia nie mam, czemu. Drugą jest fragment, gdzie ustalana jest sprzętowa prędkość modułu USB. Zmieniłem tę prędkość z USB 2.0 na 1.1. Mimo to proces enumeracji nie przebiega poprawnie. Co więcej, jestem pewien już iż program nigdy nie opuszcza procedury InitUSB. Jutro spróbuję jeszcze wgrać jakiś program od Microchipa, bo w tej chwili mam ochotę rzucić płytką o ścianę.

    EDIT:
    W akcie desperacji i rozpaczy załadowałem bootloader Pinguino by sprawdzić, czy nie ma problemów sprzętowych. Oczywiście nie ma. Zatem problem musi tkwić w samej bibliotece lub w deskryptorach. Przy czym zastanawiające jest, dlaczego biblioteka USB dostarczana z MikroPascalem oraz plik deskryptora przez narzędzie w IDE wbudowane generują te same błędy co biblioteka z LibStock, zaś bootloader z Pinguino działa poprawnie?
  • #14 14034150
    Konto nie istnieje
    Konto nie istnieje  
  • #15 14034237
    Urgon
    Poziom 38  
    Posty: 7297
    Pomógł: 197
    Ocena: 2636
    AVE...

    Jeśli chodzi o bit konfiguracyjny Low Speed USB 48MHz, divider = 8, to jest to używane tylko wtedy, gdy bit FSEN w rejestrze UCFG jest ustawiony na 0, wtedy sygnał zegara jest dzielony przez 8, dając potrzebne 6Mhz dla prędkości Low Speed. W przeciwnym razie dzielnik jest pomijany. Właśnie ten bit wyzerowałem podczas ostatniej próby. We wszystkich wcześniejszych był ustawiony na 1.
  • Pomocny post
    #16 14034448
    Konto nie istnieje
    Poziom 1  
  • #17 14034576
    Urgon
    Poziom 38  
    Posty: 7297
    Pomógł: 197
    Ocena: 2636
    AVE...

    Logi z USBTrace i USBLyzer są wyżej. Niżej najnowszy z USBTrace. Jeśli potrafisz to zrozumieć, to byłbym wdzięczny za jakieś wskazówki. Ponownie sprawdziłem działanie stockowej biblioteki USB od Mikroelektroniki, bo wyczytałem na ich forum, iż w mikroC był problem wywołany złą nazwą w pliku .mlk z definicjami bibliotek. Mimo sugerowanych zmian nie zadziałało. Co do prędkości to zmiana bitu UCFG.FSEN zmienia nie tylko częstotliwość komunikacji modułu, ale też wszystko inne związane z przełączaniem prędkości, łącznie z konfiguracją wewnętrznych rezystorów pull-up...
    Załączniki:
    • log2.rar (2.29 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • Pomocny post
    #18 14035098
    Konto nie istnieje
    Poziom 1  
  • #19 14035819
    Urgon
    Poziom 38  
    Posty: 7297
    Pomógł: 197
    Ocena: 2636
    AVE...

    Chciałem użyć opcji ICD, ale mikroe IDE nie wspiera debugowania tego konkretnego mikrokontrolera, choć generuje poprawne pliki .cof. Z kolei MPLAB X nie może zaprogramować do debugowania z jakiegoś powodu. Funkcja InitUSB pochodzi z biblioteki USB_NA. Zaś HID_Enable(@readbuff,@writebuff) jest z biblioteki dostarczanej z mikroPascalem.

    Nie jestem dobrym programistą, C nie rozumiem wcale, dlatego wybrałem mikroPascala. A pisania w ASM boję się jak przysłowiowy diabeł święconej wody. Od dwóch godzin próbowałem napisać program w mikroPascalu i w asm, który skopiuje kolejne bajty z jednej lokacji w RAM do drugiej, ale nie idzie mi wcale. Chciałem skopiować zawartość RAMu z obszaru 0x500-0x579, gdzie zapisane są deskryptory po inicjalizacji do lokacji w 0x600, gdzie "na sztywno" zadeklarowana byłaby zmienna zawierająca dane dla funkcji USART1_write(). Całość miała być w pętli by co iterację wysyłać kolejne bajty.
    Szczerze pisząc, obawiam się, iż jestem za mało doświadczony by w ogóle cokolwiek robić z USB. W ostateczności użyję pewno zewnętrznego modułu USART<>USB, ale nie po to wybrałem mikrokontroler z USB, by używać przejściówek...
  • #20 14035899
    Konto nie istnieje
    Konto nie istnieje  
  • #21 14036094
    Konto nie istnieje
    Poziom 1  
  • #22 14036144
    Konto nie istnieje
    Konto nie istnieje  
  • #23 14036454
    Konto nie istnieje
    Poziom 1  
  • #24 14038162
    Urgon
    Poziom 38  
    Posty: 7297
    Pomógł: 197
    Ocena: 2636
    AVE...

    Znalazłem jeszcze inną bibliotekę USB, tym razem zrobioną przez Mikroelektronikę i udostępnioną na LibStock. Po skompilowaniu przykładu HID układ zadziałał z przysłowiowego kopa. W załączniku log z USBLyzer. Co ciekawe, nadal pojawiają się drobne błędy, tym razem przy Bus_Relations, lecz nie wpływają one na enumerację. Za to w dalszej części loga można zobaczyć, jak IDE sprawdza, czy czasem nie podłączyłem właśnie płytki developerskiej albo programatora ichniej produkcji.
    Załączniki:
    • log.rar (3.69 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • Pomocny post
    #25 14038437
    Konto nie istnieje
    Poziom 1  

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik próbował stworzyć urządzenie USB HID na bazie mikrokontrolera PIC18F45K50 z użyciem języka MikroPascal, jednak napotkał problemy z komunikacją USB, w tym błędy enumeracji i zerowe wartości VID i PID. W odpowiedziach zasugerowano sprawdzenie oscylatora, konfiguracji prędkości USB oraz poprawności kodu. Po kilku modyfikacjach, w tym aktualizacji kompilatora i zmianie ustawień w kodzie, użytkownik odkrył, że problem leży w bibliotece USB. Ostatecznie, po przetestowaniu innej biblioteki od Mikroelektroniki, urządzenie zaczęło działać, mimo że nadal występowały drobne błędy związane z komendami PnP.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA