I2C bus PR

【I2C busを分かりやすく解説】プルアップ抵抗編

記事内に商品プロモーションを含む場合があります

こんにちは。
ヘーシロー。です。

FAEをやっていたころに
お客様(製造業のエンジニア)
からよく頂いたご質問が、
I2C バスの
プルアップ抵抗値について
でした。

解説本を探すのが難しいI2C

I2Cはクラシックな技術
の割には、
I2Cの解説本を探すのは
なかなか難しいです。

身の回りに詳しい人がいれば、
その人に聞くのが、
I2Cを理解するには
最も近道なんですが、
周りに詳しい人がいない、
居ても、気難しすぎる等々
で困っている方が
多いものと推察します。

I2Cのプルアップ抵抗は、どうやって決めるの?

I2C busの
SCL/SDAの
2つの信号配線は、
それぞれ、
電源に、
抵抗を介してプルアップ
する必要があります。

プルアップするのは
良いけど、
抵抗値はどうればいいの?

I2C busで、
プルアップ抵抗値により
影響を受けるパラメータには、
「VOL」と「立ち上がり時間」
があります。
それぞれに規格がありますので、
それらの規格を満たすように
抵抗値を設定する必要があります。

具体的には、
下記のように、プルアップ抵抗値の
上限(最大値)と下限(最小値)を求め、
その間の値にプルアップ抵抗値を設定します。

  1. VOLが規格のmaxを超えないような抵抗の最小値を求める
  2. 立ち上がり時間が規格の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となります。

I2C バス Hi出力

充電電流: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の
上限値と下限値の間の
抵抗値を設定します。
拙者の知る限りでは、
数百Ωから数キロΩに設定される
事が多いです。

以上、参考になれば幸いです。

ABOUT ME
ヘーシロー。
地方大卒。エンジニア歴20年近いオジ。
最初の職場はブラック。
長年の忍耐を経て、
ブラック脱出を決意。
就職先の影も形もない状況で浪人する。
ブラック脱出後、メーカーや商社で、
自身の英語と技術知識に自信を持つ。
リスクをとっても
ブラックからは脱出すべきと確信。
リスクをとる個人が増えることを願い、
技術記事やキャリア形成、
英語について、
思うところを発信する。
error: Content is protected !!
%d人のブロガーが「いいね」をつけました。