
Wydawać się może, że na temat konwerterów USB napisano już wszystko i nic nowego się nie pojawi. Nic bardziej mylnego.
Najczęściej stosowane są konwertery USB-UART. Mają one szereg wad odczuwalny zwłaszcza przy współpracy z AVR a co za tym idzie większością Arduino. Wykorzystanie UART stwarza problemy, bo:
- AVR mają mało UART. Jest to szczególnie odczuwalne w przypadku ArduinoUNO. Niektóre AVR mają 2 UART, nieliczne mega 4 ale to już obudowy 100pin.
- Generator AVRmega/tiny musi być stabilizowany rezonatorem kwarcowym. Wbudowany RC ma zbyt małą stabilność aby wykorzystać go z UART.
- Wbudowane FIFO nie spełnia swojej roli. Mostki mają FIFO ale co z tego jak znaki, które przyszły z USB są wysyłane do UART czy uC tego chce czy nie *(wyjaśnienie na końcu). 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 uC.
- Nie można stwierdzić czy USB HOST jest przyłączony czy nie.
- Konfigurację mostka czyli VID, PID, desktyptor, funkcje GPIO (np przyłączonych LED), itd można przeprowadzić (o ile można bo w np CP2101 nie) tylko z poziomu komputera odpowiednią aplikacją, dla FTDI FT_PROG. Nie można tego zrobić z poziomu uC.
Wszystkie wyżej wymienione problemy rozwiązuje mostek USB-I2C udostępniając dodatkowo ok 1kB EEPROM. Wszystko to za sprawą układu FT201. Układ ten pracuje po magistrali I2C. Dzięki temu nie tracimy drogocennego dla AVR UART a uC nie musi mieć stabilnego generatora. I2C umożliwia zarówno transmisję danych jak i konfigurację układu, odczyt statusu czy obsługę EEPROM. Do pamięci konfiguracji (MTP) i EEPROM ma dostęp zarówno uC jak i HOST za pośrednictwem bibliotek D2XX. Dzięki temu, programując uC nie trzeba dodatkowo konfigurować mostka, może to zrobić uC. Opcja bardzo wygodna przy seryjnej produkcji. Cena układu FT201 jest porównywalna z ceną FT232RL.
W czasach gdy zajmowałem się AVR-ami, FT201 i podobny do niego FT22x (USB-SPI) stał się moim ulubionym mostkiem USB. Teraz wrócił do łask mino, że używam ARM STM32, w których USB to niejako standard. FT201 przydaje się wszędzie tam gdzie potrzebuje galwanicznie izolowanego interfejsu USB. Do izolacji USB można użyć np układu ADuM1460 ale FT201 jest tańszy.
O budowie urządzenia niewiele można napisać (schemat w załączniku, plik "FT201_rev2001.pdf") poza tym, że dodałem izolator galwaniczny na liniach I2C. O takiej izolacji często zapominają producenci sprzętu pomiarowego takiego jak oscyloskopy, generatory itp. Izolację zapewnia ADuM1251

Szeroki zakres napięć zasilających powoduje, że poza izolacją galwaniczną układ może pełnić także funkcję konwertera poziomów. Oznaczenia SCL i SDA na układzie są umowne bo oba bloki konwertera zbudowane są w ten sam sposób. FT201 akceptuje na I2C napięcie 5V dlatego układ został zasilony z USB, dzięki czemu nie obciąża stabilizatora w FT201. Na oscylogramie widać wysyłanie danych do FT201:

W załączniku, poza schematem konwertera (UWAGA! Na PCB opis linii SCL i SDA jest zamieniony), umieściłem notę aplikacyjną układu oraz dokument opisujący sposób konfiguracji konwertera, pamięci MTP i inne materiały.
Układ testowałem z płytką NUCLEO L412:

Podstawowa obsługa (jak mostków UART) jest banalna. Pod domyślny adres 0x44 (0x22) wysyłamy daną. Jeśli otrzymamy ACK to ok, jak nie to znaczy, że FIFO jest zapchane. Odczyt równie banalny. Adresujemy slave 0x44 (0x22) do odczytu, jeśli jest ACK to znaczy, że jest co najmniej jeden znak w FIFO, jeśli nie to nie ma nic. Prosty program odsyła odebrane znaki oraz co 2 sekundy napis "Ramka" i jej nr kolejny:

Program w załączniku (plik "F20x_FT22x_NucleoF411RB-P 20200208 105437.zip").
Na STM32 nie testowałem bardziej zaawansowanych funkcji układu, bo zrobiłem to już wcześniej dla AVR (załącznik, plik "FT201.c"). Tam można zobaczyć jak odczytywać/zapisywać pamięć MTP, wolny obszar EEPROM, czytać status układu, liczbę znaków do odebrania itd.
Na koniec warto wspomnieć o układach FT220 i 221. Oba komunikują się z uC po SPI. Pierwszy z nich, 500kb/s od strony USB, posiada SPI 1/2/4-bit. Drugi, 1Mb/s, SPI 1/2/4/8 bit.
* - 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 Hoście przez API. Nawet jak HOST przestanie wysyłać dane, to i tak co już wcześniej wysłano będzie musiało zostać wytransmitowane przez UART układu FTDI. Bardziej obrazowo, stan linii CTS i DTR nie ma wypłwu na wysyłanie danych z FTDI. Jeśli więc przerwania w uC zostaną zawieszone na zbyt długo, FIFO w uC przepełni się, znaki zostaną utracone.
Jeśli przezornie, zmienimy stan linii CTS/DTR (aplikacja musi na to reagować!) i poczekamy na opróżnienie FIFO FTDI, to wszystko będzie dobrze z tym, że potrzebujemy do tego dodatkowej linii GPIO w uC. W przypadku FT201 do wszystkiego wystarczają linie I2C.
Cool? Ranking DIY