Embedded Test 06 · I²C と SPI — 周辺 IC との会話を盗聴し、なりすます

Chapter 06

I²C と SPI — 周辺 IC との会話を盗聴し、なりすます

この章のゴール.

I²C と SPI の仕組みを押さえ、バスの通信を受動観測して意味を復元でき、 さらにマスタ/スレーブになりすまして能動テスト(偽センサ、レジスタ改変)ができるようになること。

この章で使う既出の用語(定義は各リンク先). USB(01 章 2 節)、アナログ(01 章 2 節)、オラクル(01 章 8 節)、テストダブル(02 章 7 節)、判定(02 章 1 節)、電源(02 章 2 節)、プロトコルデコーダ(04 章 4 節)、ロジックアナライザ(04 章 1 節)

1. MCU 周辺の 2 大バス

MCU はセンサ・EEPROM・ADC・ディスプレイ・無線モジュールと、たいてい I²C か SPI でつながる。 これらのバスを観測すれば、「MCU がどの IC に何を書き、何を読んでいるか」——つまりMCU の意図が読める。周辺コンポーネントの状況把握の中心である。

I²CSPI
線2 本(SCL クロック、SDA データ)+ GND4 本(SCLK、MOSI、MISO、CS)+ GND
アドレス7/10 ビットアドレスで相手を選ぶCS(チップセレクト)線で相手を選ぶ
速度100k/400k/1M Hz数 M〜数十 MHz(速い)
相手数多数(アドレスで区別)CS の数だけ
特徴配線少・低速・ACK あり高速・全二重・線が多い
I²C は 2 本で多数、SPI は速いが線が多いI²CMCUSDASCLIC①IC②配線少・低速・ACK あり・アドレスで区別SPIMCUMOSIMISOSCKCSIC高速・全二重・CS の数だけ線が増えるどちらも受動的に「盗聴」してバスの会話を読める(クロックがあるので復元は容易)SDA=データ線 / SCL=クロック線 / MOSI・MISO=送受信データ / SCK=クロック / CS=チップ選択
図6-1 I²C と SPI の結線と性格。

2. 受動観測 — バスを盗聴する

ロジックアナライザ(04 章)を SCL/SDA(I²C)または SCLK/MOSI/MISO/CS(SPI)に当て、プロトコルデコーダを掛ける。

I²C の 1 トランザクションは「スタート → アドレス + R/W → ACK → データ… → ストップ」。デコーダはこれを表にする。

S  0x68+W  A  0x3B A  ...          ← アドレス 0x68(MPU-6050 等)のレジスタ 0x3B を指定
S  0x68+R  A  0x01 A 0x2C A ...     ← リスタートして読み出し(加速度データ)

観測から分かること:

チップ専用デコーダを重ねると、生のレジスタ値が「加速度 X = 0.98 G」のように意味づけされる(04 章のデコーダスタック)。

3. 能動テスト①: MCU 側になりすます(周辺 IC を直接叩く)

バスに自分がマスタとしてアクセスし、周辺 IC を直接読み書きする。「MCU がやるべきこと」を人間が代わりにやって、周辺が正しいか、あるいは MCU が正しく設定したかを確認する。

from smbus2 import SMBus
bus = SMBus(1)
who = bus.read_byte_data(0x68, 0x75)      # WHO_AM_I レジスタ
assert who == 0x68, f"チップ ID 不一致: {who:#x}(配線 or はんだ不良の疑い)"

用途: 周辺 IC の実装(はんだ・配線)検査、MCU が書いた設定レジスタの読み戻し確認、既知良品との比較。

4. 能動テスト②: 周辺 IC になりすます(偽センサ)

もっと強力なのが、自分がスレーブ(センサ役)になって MCU に偽の値を返すこと。これがテストダブル(02 章)の真骨頂である。

偽センサ——本物が出さない異常値を注入して反応を見るテスト対象MCUAI 生成ファーム偽センサMCU/ボードで I²Cスレーブを演じるSDA/SCL−40 ℃ / 上限値NACK(応答なし)途中でフリーズMCU がクリップ・無視・クラッシュのどれをするかを観測する
図6-2 偽センサによる異常値注入。

これで検証できること:

5. SPI 特有の注意

6. 何をオラクルにするか

7. 手を動かす

バスの会話を読み、偽の値を返す


この章のポイント