レベル変換 (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レベルを満たしています。