USB, czasem nie wykrywa urzadzenia

Jun 05, 2023 Last reply: 3 years ago 7 Replies

Cześć. Jest sobie urządzonko na STM32F3 w którym ktoś zrobił port USB w ten sposób, że linia DP jest cały czas podciągnięta do +3.3V rezystorem 1.5k. Urządzenie jest oczywiście "self powered" . Przeważnie to działa, ale problem jest podczas restartu tego urządzenia z poziomu oprogramowania, bo raz na kilkanaście restartów Windows go nie wykrywa. Zgaduję że problemem jest ten na stałe podłączony pull-upie. I teraz pytanie. Jaki jest mechanizm, że zwykle to działa tj. windows jest w stanie zrobić enumerację nawet jeśli nie było odłączenia/podłączenia pull-up-a i czemu czasem nie działa. Kombinuję, żeby przy starcie na chwilę wymusić poziom niski na DP, ale pewnie jest ryzyko uszkodzenia albo portu USB albo mikrokontrolera, jeżeli host będzie coś nadawał akurat?



A.


W dniu 05.06.2023 o 18:54, Artur pisze:

Na 99% opisane jest to w punkcie 7.1.5.1 z pliku usb_20.pdf znajdującego się w usb_20_20230224.zip ze strony

formatting link
W skrócie - enumeracja następuje po wykryciu lub zaniku pullup na D+ lub D-.

Jeżeli chcesz zrobić to dynamicznie, dodaj tam coś co będzie odpinało pullupa. Na ile czasu ? Tego nie wiem. 100 ms pewnie wystarczy.

Pozdrawiam

Adam Górski

poniedziałek, 5 czerwca 2023 o 19:27:48 UTC+2 Adam Górski napisał(a):

Tylko, ze ten pull-up jest na stale podpiety do 3.3V, nie da sie go odpiac :) Jedyne, co mozna zrobic to sciagnac linie DP do masy konfigurujac na chwile ten pin jako zwykle wyjscie. Zastanawiam sie jak bardzo jest to ryzykowne.

poniedziałek, 5 czerwca 2023 o 19:27:48 UTC+2 Adam Górski napisał(a):

Ten pull-up jest podpięty na stałe do 3.3V. Jedyna opcja to skonfigurować pin DP jako wyjście i ustawić 0 na kilkadziesiąt ms, a później zainicjować USB. Pytanie tylko jak bardzo jest to ryzykowne. No i czemu przeważnie działa nawet jeśli host nie dostaje informacji w standardowy sposób, że coś zostało odłączone i podłączone?

W dniu 05.06.2023 o 19:57, AW pisze:

Dokumentacja od STM32F niestety nie wspomina nic na temat ograniczania prądu. Jedynie , że prąd max dla portu I/O jest w okolicy 25mA. Fajnie by było gdyby otwarcie napisali czy są tam źródła prądowe szeregowo z mosfetami wyjściowymi. Lub może szeregowe rezystory wyjściowe.

Nie martwił bym się jednak specjalnie tym zwieraniem D+ czy D- do masy. Sygnały na D+ i D- są na poziomie 400mV względem masy w czasie transmisji. Lub jak kto woli +/-400mV różnicowo. Razem z rezystorami szeregowymi dopasowującymi rzędu 22-33R na liniach D+ i D- skutecznie ograniczy ten prąd w okolicy < 20mA.

Zatem zwierać i się nie przejmować.

pozdrawiam

Adam Górski

W dniu 05.06.2023 o 20:45, Artur pisze:

Zobacz jak działa wykrywanie urządzenia.

To jednak 7.1.7.3 Connect and Disconnect Signaling

Adam

poniedziałek, 5 czerwca 2023 o 20:58:57 UTC+2 Adam Górski napisał(a):

Spędziłem trochę czasu z analizatorem stanów logicznych bo mnie męczyło czemu to jednak przeważnie działa, a nie powinno. Tzn. przeważnie po restarcie urządzenia jest ono wykrywane przez windows tj. znika i pojawia się ponownie port COM. Okazuje się, że podczas uruchamiania sterownika USB w tym urządzeniu, po zainicjalizowaniu gpio przez chwilę tj. 4us na linii DP wymuszane jest "0". Windowsowy sterownik przeważnie ten krótki impuls wykrywa i inicjalizuje ponownie połączenie. Linuxowy sterownik ten impuls zawsze ignoruje i w 100% przypadków po restarcie port szeregowy nie działa. Co ciekawe dokumentacja USB mówi, że 0 na obu liniach przez czas dłuższy niż 2.5us to stan DISCONNECT. Czyli nawet ten krótki impuls powinien być zawsze wykrywany jako rozłączenie urządzenia. Artur

W dniu 09.06.2023 o 23:41, Artur pisze:

I tak bywa.

Adam

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required