Skocz do zawartości
Komentator

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ę 😉

Udostępnij ten post


Link to post
Share on other sites
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?

Udostępnij ten post


Link to post
Share on other sites

es2, _kursSprzet

Udostępnij ten post


Link to post
Share on other sites
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.

Udostępnij ten post


Link to post
Share on other sites

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

Udostępnij ten post


Link to post
Share on other sites

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

Udostępnij ten post


Link to post
Share on other sites
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.

Udostępnij ten post


Link to post
Share on other sites

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.

Udostępnij ten post


Link to post
Share on other sites
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.

Udostępnij ten post


Link to post
Share on other sites

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

Udostępnij ten post


Link to post
Share on other sites
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.

Udostępnij ten post


Link to post
Share on other sites

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ć ?

Udostępnij ten post


Link to post
Share on other sites
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.

Udostępnij ten post


Link to post
Share on other sites

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.

Udostępnij ten post


Link to post
Share on other sites

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

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...