異なる電圧レベル間でI2C
|
後輩から携帯にこんなメールが来た。 I2Cでラインをプルアップしているんですが、あれは電圧を3.3Vにすれば、異なるレベルのインターフェース間でも通信できますか? なかなか興味深い内容だ。この後もメールのやり取りがあったのだが結論から言うとこうなる。 まず前提として、I2Cは双方向通信なのでマスタ・スレーブの両側がデータの読み取り側になりうる。異なるレベル間というのを5Vと3.3Vとすると、3.3V駆動の読み取りは3.3Vでプルアップすれば問題無いが、5V駆動の読み取りはHレベルの閾値が2VいかにあるTTLバッファなら問題ないけどCMOSバッファだと保証されない、というか個体差や環境の違いで動いたり動かなかったりすると思う。
普通はI2Cなんていう複雑な規格でレベルシフトを行おうとすることはあまり無く、マスタとスレーブは電源電圧をあわせ、ほかの単方向の部分でレベルシフトを行う。 しかし、どうしてもI2Cでレベルシフトをしなければならないとすればどのような回路を考えればよいだろう。 あまり良い回路では無いが以下のようなものを考えてみた。 順番に回路の挙動を見ていこう。 最初に3.3V系5V系ともに出力の論理がH、すなわちハイインピーダンス状態であるとする。 このときQ1はOFFとなっているので、それぞれの端子はプルアップ抵抗により3.3Vおよび5Vに保持される。 つぎに3.3V系の出力がLのとき。 Q1は普通のトランジスタの動作でONとなる。R2からQ1のコレクタへ電流が流れ込み。コレクタ電圧はほぼ0Vとなる。 最後に5V系の出力がLのとき。 2SC1815などのNPNトランジスタはN型半導体にP型半導体がはさまれた構造をしていることを知っている人も多いと思う。 この図を見るとP型半導体を境に左右対称な構造をしているように見える。なので、トランジスタに極性があるのはおかしいと思えてしまう。つまり、コレクタとエミッタをさかさまに使っても使えるのではないかと。 まぁ、そうはいってもなぜかトランジスタには極性があるわけだが、実を言うとさかさまに接続してもそれなりに使えるらしい。 このような状態をトランジスタの逆接続動作といいます。逆接続動作時のhFEに対応するパラメータをβR(beta reverse;逆接続動作時の電流増幅率)とよび一般に0.5〜10ほどだそうです。 逆接続動作時の注意点としてはエミッタ-ベース間電圧の定格は一般的に低いということです。2SC1815ではVebo=5Vとなっているので電圧レベルの低いほうが5Vより大きくなる回路では利用できません。この辺は「黒田 徹 著 はじめてのトランジスタ回路設計」からの受け売りです。 そんなわけで、5V系がLのときも3.3V系がLのときと同様に動作すると考えることが出来る。ただし、βRはhFEにくらべて小さいのでベース抵抗の値はI2Cデバイスのシンク能力の許す限り大きく、プルアップ抵抗は許す限り大きく選ぶ必要があります。 もちろんトランジスタ自体のβRが大きくなるように選別することが一番大事です。 実機で試してはいないので、本当に動作するかも怪しい回路ですが本当に作る人はクロック速度も抑えないと怖いかもしれません。おそらく400kHz・・・100kHz・・・まぁ、この辺が限度?毎度のことですけど本当に作る人は自己責任でお願いしますね。 追記:PIC16F88のSSPモジュールのI2Cモードでの入力端子はシュミットトリガ入力。すなわちCMOSレベルですね。 |

I2C検索中にこのブログを発見しました。
フィリップス(nxp)のI2C仕様書です。
http://www.nxp.com/acrobat_download/literature/9398/39340011_jp.pdf
の41ページに載っていました。自分では実際に検証済みです。
2008/6/28(土) 午後 9:18 [ hato ]
hatoさん、コメントありがとうございます。
まず、I2Cの仕様書に日本語のものがあったとは知りませんでした。紹介していただきありがとうございます。
たしかにPDFにあるとおりN-ch MOSFETでやる方がスマートですね。気づきませんでした。
実を言うと、同じ原理の回路に関する記事を書こうとしていたところでした。なので、自分で気づけなかったのは悔しいです。
2008/6/28(土) 午後 11:28 [ gomisai ]