Tweet

FT232 シリーズの synchronous bit-bang モード

FTDI 社の FT232 シリーズには,USB - UART 変換だけでなく GPIO としても使えるものがあります. この FT232 シリーズの synchronous bit-bang について見てみました.

synchronous bit-bang とは

Application Note AN_232R-01 Bit Bang Mode Availability ... - FTDI Chip によると,

  • 内部ボーレートクロックに同期してビットデータを送受信
  • 受信データは送信データに同期してサンプルする
    • ただし,受信データサンプル → 送信データ送出 の順番で処理するので,対応する送受信データを比較すると受信データが1サンプル分遅れる

いうことになっています

ホスト環境

  • debian testing(buster)
    • Linux kernel 4.18.0
  • libftdi 0.20-4

通信ライブラリは,FTDI 純正の D2XX ではなく libftdi を,テストプログラムにはlibftdi ソース付属の baud_test を使用しました.

このテストプログラムは

0x00 0xff 0x00 0xff ...

というシーケンスを送信します. つまり,1サンプルごとに出力ポートから L → H → L → ... を繰り返し送出していることになります.

FT232RL (おそらく偽物)

IMG_20181226_012234.jpg

まず最初は,よく見かける中国製の FT232RL 基板. 価格も安かったので,おそらくは FT232RL の偽物を使用していると思われます.

この基板をホスト PC に接続し,コマンドラインからテストコマンドを実行します.

$ ./baud_test -m s -b 10000 -c 128
real baudrate used: 10000
this test should take 10.00 seconds
and took 41.4536 seconds, this is 2412 baud or factor 0.241

で,FT232RL の TxD ピンをオシロで見ると,以下のような波形が出力されていました.

IMG_20181227_030102.jpg

…何じゃこりゃ.

画面の時間軸(横軸)1マス分が 100 μs = 1/10000[bps] になるよう設定しているので,1マスごとに規則正しく L → H → L → ... という信号が出ていることを期待してたのですが,信号の変化点,つまりサンプルの出力が不定間隔になっています.

描画ごとに輝線を消さない persist モードで観測してみると

IMG_20181227_030202.jpg

このようになりました.

信号の変わり目は 100 μs の倍数にはなっていることがわかります.

また,テストコマンドの実行結果出力では factor 0.241 と出力されており,出力レートが理想値の 1/4 ほどになっていることになります. データ出力が滞っているためでしょう.

FT2232D

IMG_20181226_012353.jpg
IMG_20181226_012604.jpg

次はOlimex 社の ARM-USB-TINY です. 内部で FT2232D を使用しています.

FT2232D の偽物が出回っているという話は聞かないので,これについてはおそらく本物でしょう.

で,同様にコマンドを実行.

$ ./baud_test -p i:0x15ba:0x0004 -m s -b 10000 -c 128
real baudrate used: 10000
this test should take 10.00 seconds
and took 39.7634 seconds, this is 2515 baud or factor 0.251

出力波形と persist 表示.

IMG_20181229_023659.jpg
IMG_20181229_023812.jpg

FT232RL(偽)と同様に 100μs ごとの不定間隔で出力されています.

ホンモノでも同じ動きをするんだなぁ.

FT2232H

IMG_20181226_012330.jpg

最後に FT2232H. USB 2.0 high speed (480Mbps) で UART が2回路入りのものです.

FTDI 社から出ている FT2232H-56Q モジュールです. これもおそらく本物でしょう.

コマンドラインからテストプログラムを実行します.

$ ./baud_test -p i:0x0403:0x6010 -m s -b 10000 -c 128
real baudrate used: 10000
this test should take 10.00 seconds
and took 7.7110 seconds, this is 12969 baud or factor 1.297

出力波形はこちら.

IMG_20181229_030516.jpg

今度は H → L → H → … と規則正しく出力されています. が,よく見ると出力間隔が若干短いような. 画面上では 12820 bps と読めます. テストプログラムの実行結果でも出力速度が 1.297 倍とあります. FT2232H 側の問題なのか libftdi 側の問題なのかは不明.

考察とまとめ

機能

USB full speed (12Mbps) 系のデバイス (FT232RL, FT2232D) では,出力タイミングが一定間隔にならないという現象が見られました. UART のように受信側でタイミングを取るインターフェースの場合,これは問題となります. が,I2C や SPI のように送信側から送信ビットとクロックを送る場合,案外問題にならないと思われます. 用途を選んで使ってやれば使えないこともない,といったところでしょうか.

一方,USB high speed (480Mbps) 系の FT2232H では出力タイミングは一定してますが,設定したビットレートよりも 1.3 倍弱速いという現象が見られました. おそらくは libftdi 側の問題だとは思いますが,詳細は不明です. まぁ,問題があるにしてもビットレートの設定値を調整すればよいので,そこはたいした問題ではないでしょう.

コスト

趣味で使う場合は,特性を知った上で FT232RL の偽物の乗った基板モジュールを使うというのはアリかな,と思います.安価ですし.

規則正しい出力が欲しい場合は,FT(2)232H を使うべきかというと…微妙です. FT232H は基板モジュールの形では ¥2,000 前後で売られていますが,それだっら適当なマイコン基板にプログラムを書き込んで使ったほうが安上がりです.

ただ,仕事で使う場合,「マイコン基板へのファームウェア書き込み」「ファームウェアプログラムや設計文書の維持」という,原価には見えないコストがかかってきます. FT(2)232H ならばデバイスへのファームウェア書き込みは不要で,ホスト PC のプログラムのメンテナンスだけで済みます. 生産台数・方法にもよりますが,部品単価の安いワンチップマイコンを使わずに敢えて FT(2)232H を使うという選択もアリかと思います.


添付ファイル: fileIMG_20181229_030516.jpg 74件 [詳細] fileIMG_20181229_023812.jpg 63件 [詳細] fileIMG_20181229_023659.jpg 74件 [詳細] fileIMG_20181227_030202.jpg 80件 [詳細] fileIMG_20181227_030102.jpg 80件 [詳細] fileIMG_20181226_012330.jpg 76件 [詳細] fileIMG_20181226_012604.jpg 66件 [詳細] fileIMG_20181226_012353.jpg 73件 [詳細] fileIMG_20181226_012234.jpg 73件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-12-31 (月) 01:49:05 (389d)