レベル変換 (8) I2C その3 PCA9306

 ここで利用するPCA9306は、双方向電圧レベル変換と呼ばれています。秋月電子通商のDIP化モジュールを入手しました。スイッチが2組入っています。

PCA9306のおもな特徴

  • 電源電圧 Vref1;1.6~3.6V、Vref2;1.8~5.5V
  • 動作速度 最大2MHz
  • イネーブル端子付き 基板上でVref2にプルアップされているので有効状態

 端子名にSCLとSDAという名称がついているが、内部ブロックは同じなので、入れ替えてもよいように見えます。

●I2C信号の電圧

 I2CのHIGH/LOWの電圧です。

  規定 電源5V 電源3.3V
LOW Vil 0.3*Vdd以下 1.5V 0.99V
HIGH Vih 0.7*Vdd以上 3.5V 2.31V

 I2Cの信号は電源電圧へプルアップして利用します。5Vのマイコンでは5Vへ、3.3Vのセンサでは3.3Vです。したがって、2本の信号がつながるデバイスの電源電圧が異なる場合は、途中にレベル変換回路が必須です。

信号の方向

 Arduino UNOを利用するときは、マスタの役割をします。センサなどはスレーブです。クロックSCLはマスタがスレーブに対して送ります(一方向)。双方であっても不都合はありません。

 データのSDAはマスタとスレーブで双方の伝送が行われます。したがって、5Vと3.3Vのレベル変換では、双方向対応の回路を選びます。

接続

 3.3Vで動作するBME280は温度、湿度、気圧が測れるセンサで、秋月電子通商からボードを入手しました。

 BME280ボードのジャンパJ1、J2はプルアップ抵抗(4.7kΩ)を有効にするにはショートします。前の実験でショートしていたのでそのまま使いました。
 J3はショートするとVddとつながり、I2Cインターフェースが有効になります。SDOはI2Cのスレーブ・アドレスの設定端子で、デフォルトの0x76にするためにGNDへつなぎます。Vddへつなぐと0x77になります。
 SDIはI2CのSDA信号を、SCKはI2CのクロックSCLをつなぎます。

 PCA9306ボードはどちらのバスにも1kΩのプルアップ抵抗がデフォルトで有効になっています。データシートによると、400kHz以上の転送速度にする場合は、抵抗値を下げるほうがよいようです。したがって、センサ側のバスには二つの抵抗の合成値826Ωが入ることになります。

 Vref1側に3.3Vで動作するBME280ボードをつなぎます。

 EN信号はボード上でプルアップされていて有効状態です。

スケッチ

 BME280は、ライブラリを利用します。ライブラリの導入は「レベル変換 (6) I2C その1 MOSFET 」を参照してください。スケッチも同様に、bme280_exampleを読み込んで動かしました。

 実行結果です。

 Analog Discovery2を使って、これらの実験中の波形を示します。画面の上側ブロックがアナログ信号です。オレンジ色がArduino UNOのクロックSCL波形で、青色がレベル変換したデータSDAの波形です。
 下側のブロックはI2Cのデータをデコードして表示する画面です。オシロスコープのチャネル1(オレンジ色)にDIO2ピンを、オシロスコープのチャネル2(青色)にDIO1ピンをつないでいます。

 Arduino UNOのSCLはLOWが0.3V、HIGHが4.0Vです。BME280側のLOWは0V、HIGH3.6Vです。

 LOWが少しガタガタになっていますが、拡大ししてみると、0VがスレーブのBME280のLOWで、0.3VがPCA9306のLOWだと思われます。0.3VでもI2CのVilは十分満たしているので問題はありません。

前へ

レベル変換 (7) I2C その2 TCA9617B

次へ

レベル変換 (9) I2C その4 PCA9515