IOエクスパンダとの通信

MCP23017のアドレス

I2C通信では、同じ信号線上に複数のIC(スレーブ)を接続可能であり、各ICは各々が持っている固有のアドレスで区別されます。

通信を行うには対象のICのアドレスを指定する必要がありますが、このアドレスの指定は接続されているICがひとつだけの場合も必要です。

アドレスの長さは7ビットで、MCP23017の場合、アドレス設定ピンの設定により0x20〜0x27の値を設定できます。

ICのアドレスの各ビット
6543210
0100A2A1A0
 (固定のビット値) アドレス設定ピン
MCP32017のアドレス

本コースのMCP23017のアドレス設定ピンは、プルアップ(次のSTEP12参照)された上でメインボード上でDIPスイッチSW9に接続されています。ピンの値はスイッチがOFFの場合は1、ONの場合は0になり、スイッチが全てOFFの場合のアドレスは0x27、全てONの場合は0x20になります。

MCP23017の入出力端子とレジスタ

MCP23017は「GPIOA」「GPIOB」の2つのポートを持っており、各ポートには8本の入出力端子があります。

また、入出力端子の制御等を行うレジスタとして、1バイトのレジスタを22個持っています。ドットマトリクスLEDを制御するのに使いたい、すなわち出力端子として使いたい場合に用いるのは、以下のレジスタです。

レジスタ名アドレス初期値レジスタの機能
IODIRA0x000b11111111GPIOAポートの各ピンが入力(1)か出力(0)かを各ビットで指定する。初期値は全て入力。
IODIRB0x010b11111111GPIOBポートの各ピンが入力(1)か出力(0)かを各ビットで指定する。初期値は全て入力。
GPIOA0x120b00000000GPIOAポートの各ピンの出力レベルがHレベル(1)かLレベル(0)かを各ビットで指定する。初期値は全てLレベル。
GPIOB0x130b00000000GPIOBポートの各ピンの出力レベルがHレベル(1)かLレベル(0)かを各ビットで指定する。初期値は全てLレベル。

レジスタに書き込みを行いたい場合、送信データの1バイト目でレジスタのアドレスを指定し、2バイト目で実際に書き込むデータを送信します。

書き込みデータは複数バイトを同時に送信することもでき、書き込みデータの2バイト目(送信データの3バイト目)以降は、続くレジスタに順次書き込まれていきます。

IOエクスパンダとマイコン、ドットマトリクスLEDの配線

ここで、IOエクスパンダとマイコンおよびドットマトリクスLEDの配線を確認しましょう。

先述のとおり、ESP32は標準では21番端子がSDA、22番端子がSCLになっており、ここではこれらをIOエクスパンダ側のSDA、SCLに接続しています。

IOエクスパンダとドットマトリクスLEDの接続は、GPIOAポートの0〜7番端子をドットマトリクスLEDのアノード側の0〜7番に、GPIOBの0〜7番端子をカソード側の0〜7番にそれぞれ接続しています。

図11-4 配線(再掲)

前の記事

ソースコードの分割の目的

次の記事

条件分岐