LinkedIn YouTube Facebook
Szukaj

Wstecz
Artykuły

Mikrokontroler STM32 jako konwerter USB na 2xRS232

 

 

 

Uwaga! Projekty przygotowano w wersji dla Linuksa oraz Windows. Wersje źródłowe są dostępne na końcu artykułu.

Prezentowane rozwiązanie udostępnia 2 wirtualne porty szeregowe, które mogą być używane niezależnie w tym samym czasie. W projekcie nie są obsługiwane linie RTS, DTR itp., nie mniej jednak można je łatwo dodać (poza linią CTS, której nie obsługuje klasa USB CDC). Schemat elektryczny proponowanego rozwiązania pokazano na rys. 1, a schemat aplikacji blokowy na rys. 2.

 

 

Rys. 1. Schemat elektryczny 
konwertera

Rys. 1. Schemat elektryczny konwertera

 

 

 

Rys. 2. Budowa aplikacji

Rys. 2. Budowa aplikacji

W projekcie można używać jednego lub 2 wirtualnych portów szeregowych, w zależności od definicji zawartych w nagłówku converter.h. Najważniejszy element tego pliku, służący do konfiguracji, pokazano na list. 1.

List. 1. Parametry konfigurujące projekt

#define USE_VCOM1            1
#define USE_VCOM2            1

#if(USE_VCOM1)
#define VCOM1_USART_NUM        1
#endif
#if(USE_VCOM2)
#define VCOM2_USART_NUM        2
#endif

Jeżeli definicja USE_VCOMx jest ustawiona na 1, wówczas wybrany wirtualny COM będzie widoczny w komputerze. Definicja VCOMx_USART_NUM mówi zaś, z którym fizycznym portem szeregowym procesora dany wirtualny port ma się komunikować. Aby można było jednocześnie transmitować dane do dwóch USART-ów sprzężono je z USB za pomocą buforów kołowych a cała transmisja odbywa się na przerwaniach, co pokazano na rys. 3.

 

Rys. 3. Model transmisji danych 
przez konwerter

Rys. 3. Model transmisji danych przez konwerter

Od strony USB i biblioteki vCOM są widoczne dwa wirtualne urządzenia vcom1 i vcom2. Gdy odbieramy dane przez wybrany vcom z komputera, wówczas przepisujemy je do nadawczego bufora kołowego (przypisanego po danego portu USART) i włączamy przerwanie od nadawania danych przez USART. W przerwaniu tym sprawdzamy, czy w buforze nadawczym są dane – jeśli tak, wówczas je odczytujemy i wysyłamy – jeśli nie, wówczas blokujemy przerwanie.
Podobnie jest w przypadku odbioru danych przez USART – jeśli zostanie wygenerowane przerwanie odbiorcze, wówczas wpisujemy odebrane dane do bufora odbiorczego. W momencie gdy przez dany vcom można przesłać kolejne dane do hosta jest wywoływana odpowiednia funkcja podpięta do danego obiektu vcom. Następuje w niej sprawdzenie, czy mamy dane w buforze odbiorczym portu USART, z którym dany vcom współpracuje. Jeśli są jakieś dane, wówczas odczytujemy tyle, ile da się przesłać w jednej paczce do hosta i wysyłamy je.

Tagi: GPIO, Linux, STM32, USB