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

 ここで利用するTCA9617Bは、レベル変換 I2C バス・リピータと呼ばれています。サンハヤトのDIP化モジュールを入手しました。双方向のバッファが2組入っています。

TCA9617Bのおもな特徴

  • 電源電圧 Aサイド0.8~5.5V、Bサイド2.2~5.5V
  •      AとBの電源条件 VccA<VccB
  • 動作速度 最大1MHz
  • イネーブル端子付き 内部でVccBにプルアップされている

 端子名に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をつなぎます

 TCA9617BのVccB側に、最初はArduino UNOのI2Cをプルアップ抵抗はつけずに配線しました。過去の経験からWireライブラリをデフォルトで使うときのデータ転送速度100kHzでは、十分フルスイングしたからです。400kHzでは電圧が下がってしまいます。しかし、実際に100kHzで動かすと方形波が三角波のようになり、エラーが頻発したので、プルアップ抵抗4.7kΩを入れました。

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

 EN信号は正論理でかつ内部でプルアップされていて有効状態なので、配線していません。

スケッチ

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

 実行結果です。

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

 Arduino UNOのSCLはLOWが0.1V、HIGHが3.8Vです。BME280側のLOWは0.2V、HIGH3.6Vです。Arduino UNOのI2CのVihは3.5Vですから、マージンは少ないですがHIGHレベルを満たしています。

前へ

レベル変換 (6) I2C その1 MOSFET

次へ

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