🤮

FTDIのUSBシリアルI/Fを使ってI2CやSPIデバイスを叩く[MPSSE]

2024/12/16に公開

概要

ハードウェアの開発中に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の読み出し)

  1. Channel Optionsで通信に使うインターフェースと速度を設定。3-Phase Clockingのチェックは必ずON!
  2. Write DataにEEPROMの読み出し開始アドレスを入力。
  3. Read Sizeに受信したいデータサイズを入力。
  4. Address欄にI2Cの7ビットアドレスを入力。アドレスがわからない?だったらScanボタンをクリックすると、I2Cバスに接続されている7ビットアドレスのデバイスを列挙できるよ。i2cdetectと同じだね。
  5. Write>Readボタンをクリック。Writeの後にリピートスタートコンディションを自動で発行してReadします。
  6. 履歴リストにReadの項目と先頭16バイトが表示されました。ダブルクリックすると全データを閲覧できます。

使ってみよう! SPI編 (EEPROM 25LC02の読み出し)

  1. Channel Optionsで通信に使うインターフェースと速度、SPIの通信モード諸々を設定。
  2. Write Dataに読み出しコマンド03と読み出し開始アドレスを入力。
  3. Read Sizeに受信したいデータサイズを入力。
  4. Write>Readボタンをクリック。Writeの後にCSをネゲートせず連続してReadします。
  5. 履歴リストにReadの項目と16バイトが表示されました。

コマンドライン版の紹介

下のスクリーンショットはExcelのVBAを使い、5秒ごとにコマンドライン版i2cutilを外部プロセスとして呼び出し、気圧(MPL3115A2)・温湿度(AHT21B)センサからデータを取得してリアルタイムにグラフ化している様子です。他のアプリケーションと連携するときは、コマンドライン版を使用すると便利です。

参考文献

FTDIアプリケーションノート

NXPアプリケーションノート

MPSSE使用例

プッシュプルで動くMPSSEを使うとI2Cでも爆速でOLEDの画像を転送できます。
https://youtu.be/ZqRmooaa9cc

Discussion