Powrót

Izolowany galwanicznie mostek USB-SPI. Przykłady wykorzystania z Arduino, AVR i STM32

Prezentowany w artykule konwerter zapewnia izolację galwaniczną interfejsu USB od mikrokontrolera. Ponadto komunikacja z konwerterem odbywa się nie, jak to jest najczęściej, przy pomocy UART ale z wykorzystaniem SPI. Interfejs ten, w stosunku do UART, w przypadku mostków USB ma wiele zalet.

Opisywane urządzenie służy do galwanicznej izolacji interfejsu USB od mikrokontrolera. Istnieją izolatory USB, na przykład ADuM1460, ale do tanich nie należą. Zdecydowanie korzystniej jest zbudować izolator z wykorzystaniem układów FT220/221 i ADuM1402. Układy FT22x są mostkami USB-SPI i w stosunku do mostka z interfejsem UART mają szereg zalet, zwłaszcza przy współpracy z Arduino, AVR, PIC.

Wady mostków UART

– AVR mają mało UART. Jest to szczególnie odczuwalne w przypadku Arduino UNO. Niektóre AVR mają 2 UART, nieliczne Mega po cztery, ale tylko te montowane w obudowach co najmniej 100 pin.

– Zegar AVRmega/tiny musi być stabilizowany rezonatorem kwarcowym. Wbudowany RC ma zbyt małą stabilność aby wykorzystać go z UART.

– Wbudowane w mostki USB-UART FIFO nie spełnia swojej roli. Mostki mają FIFO, ale co z tego, jeśli znaki, które przyszły z USB są wysyłane do UART, czy mikrokotroler tego chce czy nie (wyjaśnienie w dalszej części artykułu). Ten problem najbardziej odczuwalny jest w Arduino z AVRmega/tiny, w którym podczas komunikacji z WS2812 czy 1-Wire najczęściej zawieszane są przerwania.

– Kontrola przepływu wymaga dodatkowych GPIO mikrokotrolera oraz implementacji jej po stronie HOST-a, co nie zawsze jest możliwe, przykładowo gdy nie mamy kodów źródłowych HOST-a.

– Przez UART nie można stwierdzić, czy USB HOST jest przyłączony, czy nie. Tak samo jak odczytać stanu linii sterujących przepływem (DTR, DSR) czy je ustawić (RTS, CTS, CDC, RI). Aby to zrobić trzeba zaangażować kolejne linie mikrokontrolera.

– Konfigurację mostka czyli VID, PID, desktyptor, funkcje GPIO, itd. można przeprowadzić (o ile w ogóle można, bo w np. CP2101 – nie) tylko z poziomu komputera odpowiednią aplikacją. Dla układów FTDI jest to FT_PROG. Nie można tego zrobić z poziomu mikrokotrolera.

Wszystkich z wyżej wymienionych wad pozbawione są układy FT22x. Jakie mają możliwości?

– Komunikacja interfejsem SPI zegarem do 12 MHz. SPI może pracować w trybach 1-, 2-, 4-, a w przypadku FT221 także 8-bit.

– Automatyczne rozpoznawanie szerokości szyny SPI.

– Automatyczne rozpoznawania trybu pracy SPI pomiędzy MODE 1 a MODE 3.

– Prędkość komunikacji USB 1 Mb/s (500 kb/s dla FT220).

– 1kB FIFO, 512 bajtów bufora nadawczego, 512 odbiorczego.

– Wszystkie opcje konfiguracji programem FT_PROG dostępne z poziomu interfejsu SPI.

– Ponad 1 kB EEPROM do dyspozycji użytkownika.

– Jedna konfigurowana linia GPIO.

Jak to działa?

Schemat ideowy pokazany jest na rysunku 1.

Rysunek 1

