レベル変換 (10) I2C その5 ISO1541D
ここで利用するテキサス・インスツルメンツのISO1541Dは、双方向I2Cアイソレータと呼ばれています。RSコンポーネンツで入手し、DIP化変換基板にはんだ付けしました。双方向の絶縁されたバッファが一組、1方向の絶縁されたバッファが一組入っています。双方向の絶縁されたバッファが2組入っているのがISO1540Dです。SCLのクロック・ストレッチが必要なときは、ISO1540Dを使うようにマニュアルに書かれています。
アイソレートする両側で別々の電源を使うので、レベル変換に利用できます。
●ISO1541Dのおもな特徴
- 電源電圧 1側、2側ともに3~5.5V
- 入力Vih 1側SDA/SCLは0.61V(typ)、2側SDA/SCLは0.4*Vcc2(min)
- 出力電流 1側3.5mA、2側35mA
- 動作速度 最大1MHz
信号の入力は5Vトレラントではありません。HIGHは電源電圧までです。
ISO1541Dの入出力のピン配置は左右に分かれ、ピン間も広いです。沿面距離などを確保するためです。ここで利用したOPアンプ用の変換ボードでは入出力の配線が入り乱れているので、アイソレータとしては絶縁電圧はまったくカタログ通りにはなりません。DC的に分離できていると考えて利用しました。
●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をつなぎます。
Vcc2側に3.3Vで動作するBME280ボードをつなぎます。
ISO1541Dボードは、1側と2側で入力レベルが異なります。ほかのデバイスのように、HIGHとLOWの間にどっちつかずの電圧領域がありません。
規定 | 電源5V | 電源3.3V | 1側(※) | 2側5Vのとき | 2側3.3Vのとき | |
---|---|---|---|---|---|---|
I2CのLOW Vil | 0.3*Vdd以下 | 1.5V | 0.99V | 0.66V(max) | 2.0V | 1.32V |
I2CのHIGH Vih | 0.7*Vdd以上 | 3.5V | 2.31V | 0.54V(min) | 2.0V | 1.32V |
(※)Vih-Vilのヒステリシスは60mV(typ)
1側のVilとVihが不自然な値に見えます。マニュアルによれば、internal logic latch(ラッチアップのこと?)を防止するために、1側のロー・レベル出力電圧を1側のハイ・レベル入力電圧よりも高い値にオフセットする必要があると書かれています。筆者は理解できなかったので、利用する方はマニュアルをじっくり読まれるのがよいでしょう。
1側をArduino UNOへ、2側をBME280へ接続しました。Arduino UNO側には10kΩのプルアップ抵抗を入れました。BME280はボード上で4.7kΩが入っています。
アイソレーションはしないのでGNDは共通です。アイソレーションを行うためには、2次側の電源を別途用意します。
●スケッチ
BME280は、ライブラリを利用します。ライブラリの導入は「レベル変換 (6) I2C その1 MOSFET 」を参照してください。スケッチも同様に、bme280_exampleを読み込んで動かしました。このライブラリは、スレーブ・アドレス0x76で通信します。
実行結果です。
Analog Discovery2を使って、これらの実験中の波形を示します。画面の上側ブロックがアナログ信号です。オレンジ色がArduino UNOのクロックSCL波形で、青色がレベル変換したデータSDAの波形です。
下側のブロックはI2Cのデータをデコードして表示する画面です。オシロスコープのチャネル1(オレンジ色)にDIO2ピンを、オシロスコープのチャネル2(青色)にDIO1ピンをつないでいます。
Arduino UNOのSCLはLOWが0V、HIGHが3.8Vです。BME280側のLOWは0.1V、HIGH3.5Vです。
●入出力を入れ替える?
ISO1540Dであれば、2次側をArduino UNOに、1次側をBME280に入れ替えて同じ実験ができます。ISO1541DではSCLが逆方向になるので、信号がやり取りできません。