I2C通信

マイコンからIOエクスパンダのような他のICを制御するには、マイコンと対象のICの間で何らかの通信を行わなければなりません。

本コースで用いるMCP23017は、「I2C(アイ・スクエアド・シー,アイ・ツー・シー)」という方式による通信インターフェースを備えています。

I2C (Inter-Integrated Circuit) はIC間の通信に広く用いられているシリアル方式の通信規格で、I2Cインターフェースを備えているマイコンも多く、本コースで用いるESP32にもI2Cインターフェースが備わっています。

図11-5 I2C通信の配線

I2Cの信号線は「シリアルデータ(SDA)」と「シリアルクロック(SCL)」の2つからなっており、SCL線でデータを送るタイミングを、SDA線で実際のデータの値を送信します。また、SCLおよびSDAは適切な大きさの抵抗を介してHレベルの電圧に接続されている必要があり、これを「プルアップ」といいます(プルアップについては、次のSTEP12で詳しく触れます)。

I2Cでは、通信を制御する側を「マスター」、制御される側を「スレーブ」と呼び、今の場合はESP32がマスター、MCP23017がスレーブになります。また、1台のマスターに対して同じ信号線上に複数のスレーブを接続可能です。

I2Cで必要な信号線は2本だけであり、さらに複数のスレーブが同じ信号線を共有可能なため、マスター側の使用端子を最小限に抑えられます。

ESP32は標準では21番端子がSDA、22番端子がSCLになっており、プログラム例ではこれらの端子を使うことにしています。また、ESP32の内部でSCLおよびSDAのプルアップが行われています。

図11-6 ESP32とMCP23017の配線

I2Cの通信方法

マイコンからICにデータを送って書き込みたい場合は、以下のような流れになります。

  1. 通信開始の合図、対象のICのアドレス、書き込み要求を送信。
  2. データを1バイトずつ送信。
  3. データの送信が完了したら、通信完了の合図を送る。

対象となるICは通常は複数のレジスタを持っており、送信データの1バイト目でレジスタのアドレスを指定し、2バイト目以降で実際に書き込むデータを送信する、という形が一般的です。

図11-7 I2CでのICへのデータ書き込み

次の記事

I2C通信の関数