Gotowe urządzenie to koszt około 150zł. Sam układ scalony, który wymaga dodatkowych komponentów, na przykład ADuM4160, to koszt ok. 50zł. W wielu konstrukcjach używane są mostki USB<->UART, jak popularny FT232 czy USB<->SPI na niedocenianym FT22x albo USB-I2C na FT20x. W takim przypadku izolację łatwo i tanio można zrealizować przy wykorzystaniu transoptorów.
Prezentowane w niniejszym artykule rozwiązania są tanim sposobem na zapewnienie izolacji galwanicznej pomiędzy komputerem a urządzeniem z portem USB, przy czym taka izolacja nie musi oznaczać braku możliwości definiowania parametrów USB (VID, PID, nazwa, itp.) od strony mikrokontrolera. Przy okazji można zyskać prawie 1 lub 2kB pamięci EEPROM. W przypadku AVR i innych małych mikrokonrolerów nie trzeba tracić drogocennego UART, a CPU może być taktowany wewnętrznym, niezbyt dokładnym generatorem RC.
Opis układu - izolowane galwanicznie łącze USB
Najprostszym sposobem odizolowania mikrokontrolera od komputera jest wykorzystanie transoptorów oraz mostka USB<->UART, na przykład FT232RL czy FT230, jeśli nie są potrzebne wszystkie linie interfejsu – patrz rysunek 1. Przy niedużych prędkościach transmisji nieprzekraczających 9600...19200b/s wystarczą najtańsze transoptory, jak CNY- 17, LTV357.
Do 1Mb/s można używać 6N136, do 10MB/s (maksymalny transfer dla FT230 to 3Mb/s) 6N137, który ma taki sam rozkład wyprowadzeń jak 6N136. Jeśli wymagany jest mały prąd diody w transoptorze, można użyć 6N139, naturalnie trzeba zmodyfikować wartość rezystora ograniczającego prąd. Do izolacji można wykorzystać specjalizowane układy, jak ADuM1402 rysunek 2 czy ADuM1201, gdy wystarczą tylko linie TX i RX.
Niestety mostki USB-UART mają wiele ograniczeń. Największe to praca ze ściśle określoną prędkością, która musi być taka sama w hoście (komputerze) i mikrokontrolerze. To w przypadku prostych mikrokontrolerów jak AVR wymaga użycia kwarcu, czasem o prędkości tak zwanej „uartowej”, co nie zawsze jest wygodne lub w ogóle jest nie do zaakceptowania. Wyjściem z sytuacji może być mostek USB<- ->SPI lub USB<->I2C. Obsługa mostków SPI czy USB jest tak prosta jak UART. O zaawansowanych możliwościach tych układów (konfiguracja pamięci MTP) może powstać osobny artykuł (proszę o e-maile).
Na razie skupimy się na sprzętowej realizacji izolacji galwanicznej. W przypadku interfejsu SPI możliwości są dwie: transoptory (rysunek 3) lub specjalizowany układ jak ADuM1201 (rysunek 4).
W przypadku użycia transoptorów wskazane jest zastosowanie bufora (na schemacie 74AHC1G07G-DTE) na wejściu transoptora. Wydajność prądowa FT22x jest wystarczająca do wysterowania diody w transoptorze, ale problemem (czasem) może być maksymalny prąd transoptora na linii MOSI (U5).
Problem może rozwiązać wykorzystanie w roli U5 transoptora 6N139 i zmniejszenie prądu LED (rezystor R10). Ze względu na specyfikę układów FT22x do izolacji za pomocą specjalizowanego układu nie wystarczy jeden ADuM1402, bo trzeba odizolować linię MISO. Aby nie używać dużo droższych izolatorów 6- czy 8-kanałowych albo dodatkowego układu, na przykład ADuM120x, linię MISO odizolowano transoptorem. Analizując notę katalogową FT22x, można wysnuć wniosek, że wystarczy nawet powolny transoptor jak CNY-17, ale nie wypróbowałem takiej opcji w praktyce i być może potrzebna byłaby modyfikacja oprogramowania (opóźnione zmiany sygnału MISO).
W przypadku I2C można zastosować tanie rozwiązanie opisane w siostrzanej „Elektronice Praktycznej” 5/2019 „Ekonomiczny optoizolator I2C”, ale ze względu na zajmowaną powierzchnię na PCB lepiej zastosować ADuM1251 według rysunku 5, który jest dostępny w małej obudowie SO-08.
Układ FT201 akceptuje napięcie 5V na liniach SCL i SDA, więc AduM1251 może być zasilany napięciem 5V, aby nie obciążać stabilizatora układu FT201. Nazwy linii transmisyjnych na ADuM1251 są umowne i nie ma znaczenia, czy do SDAx podłączymy linię SDA, czy SCL. Diody LED, podobnie jak we wcześniejszych rozwiązaniach, podłączone są do +5V właśnie po to, aby nie obciążać nadmiernie stabilizatora.
Komunikacja z układem jest bardzo prosta. Aby wysłać bajt przez USB, należy zaadresować układ do zapisu, po czym wysłać daną. Jeśli slave nie potwierdzi zaadresowania sygnałem ACK, oznacza to, że bufor nadawczy jest pełny. Zapełnienie bufora jest mało prawdopodobne, bo bufor nadawczy FT201 ma 512 bajtów, a wysyłając dane z częstotliwością 400kHz, co daje ok. 20 000 znaków na sekundę, nie sposób przekroczyć przepływności 1Mb/s, którą potrafi obsłużyć FT201 (ale przy zegarze I2C 3,4MHz jest to już możliwe).
W poniższej tabelce zawarte są dodatkowe informacje dotyczące szybkości transmisji w kostce FT201:
Maksymalna szybkość wysyłania/ odbierania danych z FT201 wynika z: 400000/(9*2+1+1) gdzie: 400000 - 400kHz 9 - 9 bitów (dana+ACK/NAK) 2 - 2 bajty (adres+dana) 1 - 1 bit sekwencji start 1 - 1 bit sekwencji stop
Aby przy I2C 400kHz przepełnić 512-bajtowy bufor, FT201 musiałby być podłączony do HUB-a, a na innych jego portach musiałaby być przesyłane duże ilości danych z dużą przepływnością. Wadą FT201 jest to, że nie można wysłać więcej niż jednego bajtu po zaadresowaniu układu. Z noty katalogowej FT200 można wnioskować, że w jego przypadku można zapisywać i odczytywać większą liczbę danych, ale nie było możliwości zweryfikowania tego.
Odbiór jest także prosty, po zaadresowaniu układu do odczytu, jeśli układ wystawi ACK, należy odczytać bajt danych. Brak ACK oznacza, że bufor odbiorczy jest pusty. Bufor mieści 512 bajtów. Tak jak w przypadku wysyłania danych, tak i przy ich odbiorze, na raz można odczytać jeden bajt. Istnieje sposób na uzyskanie informacji o liczbie bajtów w buforze, co może być przydatne w przypadku układu FT200.
Funkcjonalność ta może zostać opisana w innym artykule, ponieważ teraz skupiamy się na izolacji galwanicznej. Ze względu na to, że przy odczycie i pustym buforze układ nie daje potwierdzenia ACK, wydaje się, że nie można stwierdzić obecności układu inaczej niż przez wysłanie danej po USB.
Jednak sposób jest, a nawet dwa. Pierwszy to fakt, że FT201 odpowiada na adres broadcastowy 0, drugi to adres 0xF8 (0x7c), pod którym można uzyskać informację, jaki adres I2C ma układ. Adres ten można odczytać i zmodyfikować programem FT-PROG – rysunek 6.
Domyślnym adresem jest 0x44 (0x22). W kolejnych artykułach o FT20x może zostać opisany sposób konfigurowania układu z poziomu mikrokontrolera (pamięć MTP) oraz wykorzystania wbudowanej pamięci EEPROM, a także odczyt rejestru statusu i identyfikatora. Przydatną opcją może być dostęp do MTP i EEPROM z poziomu hosta za pośrednictwem bibliotek D2XX.
Większe możliwości aniżeli FT220 oferuje mostek USB<->SPI. Komunikacja z nim jest zdecydowanie szybsza, bo SPI można taktować zegarem 12MHz (FT20x 3,4MHz, dla AVR granicą jest 400kHz), a komunikacja może być jedno-, dwu-, cztero-, a w przypadku FT221 ośmiobitowa. Nazwy linii interfejsu układów FT22x mogą być mylące. Wydawać by się mogło, że MISO to wyjście, a MIOSIx to wejście, ale nie do końca tak jest.
MISO faktycznie jest wyjściem, ale nie danych, lecz informuje o fladze #RXF (bufor odbiorczy pełny), natomiast MIOSIx to linie interfejsu SPI, ale w czasie gdy /SS znajduje się w stanie nieaktywnym, na linii tej pojawia się informacja o fladze #TXE (bufor nadawczy pusty). W przypadku trybu jednobitowego interfejs pracuje w trybie 3-przewodowym (SCK, /SS, IO). Aby zrealizować izolację galwaniczną, najlepiej skonwertować dane z trybu 3-przewodowego do 4-przewodowego, wtedy linie nadawania (MOSI) i odbioru (MISO) interfejsu SPI są rozdzielone.
Komunikacja z układem jest prosta. Aby wysłać daną, przy nieaktywnym sygnale /SS, sprawdzamy stan linii MIOSIx. Jeśli bufor nadawczy jest pusty, aktywujemy /SS, po czym wysyłamy komendę Write request command (CMD=0x00) i daną lub dane.
W przeciwieństwie do FT201, układ z rodziny FT22x pozwala wysłać do 512 danych po jednej komendzie. Przyjęcie każdej danej jest sygnalizowane linią MISO. Odbiór danej polega na sprawdzeniu, czy znak znajduje się w buforze odbiorczym. Sygnalizowane jest to linią MISO, która może generować przerwanie do mikrokontrolera. Jeśli linia jest aktywna, należy uaktywnić /SS, wysłać komendę Read request command (CMD=0x01) i odczytać daną. Jeśli danych będzie więcej, linia MISO będzie aktywna.
Dzięki tym mechanizmom transfer danych jest szybki. Inną zaletą FT22x w stosunku do FT20x jest możliwość odczytu stanu linii DTR i RTS oraz ustawiania CTS, DSR, CD i RI. Oczywiście tak jak FT20x, takze układy rodziny FT22x pozwalają na konfigurację pamięci MTP i obsługę EEPROM.
Realizacja praktyczna - izolowane galwanicznie łącze USB
Pierwszym układem izolacji, który został wypróbowany w praktyce, jest izolowana przejściówka USB<->RS232C. Taka przejściówka z pewnością kiedyś się przyda każdemu współczesnemu elektronikowi, jeśli nie w opcji RS232C, to w wersji TTL-LV.
Schemat ideowy pokazany jest na rysunku 7. Układ zasilany jest z portu USB. U1 (FT230) konwertuje dane USB na UART. Izolację galwaniczną zapewnia U3 (ADuM1402BRWZ). Konwersję poziomów z UART na RS232C realizuje U2 (MAX232).
Zasilanie strony izolowanej realizowane jest za pośrednictwem przetwornicy U7 (NME0505S). FT230 ma ograniczoną liczbę linii interfejsu UART do RX, TX, RTS, CTS. MAX232 zawiera tylko dwa konwertery TTL->232C i dwa 232C->TTL, dlatego linia DTR na złączu J1 podłączona została na stałe do napięcia ok. +10V. Taki stan linii informuje urządzenie podrzędne o gotowości terminalu. Poza sygnałami o poziomach RS232C, na J3 dostępne są sygnały TTL. Można je wykorzystać, po podłączeniu oscyloskopu lub analizatora logicznego, do analizy transmisji danych lub do komunikacji na przykład z mikrokontrolerem, o ile nie zostanie zamontowany U2.
Montaż i uruchomienie izolowanego galwanicznie łącza USB
Układ można zmontować na płytce drukowanej, której projekt pokazany jest na rysunku 8. Standardowo montujemy układ, zaczynając od elementów najmniejszych, a kończąc na największych. Fotografia wstępna pokazuje model. Układ nie wymaga uruchomienia. Konwerter można zabezpieczyć przez zwarciami, zamykając go w koszulce termokurczliwej. Dzięki temu konwerter ma niewielki rozmiary.
Wykorzystane układy mają duże możliwości. Jeżeli Czytelnicy są zainteresowani, może powstać osobny artykuł o zaawansowanych możliwościach tych układów (konfiguracja pamięci MTP) – proszę o e-maile.