IOエクスパンダとの通信
MCP23017のアドレス
I2C通信では、同じ信号線上に複数のIC(スレーブ)を接続可能であり、各ICは各々が持っている固有のアドレスで区別されます。
通信を行うには対象のICのアドレスを指定する必要がありますが、このアドレスの指定は接続されているICがひとつだけの場合も必要です。
アドレスの長さは7ビットで、MCP23017の場合、アドレス設定ピンの設定により0x20〜0x27の値を設定できます。
ICのアドレスの各ビット | ||||||
---|---|---|---|---|---|---|
6 | 5 | 4 | 3 | 2 | 1 | 0 |
0 | 1 | 0 | 0 | A2 | A1 | A0 |
(固定のビット値) | アドレス設定ピン |
本コースのMCP23017のアドレス設定ピンは、プルアップ(次のSTEP12参照)された上でメインボード上でDIPスイッチSW9に接続されています。ピンの値はスイッチがOFFの場合は1、ONの場合は0になり、スイッチが全てOFFの場合のアドレスは0x27、全てONの場合は0x20になります。
MCP23017の入出力端子とレジスタ
MCP23017は「GPIOA」「GPIOB」の2つのポートを持っており、各ポートには8本の入出力端子があります。
また、入出力端子の制御等を行うレジスタとして、1バイトのレジスタを22個持っています。ドットマトリクスLEDを制御するのに使いたい、すなわち出力端子として使いたい場合に用いるのは、以下のレジスタです。
レジスタ名 | アドレス | 初期値 | レジスタの機能 |
---|---|---|---|
IODIRA | 0x00 | 0b11111111 | GPIOAポートの各ピンが入力(1)か出力(0)かを各ビットで指定する。初期値は全て入力。 |
IODIRB | 0x01 | 0b11111111 | GPIOBポートの各ピンが入力(1)か出力(0)かを各ビットで指定する。初期値は全て入力。 |
GPIOA | 0x12 | 0b00000000 | GPIOAポートの各ピンの出力レベルがHレベル(1)かLレベル(0)かを各ビットで指定する。初期値は全てLレベル。 |
GPIOB | 0x13 | 0b00000000 | GPIOBポートの各ピンの出力レベルが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番にそれぞれ接続しています。