I2Cリピータはどんな仕組みなのか

2022.03.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

CX事業本部IoT事業部のアッキーです。今回はI2Cリピータ(I2Cバッファ)ICの仕組みについてご紹介します。

はじめに

I2Cはマイコンとデバイス間などに使われるバスで、SDAとSCLの2本のピンのみで複数のデバイスと通信できることから、低速でも問題ないセンサなどとの通信によく使われています。

I2Cホスト機能はほとんどのワンチップマイコンに内蔵されているので、基本的にはプルアップ抵抗さえつければ通信できるのですが、特殊な場合においては付加部品が必要になることがあります。

たとえば、配線を長く引き回す場合や、デバイスのI2Cが弱くてI2Cバスをきちんと駆動できない場合に、I2Cリピータと呼ばれるICを使用することがあります。これは、I2Cバスの中間に挟むことで、そこから先の負荷の駆動を肩代わりしてくれるICです。具体的な製品としては、NXPのPCA9515やPCA9600などがあります。

I2Cリピータのデータシートには以下のような内部ブロック図が書いてありますね。

NXP PCA9515: I²C-bus Repeater Product data sheet Rev.09 [1]より引用

それぞれ、2つのバッファが向い合せについているだけのシンプルなICですが…この図だけを見るとおかしくないでしょうか?

I2Cバスはオープンコレクタを利用したバスで、SDAとSCL共にホスト・デバイスのそれぞれ双方向でLに駆動されます(非マルチマスタの場合はSDAだけですが)。しかし、この図だけを見ると、左右のどちらかがLOWになった瞬間に、反対方向のバッファもLOWになり、そこでバスが止まってしまうようにみえます。

しかし、実際にはうまく動きます。内部にフリップフロップでも入っていて、どちらが先にLOWになったか覚えているのでしょうか?しかし、それでは両方のデバイスがLOWにしたら破綻します。不思議ですね。

データシートを見てみる

といっても、I2Cリピータは不思議な力でもう反対側のバスの状態を調べるような超技術のデバイスではありません。

答えはデータシートの静的特性の項にあります。

静的特性

NXP PCA9515: I²C-bus Repeater Product data sheet Rev.09 [1]より引用

VIH、VILはスレッショルドがそれぞれ0.7Vcc、0.3Vcc、これは通常のI2Cデバイスと同じです。

重要な項目はVOLです。実際にバッファが出力する電圧はVOLで規定されていて、0.47~0.6Vになっています。つまり、バスのA側に0.3Vcc以下の電圧が加わり、B側をLowに駆動する場合、B側の駆動力は0.47V~0.6Vまでになります。

B→Aのバッファは2番目以降のLOWレベル(A→Bのバッファが動作するのが1番目)であるVILcより大きな0.47V以上しか加わっていないことから動作せず、バスがロックされることがありません。

データシートの注釈には、以下のように書かれています。

VIL specification is for the first LOW level seen by the SDAn/SCLn lines. VILc is for the second and subsequent LOW levels seen by the SDAn/SCLn lines.

(VILはSDA/SCLラインの最初のLOWレベル用、VILcは2番目のLOWレベル用)

NXP PCA9515: I²C-bus Repeater Product data sheet Rev.09 [1]より引用

動作を簡単化すると、各バッファは0.4V以下で動作するが、出力電圧は0.47V以上なので、この70mVの差によって相互ロック状態にはならない、ということですね。

なお、I2Cリピータに接続されるデバイスもLOWレベルのスレッショルドは0.3Vccになっているため、リピータによってLOWレベルが0.47V~0.6Vになったとしても、きちんと動作します。

LTSpiceでシミュレーションしてみる

I2Cリピータは動作スレッショルド電圧が少しだけ高いバッファであることがわかりました。この回路をLTSpiceで簡略化した回路をシミュレーションしてみました。

左右の電圧元、プルアップ抵抗、N-MOS FETがデバイスの再現です。中間にある電圧制御電圧元と、それによって駆動されるN-MOS FET、そして0.47~0.6V(下図では0.6Vとしています)のかさ上げを再現した理想ダイオードが、簡略化したI2Cリピータの回路です。

上のグラフはバス左側の電圧を測定したものです。0.3s~0.4Vがバス左側をLOWへ駆動したときの波形、0.6s~0.7sはバス右側をLOWへ駆動したときの波形です。

左側(自分自身の側)で駆動した場合はほぼ0Vまで電圧を落とすことができていますが、右側を駆動した場合、左側へ伝わる電圧は0.6V程度までしか落ちないことがわかります。いずれの場合もLOWでバスが止まってしまうようなことは起こらないですね。

実測波形

マイコンとデバイスの間にPCA9515を入れ、デバイス側で測定したI2Cバスの波形です。

CH1(黄)がSCL、CH2(青)がSDAです。SDAはデバイスとマイコンの両方から駆動されるため、LOWレベルが2種類あることがわかります。特に、バッファが駆動するLOWレベルはバッファの特性により0.4Vより少し高くなっていますが、ACKはデバイス側が駆動しているため、より低いLOWで駆動されていることが分かります。

I2Cリピータを使う際の注意点

  • 2つ以上のI2Cリピータを直列に繋げないこと。
    • リピータから出力されるLOWレベルが、他のリピータのバッファを駆動することはできないため。

おわりに

今回はI2Cリピータの動作をご紹介しました。ICはブラックボックスとして扱えてとても便利ですが、内部動作を知らないと思わぬトラブルが発生することがあります。今回は実際に波形を測定したり、シミュレーションすることで、より深く理解することができました。

引用した資料