I2C通信の関数
Arduinoフレームワークでは、I2Cインターフェースを扱うための関数類が提供されており、簡単にI2C通信を行うことができます。
インクルードファイル
#include <Wire.h>
Code language: Arduino (arduino)
I2C通信を行うための関数の宣言等が行われているヘッダファイルを読み込みます。
I2C通信の初期化
Wire.begin();
Code language: Arduino (arduino)
I2C通信の初期化を行います。I2C通信を行う前に一度だけ実行します。
I2C通信の開始
Wire.beginTransmission(address);
Code language: Arduino (arduino)
引数addressで指定したアドレスのスレーブと通信を開始します。
I2C通信で送信するデータの設定
Wire.write(data);
Code language: Arduino (arduino)
I2C通信でスレーブに送信するデータ(1バイト)を設定します。
ここで設定したデータはこの段階ではマイコン内に保存され、実際のデータの送信は次のWire.endTransmission関数の実行時に行われます。
Wire.writeを複数回実行すると、送信データはマイコン内に順番に蓄積されます。
I2Cデータ通信の完了(実際のデータの送信)
Wire.endTransmission();
Code language: Arduino (arduino)
Wire.writeで設定したデータをスレーブに送信し、I2Cデータ通信を完了します。
送信例
それでは、プログラム例内のI2C通信部分を見てみましょう。
以下はIOエクスパンダの端子の出力レベルの設定を行う部分です。
// IOエクスパンダのピンの初期値の設定
Wire.beginTransmission(ioxAdr); // IOエクスパンダとの通信の開始
Wire.write(0x12); // レジスタのアドレスの設定(0x12=GPIOA出力レベル設定レジスタ)
Wire.write(0b00000001); // GPIOAのピンの出力レベルの設定(0x12=GPIOA出力レベル設定レジスタ)
Wire.write(0b11111110); // GPIOBのピンの出力レベルの設定(0x13=GPIOB出力レベル設定レジスタ)
Wire.endTransmission(); // データを送信し通信を完了
Code language: Arduino (arduino)
まず、Wire.beginTransmission関数でIOエクスパンダのアドレス(ioxAdr=0x27)を指定し、通信を開始しています。
次に、Wire.write関数で「0x12」「0b00000001」「0b11111110」の3つの値を順に設定しています。
最初の「0x12」はレジスタのアドレスを示します。
続く「0b00000001」「0b11111110」の2つの値が書き込みデータです。本コースで用いるMCP23017は、書き込みデータの2バイト目(送信データの3バイト目)以降は続くレジスタに順次書き込まれる仕様になっているので、「0b00000001」は最初に指定した「0x12」に、「0b11111110」は続く「0x13」に書き込まれます。
なお、0x12=GPIOA出力レベル設定レジスタに書き込む「0b00000001」は「0番ピンをHレベルに、他をHレベルに」という設定で、0x13=GPIOB出力レベル設定レジスタに書き込む「0b11111110」は「0番ピンをLレベルに、他をHレベルに」という設定です。