2022年1月6日木曜日

I2Cのプルアップ抵抗値についての考察

I2C通信といえば今では当り前のように使われている通信プロトコルですが
以前から疑問に思っていたことがあります 。

実際プルアップ抵抗の適切な値っていくつなの?って
 私が以前(といっても17~18年前の話ですが)ハマっていたころは確かI2Cの規格を提唱したフィリップスセミコンダクター社(現在NXP社)の マニュアルには2.2KΩと書いてあったような記憶があるのですが

それ以来私の中ではI2Cのプルアップ抵抗は2.2kΩと思っていました。
 しかし最近のI2Cの回路図を見ると大抵の物は10KΩとなっていますし、
最近のNXP社のI2Cマニュアルをみると寄生容量による計算式はありますが 特にこれっていう数値は書いてありません。 

 じゃぁ一体いくつなの?って思って 
I2C  プルアップ抵抗値  と検索しても結論があいまいで、
かつ寄生容量、周波数までは考慮していても 通信距離まで考えて考察しているサイトは中々ありません。 

 適当に1KΩ~10KΩぐらいにしておけばいいよね、と思うんですがこんな記述があったり
すると益々混乱するわけです。
(この場合は結局I2Cの規格から外れてるのでこうなると後でわかるんですが)

そこで私の師匠であるT氏に相談を持ち掛けてみたところ
全ての疑問が解消しましたのでここに私のための備忘録として書いておきます。

プルアップの抵抗値を決めるパラメータとしては、まず通信速度(以前では400kbpsでも高速と言われていましたが現在では1Mbpsが主流です)、寄生容量、あと最後に通信距離になるのですがまずはI2Cの回路ってどうなってるの?というところから始めます。


上記の絵がI2C回路のSCL部分(クロック)をモデル化したものになります、
このようにマイコンなどから出力される信号は途中のFETをON/OFFするだけのスイッチと
考えられますので
何も電流供給源がない(プルアップ)場合はその先に信号がおくれません。
この場合のシュミレートが下記のグラフになります、当たり前ですね。


上記のようなことがあるため電流供給源としてプルアップがあるわけです
これをモデルに追加すると・・・

この回路をシミュレートするとこんな感じに


ここまでわかりましたので、実際の回路をモデル化してみましょう
電源電圧3.3V、通信速度は400kbps,プルアップ抵抗値は10KΩです
本来はSCL,SDAとなりますが今回はSCL(クロック)だけで作ってみます。

I2C回路のFET他は▷マークに省略しています
上記の回路をシミュレートしてみると(寄生容量も考慮しています)

とここまではどのサイトを見ても同じようなことが書いてあります、
ならこのモデル上で周波数とプルアップ抵抗値を変化させてI2Cの規格を
満足できる抵抗値を探せばいいのでは思いますが・・・

(I2Cの規格・・・SCLがLOWの時にデータを変化させ、SCLがHIGHの時はデータを変化させてはいけない、つまりクロックがHIGHの時だけデータが確定してますよってことです)

がしかし・・・

I2Cって元々の発想が基板内通信だったはずです
多分100mm~200mm程度の通信距離を想定していると思いますが
最近では液晶他、温度測定、物体検出などのモジュール品もあり平気で1Mや2M伸ばして
使うことも考えられます。

そう上記の回路では通信間距離を全く考慮に入れていないのです。
考えると100mmの時と1000mmの時が全く同じわけがありませんよね。

それでは通信間距離の代わりとして、伝搬遅延としてモデルに追加してみます
(ここでは伝搬遅延を1インチあたり0.13nsとして計算
ちなみに1nsは10億分の1秒です)

ではこのモデルを使用してSCL,SDA両方共にシミュレートしてみます

電源電圧3.3V,通信速度400kbs,
プルアップ抵抗10KΩ、
通信距離1インチ(25.4mm)

このように通信ライン上の波形が鈍ってくるのがわかりますが、これは通信距離、プルアップ抵抗値によって変化し受信側でI2Cの規格を満足出来なくなるケースが出てくるって言う事がわかります。

では色々変化させてシミュレーションしてみましょう。

まずは通信距離を100倍の100インチ、つまり2540mmに変化してみます。
他のパラメータは動かしていません

電源電圧3.3V,通信速度400kbs,
プルアップ抵抗10KΩ、
通信距離100インチ(2.54m)

通信距離を2.54mまで伸ばしてみましたが、I2Cの規格を満たす通信はできるようです
ただ安全性を考えるとこの条件でプルアップ抵抗10kΩというのは
かなり限界値に近い気がします。

さらに同じ条件で通信速度を1000kbpsまで上げるとどうなるか・・

まるっきり話になりませんね、
ならプルアップを1kΩまでさげるとどうなるかやってみます

これなら問題ないようです。

結果I2Cのプルアップ抵抗値は通信速度、
通信距離によって最適なプルアップ抵抗値は変化するというのが結論です。

よくあるプルアップ抵抗値が10KΩというのはI2C回路を10台術繋ぎにしても1kΩに
なるわけで、まぁ妥当な選択とも言えそうです。


上記の回路シミュレータはLTSPICEと言ってPC上で回路をシミュレートできる
フリーのソフトウェアです、もっとよく知りたいと思った方は

私の師匠が開設している
伝説のスパイス」をご覧下さい。https://www.youtube.com/channel/UCE7f0TFhyS3EuqPqzGnw0-Q