NXP の PCA9306 を使った秋月の I2C レベル変換モジュールを活用するためのコツを紹介します.
このモジュールには,次の注意点があります.
- 電圧の高低差に制約有り
- 実装されている pull up 抵抗が比較的小さい (1kΩ)
- 双方向変換によるバス競合誤検出の可能性有り
電圧の高低差に制約
レベル変換を行う際,VREF2 側に高電圧側を接続する必要があります.
逆方向にしてしまうと,意図しない電流が流れ,無駄な発熱や誤作動につながります.
Pull up 抵抗
外部で 2.2kΩ~4.7kΩ 程度で pull up してあげた方がトラブルが少ないです.
このモジュールには,ジャンパの設定で有効かできる pull up 抵抗がついているので活用したくなりますが,抵抗値がやや小さくなっています.具体的には 1kΩ の抵抗となっているため,3.3V 以上の電圧を使っている場合,I2C 通信を使っているデバイスが 3mA (= 3.3V / 1kΩ) 以上引けないと通信が上手く成立しない可能性があります.
バス競合誤検出
上記2に気をつけても上手く動作しない場合,Slave デバイス側の SDA ラインに 100pF 程度のセラコンを接続すると改善する場合があります.
おそらく,レベル変換 IC が双方向変換の機能を持っているのが原因だと思いますが,そのまま接続すると Master デバイスがバス競合を誤検出してしまうことがあるようです.
Intel Edison を Master にした場合の波形を以下に示します.
まず,NG 時.なぜか START コンディションを出したあとで通信が停止してしまっています.
この状態で,Slave 側の SDA ラインに 100pF を接続すると,次のように正常に通信が行えるようになります.
START コンディション部分を拡大すると次のようになっています.
まず NG 時.
黄色が Master (Intel Edison) 側で,水色が Slave 側になります.Master 側は,勢いよく立ち下がった後,一旦なだらかになり,その後また勢いよく立ち下がっています.立ち下がりが再度急になる時点だと,Slave 側の電圧は約1.5Vです.このタイミングでレベル変換 IC Slave 側が L になったと判断し,大きなドライブ能力で Master 側の電流を引いているのかもしれません.
そうだとすると,Master がバス競合を誤検出して通信を停止してしまうのはある程度納得ができます.
コンデンサを追加すると,その効果で次のように 水色の Slave 側の立ち下がりが緩やかになります.
これに伴い,Master 側においてもなだらかに立ち下がる時間が延びています.再度立ち下がり速度が速まるのは先ほどと同じく,Slave 側の電圧が 1.5V になったタイミングです.ということは,やはりこのタイミングでレベル変換 IC が Master 側に対して L 出力を開始しているように見えます.(Slave 側にコンデンサを追加することにより,Master 側の立ち下がり時間が伸びでいるのがポイント)
以上をまとめると,
追加されたコンデンサが Slave 側の電圧立ち下がりを遅くし,それによってレベル変換ICが Master 側に対して L を出力するタイミングが遅れ,結果的にバス競合の誤検出を回避できているようです.
コメント