LoginSignup
8
7

More than 5 years have passed since last update.

FT232H 245 Sync.FIFOモードを使ってみる

Last updated at Posted at 2015-12-09

この記事は

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()を連発する分には問題ないが、速度は落ちる。

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7