I2C通信
マイコンからIOエクスパンダのような他のICを制御するには、マイコンと対象のICの間で何らかの通信を行わなければなりません。
本コースで用いるMCP23017は、「I2C(アイ・スクエアド・シー,アイ・ツー・シー)」という方式による通信インターフェースを備えています。
I2C (Inter-Integrated Circuit) はIC間の通信に広く用いられているシリアル方式の通信規格で、I2Cインターフェースを備えているマイコンも多く、本コースで用いるESP32にも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のプルアップが行われています。
I2Cの通信方法
マイコンからICにデータを送って書き込みたい場合は、以下のような流れになります。
- 通信開始の合図、対象のICのアドレス、書き込み要求を送信。
- データを1バイトずつ送信。
- データの送信が完了したら、通信完了の合図を送る。
対象となるICは通常は複数のレジスタを持っており、送信データの1バイト目でレジスタのアドレスを指定し、2バイト目以降で実際に書き込むデータを送信する、という形が一般的です。