こんにちは。
ヘーシロー。です。
FAEをやっていたころに
お客様(製造業のエンジニア)
からよく頂いたご質問が、
I2C バスの
プルアップ抵抗値について
でした。
解説本を探すのが難しいI2C
I2Cはクラシックな技術
の割には、
I2Cの解説本を探すのは
なかなか難しいです。
身の回りに詳しい人がいれば、
その人に聞くのが、
I2Cを理解するには
最も近道なんですが、
周りに詳しい人がいない、
居ても、気難しすぎる等々
で困っている方が
多いものと推察します。
I2Cのプルアップ抵抗は、どうやって決めるの?
I2C busの
SCL/SDAの
2つの信号配線は、
それぞれ、
電源に、
抵抗を介してプルアップ
する必要があります。
プルアップするのは
良いけど、
抵抗値はどうればいいの?
I2C busで、
プルアップ抵抗値により
影響を受けるパラメータには、
「VOL」と「立ち上がり時間」
があります。
それぞれに規格がありますので、
それらの規格を満たすように
抵抗値を設定する必要があります。
具体的には、
下記のように、プルアップ抵抗値の
上限(最大値)と下限(最小値)を求め、
その間の値にプルアップ抵抗値を設定します。
- VOLが規格のmaxを超えないような抵抗の最小値を求める
- 立ち上がり時間が規格のmaxを超えないような抵抗の最大値を求める
実は、
誰でも入手できるI2Cの規格(英語版)に
抵抗値の決め方は
記載されています。
ただし、
少々わかりづらいので、
以下に解説しておきます。
I2C日本語版specもあります。
(ただし、英語の最新版が正式です。)
VOLが規格のmaxを超えないように抵抗の最小値を決める
ドライバLo出力時の電圧:VOLは、
ドライバのLo出力電流:$I_{OL}$と、
プルアップ抵抗: Rp、
電源電圧: VDD
で決まります。
プルアップ抵抗値の下限は、
ドライバ:Lo出力時に、
出力電圧:VOL < VOLmax
となるようなプルアップ抵抗値
を算出します。
$$VOL=VDD-Rp*I_{OL}・・・①$$
例えば、
fast mode plus(VDD: 2V)場合、
の場合、
上記の規格より、
VOL max : 0.4Vです。
次に、
実際にI2Cバスに
ぶら下がっている
デバイスのIOLに着目しましょう。
I2C規格のIOL@0.4VのMIN値=20mA
ですので、
デバイスのIOLは、
20mA以上のはずです。
例えば、
デバイスのIOL=30mAだったとすると、
式①を適用して、
$$VOL=VDD-Rp*0.03$$
$$VOL<0.4$$
$$VDD-Rp*0.03 < 0.4$$
$$R_p > \frac{VDD-0.4}{0.03}$$
となります。
$R_p$の下限値が
求められましたね。
(0.03の部分は
デバイスの実力値(IOL)
を代入してください。)
これは、冒頭に紹介した
specの7.1章、(2)の式ですね。
(fig.42)
注意点としては、
general call address等により、
複数のデバイスが
同時にACKを返すことが考えられる
場合は、
上記の0.03の部分に、
同時にACKを返すデバイスの
IOLの足し算した値を
代入する必要があります。
立ち上がり時間が規格のmaxを超えないように抵抗の最大値を決める
一方、I2Cバス上信号が、
LoからHiになる時、
I2C busの信号の立ち上がり時間:trは、
バス全体の寄生容量: Cbと
プルアップ抵抗:Rpの関係で決まります。
プルアップ抵抗値の上限は、
ドライバ: Hi出力時に、
立ち上がり時間:tr < tr_max
となるようなプルアップ抵抗値を
算出します。
下図のように、
I2C bus上の出力がHiとなる時、
電源(VDD)は、
プルアップ抵抗を介して、
寄生容量:Cbを充電しようとします。
そして、充電されたCbの
電圧が、VOHとなります。
充電電流:Iと、VOHを
ラプラス変換を使用して
表すと、
$$充電電流I = \frac{1}{Rp+\frac{1}{sCb}}*\frac{VDD}{s}$$
$$VOH=\frac{1}{sCb}*I$$
$$=\frac{1}{sCb}*\frac{1}{Rp+\frac{1}{sCb}}*\frac{VDD}{s}$$
$$=\frac{1}{1+sCbRp}*\frac{VDD}{s}$$
$$=(1-\frac{sCbRp}{1+sCbRp})*\frac{VDD}{s}$$
$$=(1-\frac{1}{1+\frac{1}{sCbRp}})*\frac{VDD}{s}$$
$$=(\frac{1}{s}-\frac{1}{s+\frac{1}{CbRp}})*VDD$$
ラプラス逆変換して、
$$VOH = (1-e^{-\frac{1}{CbRp}t})*VDD・・・②$$
立ち上がり時間:trは、
VOHが、
0.3VDDから0.7VDDに
到達するまでの時間ですので、
t(1):VOHが0.3VDDに到達するまでの時間
t(2):VOHが0.7VDDに到達するまでの時間
とすると、
規格上のtrは、
VOHが、0.3VDD→0.7VDDへ到達する時間
ですので、
tr=t(2)-t(1)
②のVOHに、
それぞれ、0.3VDD, 0.7VDD
を代入すると、
t(1), t(2)が求められますので、
計算すると、
tr=0.8473*RpCb
specの7.1章と同じ結果が得られます。
例えば、
fast mode plusの場合、
tr < 120 [ns]
$$0.8473*10^{-3}*Rp[\Omega]Cb[pF] < 120[ns]$$
$$Rp[\Omega] < \frac{120[ns]}{0.8473*Cb[pF]}*10^{3}$$
Rpの上限値が求められます。
プルアップ抵抗値の決定
前章で求めた
Rpの
上限値と下限値の間の
抵抗値を設定します。
拙者の知る限りでは、
数百Ωから数キロΩに設定される
事が多いです。
以上、参考になれば幸いです。