Układ zasilany jest z USB. U1 pracuje w typowym układzie aplikacyjnym. Szyna SPI jest izolowana układem U4. Ze względu na to, że układ U4 nie może zmienić kierunku konwersji w czasie pracy oraz nie ma pojedynczo sterowanych wyjść Open Drain, aby komunikować się z U1 zastosowano U2. Bramki 3-stanowe U2 pozwalają na zamianię interfejsu SPI 4-wire na 3-wire. Wyjście Open Drain (Open Colector) jest symulowane bramką U2C. Dzięki podłączeniu wejścia sterującego /OE U2C (pin 10) do linii danych MOSI oraz zwarciu wejścia U2C (pin9) do masy, stan niski MOSI wymusza stan niski na wyjściu U2C (pin 8) natomiast stan wysoki na wejściu wymusza stan trzeci na wyjściu, co jest tożsame (o ile nie jest przekroczone na wyjściu napięcie zasilania + ok. 600 mV) z pracą wyjścia Open Drain. Metoda ta jest powszechnie stosowana w układach FPGA, CPLD czy dawniej w GAL, które nie mają wyjść Open Drain. Linię sygnalizującą obecność znaku w odbiorczym FIFO izoluje transoptor U5. Rozwiązanie to ma pewną wadę związaną z szybkością pracy transoptora. Jak sobie poradzić z tym problemem będzie opisane w dalszej części artykułu. Linia CBUS3 U1 nie jest izolowana, jeśli istnieje taka potrzeba należy to zrobić poza płytką interfejsu.

Jak widać, budowa sprzętowa nie jest przesadnie skomplikowana, cała moc interfejsu jest w oprogramowaniu. Zanim przystąpię do opisu oprogramowania wyjaśnię funkcjonowanie FIFO w mostkach USB. W przypadku mostków z UART, dane przychodzące po USB są zapisywane w FIFO, skąd są wysyłane przez UART. Nie znam sposobu aby zatrzymać wysyłanie danych z FTDI. Zmiana stanu linii CTS czy DTR powoduje tylko zmianę stanu tych wirtualnych linii dostępnych w HOST przez API. HOST może reagować na stan CTS/RTS, ale to, co już jest w buforze układu FTDI musi zostać wysłane. Z tego powodu reakcja na zmianę CTS/RTS nie jest natychmiastowa i w najgorszym przypadku mikrokontroler może jeszcze otrzymać, w przypadku układów FTDI, 512 znaków od czasu zmiany stanu linii CTS/RTS. Ponadto nie zawsze program będzie reagował na stan owych linii. Jeśli nie mamy kodów źródłowych nic z tym nie da się zrobić. Arduino nader często blokuje przerwania. W przypadku transmisji do LED WS2812 taka blokada może trwać kilkadziesiąt milisekund a przy prędkości 115200, blokada na dłużej niż ok 173 μs spowoduje gubienie znaków. W przypadku 921600 wystarczy ok 22 μs.

Z FT22x jest inaczej. Dane przychodzące po USB są tak jak w przypadku mostków z UART zapisywane w FIFO, ale FIFO będzie odczytane dopiero gdy zrobi to mikrokontroler, bo FT22x jest układem Slave i sam z siebie nie wyśle danych na SPI. Pozwala to na zdecydowanie dłuższy czas blokować przerwania mikrokontrolera, a nawet obsłużyć komunikację SPI bez użycia przerwań.

(…)

——– ciach! ——–

To jest tylko fragment artykułu, którego pełna wersja ukazała się w numerze styczniowym czasopisma Zrozumieć Elektronikę (ZE 1/2024). Pełną wersję czasopisma znajdziesz pod tym linkiem. Natomiast niepełna, okrojona wersja, pozwalająca zapoznać się z zawartością numeru ZE 1/2024 znajduje się tutaj.

 

SaS, ZE
sas.ze@vp.pl

 

Uwaga! Osoby, które nie są (jeszcze) stałymi Patronami ZE, mogą nabyć PDF-y z pełną wersję tego numeru oraz wszystkich innych numerów czasopisma wydanych od stycznia 2023, „stawiając kawę” (Cappuccino = 10 złotych za jeden numer czasopisma w postaci pliku PDF).
W tym celu należy kliknąć link (https://buycoffee.to/piotr-gorecki), lub poniższy obrazek
Postaw mi kawę na buycoffee.to
Następnie wybrać:
– jeśli jeden numer ZE – CAPPUCINO (10 zł),
– jeśli kilka numerów ZE – WSPIERAM ZA. I tu wpisać kwotę zależną od liczby zamawianych numerów – wydań (N x 10zł),
Wpisać imię nazwisko.
Podać adres e-mail.
Koniecznie zaznaczyć: „Chcę dołączyć wiadomość dla Twórcy” i tu wpisać, który numer lub numery mamy wysłać na podany adres e-mailowy.