Malá demonstrace jedné ne úplně příjemné a ne úplně dobře dokumentované vlastnosti FTDI USB-UART převodníků.

Půjdu rovnou na věc. FTDI používá mírně řečeno "volnou" interpretaci RTS/CTS flow-control. Zatímco STM32 zcela disciplinovaně sleduje před každým vysíláním stav CTS a pokud je v log.1 tak prostě nevysílá a počká do té doby než na CTS přijde log.0 (indikující že má FTDI místo v přijímacím bufferu), FTDI tak striktně nepracuje. Záznam na následujících oscilogramech ukazuje že FTDI bere stav svého CTS v potaz až "se spožděním". Nebo přesněji řečeno nekouká na svoje CTS před odesláním každého bytu, ale spíš před každou dvojicí nebo trojicí bytů.



Tady je chování FT232H když z PC aplikace odešlu balík šesti bytů (posílám vždy 0 aby to bylo dobře čitelné). Jakmile přijde první byte do STM32, zaplní se bufferu UARTu a STM začne signalizovat RTS výstupem že není schopné přijímat další byty (program dělá mezi čtením dat z UARTu záměrně 20us prostoje simulující "důležitou činnost"). FTDI to ale nereflektuje a posílá další dva byty. Teprve pak si přečte stav svého CTS vstupu, zmlkne a počká na jeho vynulování. Pak s drobnou prodlevou začne zase vysílat. Pojmenování RX(vstup) i RTS(výstup) jsou vztažena k STM32. Komunikační rychlost 2Mb/s.

Takové chování má přirozeně za následek naprostou nekompatibilitu s hardwarovou kontrolou toku u STM32. To nastavuje nebo nuluje svůj RTS výstup (FTDI CTS vstup) podle toho zda je v přijímacím 1 bytovém bufferu UARTu místo či ne. Pokud tam místo není (aplikace si data ještě nevyzvedla) a FTDI i přes to, že má na CTS vstupu log.1, odešle další data hrozí, že nastane "overrun" a chyba přenosu. Na oscilogramu výše taková situace nastala... z každé trojice bytů si STM stihlo přečíst pouze jeden. Stejné chování jsem ověřil i na FT234X (viz následující oscilogram).


Obdobné chování FT234X (jen s rozdílným baudrate - 3Mb/s) při vysílání 5ti bytů.


Přenos opačným směrem je bezproblémový, protože STM32 reaguje příkladně a kontroluje tok bajt po bajtu. Velmi nepříjemný je fakt že chování RTS/CTS řízení není v datasheetech k FTDI nikde nijak dokumentované (pokud hledám špatně tak mě opravte). Marně jsem hledal alespoň nějaký "setup time" pro CTS vstup - není. Jedinou poznámku, kterou jsem k dané problematice našel (a to až o hodně později) byla v sekci FAQs na webu FTDI ( odkaz ). Tam je na otázku "How does RTS/CTS flow control work in an FTDI chip?" uvedeno že FTDI zastaví přenos po odvysílání 0 až 3 bytů po detekování log.0 na CTS (což je konzistentní s chováním které jsem změřil). Abych pravdu řekl, sekce FAQ mi připadá jako ne příliš vhodné místo kde dokumentovat vcelku klíčové chování čipu

Pro úplnost uvedu že testy jsem prováděl na modulech UM232H a UMFT234XF s kitem STM32F303K8 (Nucleo-32), ale je to je vcelku irelevantní.
Doufám že tedy někdo nenaletí stejně jako já

Bastlení zdar