Artur
Guest
Mon Jun 05, 2023 6:54 pm
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.
Adam Górski
Guest
Mon Jun 05, 2023 7:27 pm
W dniu 05.06.2023 o 18:54, Artur pisze:
Quote:
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.
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
https://www.usb.org/document-library/usb-20-specification
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
AW
Guest
Mon Jun 05, 2023 7:57 pm
poniedziałek, 5 czerwca 2023 o 19:27:48 UTC+2 Adam Górski napisał(a):
Quote:
W dniu 05.06.2023 o 18:54, Artur pisze:
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.
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
https://www.usb.org/document-library/usb-20-specification
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
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.
Artur
Guest
Mon Jun 05, 2023 8:45 pm
poniedziałek, 5 czerwca 2023 o 19:27:48 UTC+2 Adam Górski napisał(a):
Quote:
W dniu 05.06.2023 o 18:54, Artur pisze:
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.
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
https://www.usb.org/document-library/usb-20-specification
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
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?
Adam Górski
Guest
Mon Jun 05, 2023 8:54 pm
W dniu 05.06.2023 o 19:57, AW pisze:
Quote:
poniedziałek, 5 czerwca 2023 o 19:27:48 UTC+2 Adam Górski napisał(a):
W dniu 05.06.2023 o 18:54, Artur pisze:
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.
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
https://www.usb.org/document-library/usb-20-specification
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
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.
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
Adam Górski
Guest
Mon Jun 05, 2023 8:58 pm
W dniu 05.06.2023 o 20:45, Artur pisze:
Quote:
poniedziałek, 5 czerwca 2023 o 19:27:48 UTC+2 Adam Górski napisał(a):
W dniu 05.06.2023 o 18:54, Artur pisze:
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.
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
https://www.usb.org/document-library/usb-20-specification
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
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?
Zobacz jak działa wykrywanie urządzenia.
To jednak 7.1.7.3 Connect and Disconnect Signaling
Adam
Artur
Guest
Fri Jun 09, 2023 11:41 pm
poniedziałek, 5 czerwca 2023 o 20:58:57 UTC+2 Adam Górski napisał(a):
Quote:
W dniu 05.06.2023 o 20:45, Artur pisze:
poniedziałek, 5 czerwca 2023 o 19:27:48 UTC+2 Adam Górski napisał(a):
W dniu 05.06.2023 o 18:54, Artur pisze:
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.
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
https://www.usb.org/document-library/usb-20-specification
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
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?
Zobacz jak działa wykrywanie urządzenia.
To jednak 7.1.7.3 Connect and Disconnect Signaling
Adam
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
Adam Górski
Guest
Mon Jun 12, 2023 7:40 pm
W dniu 09.06.2023 o 23:41, Artur pisze:
Quote:
poniedziałek, 5 czerwca 2023 o 20:58:57 UTC+2 Adam Górski napisał(a):
W dniu 05.06.2023 o 20:45, Artur pisze:
poniedziałek, 5 czerwca 2023 o 19:27:48 UTC+2 Adam Górski napisał(a):
W dniu 05.06.2023 o 18:54, Artur pisze:
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.
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
https://www.usb.org/document-library/usb-20-specification
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
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?
Zobacz jak działa wykrywanie urządzenia.
To jednak 7.1.7.3 Connect and Disconnect Signaling
Adam
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
I tak bywa.
Adam