#この記事は
FT232HのSynchronousFIFOモードでUSB-パラレル変換した時のメモ
エコーさせたら一応上下合わせて34MB/s出せた。
#FT232H
PCと組込み機器の通信インターフェースの強い味方、FTDIが出しているICの1つ。
USBからUART,パラレル,...など内蔵EEPROMを書き換えることで、いろいろ変換できる。
PC側からは仮想COMポート(VCP)又は専用ドライバのどちらかで認識できる。
ドライバはネイティブ版と、使いにくい.NETラッパーが用意されている。
#FT245 Synchronous FIFOモード
FT245と同じインターフェースで通信するモードで、
USBを8ビットパラレル(信号線は送受兼用)に変換する。
信号はFT232Hが出力するクロック信号(60MHz)に同期している。
データシート曰くMax 40MB/s
なおVCPは使えないので、専用ドライバを触る必要がある。
#ハードウェア構成
FPGA上にシーケンサを構成し、FT232Hの制御と送受信を行う。
送受データはFT232Hのクロックとは非同期のクロックドメインとやり取りするために、
非同期FIFOをかます。
: FPGA
: --> Rx Async FIFO -->
PC <-> FT232H <-> FSM :
: <-- Tx Async FIFO <--
: :
: 60MHz : X MHz
FSMはIdle, Write, ReadyToRead, Read
の四状態で管理。
PCからの受信を優先して行うように遷移条件を書いた。
この辺りは使い方によっていろいろあると思う。
(例えばPCへ送信するだけならFSMいらない。txeを見てStall/Readyを出すだけ)
非同期FIFOはここを参考にした。
このまま使うと出力が1クロック遅れるのでFFをかまさずに出力するように変更する。
#FT232H設定
設定用ソフトFT_Progを使って、モードを245FIFO、ドライバをFTD2xxに変更する。
#通信用PCソフト
FT_ProgだけではSync.FIFOモードにはならず、Async.FIFOモードになる。
通信ソフト側で設定してやる必要がある。
こんな感じ(C#)
uint deviceID = 0; //2つ以上つながっている場合は対象のデバイスを探す必要がある
FTDI ftdev = new FTDI();
ftdev.OpenByIndex(deviceID);
ftdev.SetBitMode(0x0, FTDI.FT_BIT_MODES.FT_BIT_MODE_SYNC_FIFO); //Sync.FIFOに設定
ドライバは.NETラッパーも用意されているのでC#で書けるのだが、
使いにくいので自分でラッパー作るかラッパーのラッパーを作ったほうがいいと思う。
#動作テスト
100MBぐらいのデータをエコーさせてみた。
結果上下合計34MB/sぐらい出せた。
なお、FTDI.Write()で一度に256byte以上書き込もうとすると高確率でデータが破損した。どこに問題があるのかは現在謎。
255byte以下にしてFTDI.Write()を連発する分には問題ないが、速度は落ちる。