FTDIのUSBシリアルI/Fを使ってI2CやSPIデバイスを叩く[MPSSE]
概要
ハードウェアの開発中にI2CやSPIデバイスのレジスタを弄りたい時、皆さんはどうやっていますか?その場限りだと思いながら、間に合わせで再利用できないテスト用のコードを必死で書いていませんか?
今回紹介するのは、FTDIのUSBシリアルI/Fを使い、I2CやSPIの通信テストをするために作ったソフトの紹介です。マイコンを使わずPCだけでデバッグ作業を完結でき、LinuxのI2C Toolsみたいに自由が効くソフトが欲しくて作りました。
<< MPSSE_Utils ダウンロード ver.2.1 @GoogleDrive >>
利用シーン
- I2CやSPIのレジスタを手軽に弄くりまわせる汎用ツールが欲しい
- シリアルEEPROMのデータを手軽に読み書きしたい
- 急場しのぎではなく恒久的に使える完成されたツールが欲しい
- マイコンとかで専用ハードを作るのは面倒くさい
- 他のソフトと連携して自動でデータを取り込みたい
動作環境
- Windows 7以降のPC
- FTDIのMPSSEに対応しているコンバータICが載ったUSBシリアルI/Fを用意してください。対応品種は FT2232D, FT2232H, FT4232H, FT232H (おすすめはFT232Hです)
いずれのコンバータICもマスターデバイスとして動作します。I2Cの通信はクロックストレッチやマルチマスターには対応していません。レジスタをいじるだけなら特に問題にならないでしょう。
ソフトの構成
ソフトはI2C用とSPI用に分かれていて、それぞれGUI版とコマンドライン版があります。このページは紹介用のため、GUI版に絞って解説します。アーカイブにはすべてのバージョンと解説マニュアルを入れてあるので、詳しく知りたい方はそちらをご覧ください。
GUI版は初心者でもとっつきやすく、チマチマ解析する人向け。
I2C GUI版
SPI GUI版
コマンドライン版は、通信データをファイルに保存して他のアプリと連携したり、スクリプトを書いて自動実行することができます。
接続方法
I2C
DBUS0をSCLへ、DBUS1とDBUS2を短絡してSDAへ接続、SCLとSDAを外部でプルアップしてください。
SPI
DBUS0をSCK、DBUS1をMOSI、DBUS2をMISO、DBUS3をCSへ接続してください。DBUS4~7を追加のCSとして割り当てることができ、最大5つのスレーブデバイスと独立して通信できます。MISOはコンバータIC内に弱プルアップが内蔵されているので、端子はオープンでも使用できます。ポートがクローズされている時や初期化前のCSピンは全て弱プルアップ・ハイインピーダンスになっています。必要に応じてプルアップ・プルダウン処理を行ってください。
GUI版クイックガイド
I2C SPI 共通の操作
送信データの入力方法
Write Dataはデバイスアドレスを含まない送信データで、以下の形式で最大65,536バイトまで入力できます。Bin LoadやBin Appendボタンを使って、既存のバイナリファイルを送信バッファに取り込む事もできます。
入力文字 | 解釈 | |
---|---|---|
1A2A3A | 1Ah 2Ah 3Ah | スペースを開けずに書く基本的な書き方 |
1A2A3AB | 1Ah 2Ah 3Ah 0Bh | 余った1文字は下の桁扱い |
1A 2A3A | 1Ah 2Ah 3Ah | スペースで区切ることが可能 |
'String | 53h 74h 72h 69h 6Eh 67h | ' を前置して文字列をベタ打ちできる! |
80 'STR 00 | 80h 53h 54h 52h 00h | 組み合わせも可能 |
"'A STR" | 41h 20h 53h 54h 52h | スペースや特殊文字は""で囲む |
80 "'""" 00 | 80h 22h 00h | " 文字を入れたい場合は "" と二つ並べる |
スペースを使った文字列の分離にCSVパーサを使っているので、スペースやダブルクォテ―ションの扱いが多少煩雑になっています。ややこしければ16進数で入力してください。
受信データの見方
ウィンドウ下部の履歴リストに受信したデータが16バイト分表示されます。リストをダブルクリックすると全データを閲覧できるデータビューアが表示されます。
データビューアはバイナリエディタ風のテキスト表示のほか、16進数表示やASCIIベタ表示に変更することもできます。
使ってみよう! I2C編 (EEPROM 24LC256の読み出し)
- Channel Optionsで通信に使うインターフェースと速度を設定。3-Phase Clockingのチェックは必ずON!
- Write DataにEEPROMの読み出し開始アドレスを入力。
- Read Sizeに受信したいデータサイズを入力。
- Address欄にI2Cの7ビットアドレスを入力。アドレスがわからない?だったらScanボタンをクリックすると、I2Cバスに接続されている7ビットアドレスのデバイスを列挙できるよ。i2cdetectと同じだね。
- Write>Readボタンをクリック。Writeの後にリピートスタートコンディションを自動で発行してReadします。
- 履歴リストにReadの項目と先頭16バイトが表示されました。ダブルクリックすると全データを閲覧できます。
使ってみよう! SPI編 (EEPROM 25LC02の読み出し)
- Channel Optionsで通信に使うインターフェースと速度、SPIの通信モード諸々を設定。
- Write Dataに読み出しコマンド03と読み出し開始アドレスを入力。
- Read Sizeに受信したいデータサイズを入力。
- Write>Readボタンをクリック。Writeの後にCSをネゲートせず連続してReadします。
- 履歴リストにReadの項目と16バイトが表示されました。
コマンドライン版の紹介
下のスクリーンショットはExcelのVBAを使い、5秒ごとにコマンドライン版i2cutilを外部プロセスとして呼び出し、気圧(MPL3115A2)・温湿度(AHT21B)センサからデータを取得してリアルタイムにグラフ化している様子です。他のアプリケーションと連携するときは、コマンドライン版を使用すると便利です。
参考文献
FTDIアプリケーションノート
- AN_135 MPSSE Basics (重要)
- AN_177 User Guide For libMPSSE I2C (重要)
- AN_178 User Guide For libMPSSE SPI (重要)
- AN_108 Command Processor for MPSSE and MCU Host Bus Emulation Modes
- AN_184 FTDI Device Input Output Pin States
- AN_411 FTx232H MPSSE I2C Master Example in Csharp
- AN_113 Interfacing FT2232H Hi-Speed Devices To I2C Bus
- FT_000071 D2XX Programmer's Guide
- AN-232B-03 Optimising D2XX Data Throughput
- AN-232B-04 Data Throughput, Latency & Handshaking
NXPアプリケーションノート
MPSSE使用例
プッシュプルで動くMPSSEを使うとI2Cでも爆速でOLEDの画像を転送できます。
Discussion