Warning: count(): Parameter must be an array or an object that implements Countable in /home/green-rabbit/rabbit-note.com/public_html/wp-content/plugins/wordpress-ping-optimizer/cbnet-ping-optimizer.php on line 533

ESP32 の I2C 通信クロックストレッチ対応 (Arduino 編)

Arduino を使った ESP32 の I2C 通信におけるクロックストレッチ対応について注意点を紹介します.

はじめに

前回,ESP-IDF を使った場合についてまとめましたので,今回は Arduino を使った場合の注意点についてまとめます.

注意点

結論としては下記になります.

  • ハードウェア制約により,クロックストレッチできる期間は最大 13ms
  • 追加設定は不要

以降で,順に説明していきます.

クロックストレッチできる期間は最大 13ms

これは,ハードウェアの制約のため,ESP_IDF 編と同じです.

ESP32 のクロックストレッチのタイムアウト時間は,下記の I2C_TIME_OUT_REG レジスタに設定します.単位は APB clock cycles となっており,このクロックの周波数は 80MHz です.

レジスタのサイズは 20bit なので,最大値は 0xFFFFF となります.0xFFFFF / 80MHz = 13ms ですので,クロックストレッチできる最大時間は 13ms となります.

I2C 通信を 400kHz で行っている場合,13ms は 5,200 サイクルに相当しますので,通常問題になることはないと思いますが,特殊なデバイスを使っている場合注意が必要かもしれません.

追加設定は不要

ESP-IDF とは違い,Arduino を使う場合,上記レジスタには自動的に最大値が設定されます.

具体的には下記の順で呼び出される i2cProcQueue の中で設定されます.

  • Wire.cpp TwoWire::requestFrom
  • Wire.cpp TwoWire::readTransmission
  • esp32-hal-i2c.c i2cRead
  • esp32-hal-i2c.c i2cProcQueue

i2cProcQueue の中には次の処理があります.

動作サンプル

上記を踏まえた I2C 通信のサンプルを紹介します.題材としては,ESP-IDF の場合と同様に温湿度センサである SHT3x を使用します.

SHT3x は測定データの読出し時に,下記のようにクロックストレッチを使うことができますので,これを試します.

コード全体は次のようになります.