ESP32-WROOMから、APDS-9930を制御するために、I2C通信の使い方を確認していく。使用環境は、PlatformIOでArduinoフレームワーク。APDS-9930用のライブラリもあるようだが、今回はWireを直接使っていく。
Wireの初期化
#include <Arduino.h>
#include <Wire.h>
void setup() {
Wire.begin();
Wire.setClock(400000);
}
最初にbeginを実行。デフォルトの端子を使うのであれば、引数なしで良い。クロックはデフォルトだと100kHzになっているらしい。遅いので400kHzに設定しておく。(ただし、後述のように実際には400kHzにはなっていない)
Write
Wire.beginTransmission(APDS9930_ADDRESS);
Wire.write(0x80);
Wire.write(0x00);
Wire.endTransmission(true);
beginTransmissionとwriteでは、通信は何も実行されておらず、endTransmissionで実際の通信がまとめて実行されることに注意。
Read
Wire.beginTransmission(APDS9930_ADDRESS);
Wire.write(0xB8);
Wire.endTransmission(false);
Wire.requestFrom(APDS9930_ADDRESS,2);
unsigned int val = Wire.read();
val += Wire.read() << 8;
ここでのReadは、I2Cではよく使われている、コマンドやアドレスを送信した後にリピートスタートでデータを受信するという形である。
前半は先程のWriteと同様の手順だが、endTransmissionでfalseを指定すると、リピートスタートの指定となり、ここでもまだ通信が実行されない。続いてrequestFromを実行することで、コマンド送信とデータ受信がまとめて実行されるようになっている。受信したデータはバッファからreadで読み出す。
実際の波形
実際の通信波形をオシロで観測した。1バイトのRead、2バイトのRead、1バイトのWrite、1バイトのReadという一連の通信になっている。
下は一部の波形を拡大したもの。400kHzに設定したクロックがなぜか300kHzになっている。今後確認してみる予定である。
1バイトのReadを拡大したもの。1バイトの送信の後、リピートスタートで1バイトの受信となっていることがわかる。所要時間は全体で約150usとなっている。
- 投稿タグ
- I2C