Skocz do zawartości

Kurs STM32 F4 - #11 - Komunikacja przez USB


Pomocna odpowiedź

Ups, nie wiem czemu tutaj napisałem ten komentarz. Chciałem chyba napisac go pod innym postem. Oczywiscie rozumiem i zamykam tą kwestię 😉

  • 10 miesiące później...
Gość es2

Próbowałem uruchomić USB na KA-NULCEO-411CE (KAMAMI). Pojawia się wirtualne COM "STMicroelectornics Virtual COM Port" w menadżerze urządzeń ale z wykrzyknikiem (Nie można uruchomić urządzenia kod 10). Sprawdziłem na WinXP, 7, 10.

Według tego kursu zrobiłem to samo na STMF103 działa.

Sprawdziłem na 32F411EDISCOVERY i mam ten sam błąd co na KA-NUCLEO.

Używam Keil5. W Necie nie znalazłem projektu na F4xx z USB pod Keil-a, który mógłbym sprawdzić. Na razie jestem za cienki aby analizować na jakim etapie wykłada się USB. Szukam gotowego projektu pod Keil.

Jakiś czas temu próbowałem wgrać gotowca USB dla 32F411EDISCOVERY pod AtolicStudio i na czymś poległem, teraz nie pamiętam na czym.

Gdzie mogę znaleźć projekt z obsługa USB pod Keila?

Gość es2
Cześć, jestem tu nowy i uczę się programowania Discovery razem z tym kursem. Mam pytanie czy istnieje możliwość przesyłania danych i zapisywania ich na pendrive podpięty pod gniazdo micro USB? Czy programem wyjściowym(do takiego zapisu), może być program z tego kursu? Jeśli jest to oczywista sprawa to przepraszam, dopiero się uczę, a wydaje mi się to ciekawym i potrzebnym zagadnieniem.

Aby obsłużyć PenDrive, drukarkę, klawiaturę, uC musi mieć możliwość obsługi hosta USB. Tama możliwość ma STM32F107.

Cześć,
Może problem z błędem "Parametr jest niepoprawny" został już rozwiązany, ale jeśli nie, rozwiązanie jest tuaj:

Link

Aby uniknąć tego problemu należy w pliku usbd_cdc_if.c znaleźć pustego case'a

 case CDC_GET_LINE_CODING:

(u mnie linia 215)

i zamienić np. na:

 case CDC_GET_LINE_CODING:
 {
  uint32_t speed = 115200;
  uint8_t databits = 8;
 length = 7;
 memcpy(pbuf,&speed,4);
 pbuf[4] = 0;
 pbuf[5] = 0;
 pbuf[6] = 8;
 }
   break;

Mi pomogło 🙂

  • Lubię! 1

Turas, witam na forum i dziękuję za podzielenie się rozwiązaniem. Na pewno przyda się komuś w przyszłości 🙂

Gość es2

Może problem z błędem "Parametr jest niepoprawny" został już rozwiązany, ale jeśli nie, rozwiązanie jest tuaj:

Niestety nie pomogło. USBlizer sygnalizuje prace w trybie LowSpeed a w deskryptorze wysyłanym do hasta wielkość pakietu jest ustawiona na 64:

Connection Status Device connected 
Current Configuration 0 
Speed Low (1.5 Mbit/s) 
Device Address 0 
Number Of Open Pipes 0 

Device Descriptor 
Offset Field Size Value Description 
0 bLength 1 12h  
1 bDescriptorType 1 01h Device 
2 bcdUSB 2 0200h USB Spec 2.0 
4 bDeviceClass 1 02h CDC Control 
5 bDeviceSubClass 1 02h Abstract Control Model 
6 bDeviceProtocol 1 00h  
7 bMaxPacketSize0 1 40h Should be 8 bytes for low-speed devices    <<<< BŁĄD
8 idVendor 2 0483h SGS Thomson Microelectronics 
10 idProduct 2 5740h  
12 bcdDevice 2 0200h 2.00 
14 iManufacturer 1 01h  
15 iProduct 1 02h  
16 iSerialNumber 1 03h  
17 bNumConfigurations 1 01h 

Aktualizowałem Cube do najnowszej wersji (zdaje się z 23 marca) ale nadal jest generowany niepoprawny kod.

Może w nowszych wersjach Cube'a jest coś jeszcze zwalone.. Ja mam wersję 4.16.0, zmieniłem jedynie to co napisałem powyżej i problem został rozwiązany.

Gość es2

Nie mam płytek z innymi 4xx niż 411. Mam tylko 103, 107, 152 i dwa różne zestawy z 411. Same płytki sprawne, bo HID działa, tylko CDC daje to co daje. Na razie nie znalazłem miejsca w kodzie, gdzie jest wybierana szybkość interfejsu. Próbowałem w Cube ustawić LowSpeed ale kod jest generowany zawsze dla FullSpeed.

Gość es2
Czy tryb low-speed / full-speed nie jest przypadkiem wybierany sprzętowo? za pomocą podciągnięcia D+ lub D-?

Tak.

Wszystko wskazuje na to, że Cube generuje kod gdzie wybierane jest sprzętowo podciąganie linii D- zamiast D+. W 103 nie byłoby problemu, bo tam rezystor należy podłączyć na zewnątrz, w 411 jest OTG-USB anie FS-USB i rezystor podciągający jest w uC.

  • 2 tygodnie później...

Witam,

W przykładzie z USB instrukcja obsługi transferu danych pisana jest jest w: while (1),

czy da się to zrobić na przerwaniu ? a jeżeli tak to jakiej funkcji użyć ?

Gość es2
W przykładzie z USB instrukcja obsługi transferu danych pisana jest jest w: while (1),

czy da się to zrobić na przerwaniu ? a jeżeli tak to jakiej funkcji użyć ?

Da, ale w HAL takiej funkcji nie widziałem (jak np w przypadku USART). Trzeba napisać samemu.

Dziwna sprawa z tym USB, u mnie działa bez problemu - testowałem na Win10 oraz Debian9. Jedyny problem jaki miałem to czasem hub usb mi się zawiesza - ale on się i normalnie kiepsko działą, więc ciężko winić stm32. Przy bezpośrednim łączeniu z PC, wszystko działa pięknie. Próbowałem zarówno po debuggerem, jak i wgrywając program do flash-a. Resety, odłączanie przewodów - wszystko bez problemu.

Co prawda RealTerm to jakieś nieporozumienie, więc używałem TeraTerm i Hercules-a oraz minicom-a pod linuksem.

Nie mam pomysłu co jeszcze można byłoby zrobić, żeby źle działało - a w sumie temat ciekawy i nawet chciałem zobaczyć co może być przyczyną problemów.

Chcę wysłać przez USB do STM32 8 bajtów, wszystko działa jak należy póki wysyłam niezerowe bajty.

Gdy jakiś bajt jest równy 0 - zeruje kolejne bajty. Przykładowo:

wysyłam: 1 2 3 4 5 0 7 8

odbieram: 1 2 3 4 5 0 0 0

Czy w bibliotece jest jakaś funkcja odpowiedzialna za zakończenie wysyłania danych po 0 ?? jak o zmienić ?

Wszystko skonfigurowane wg. powyższego kursu

Pozdrawiam

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...