技術記事

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

I2C バス Hi出力

こんにちは。
40代目前で浪人
→転職2回
→年収を浪人前の1.5倍にした
ヘーシロー。です。

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

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

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

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

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

抵抗値の決め方ですが、
簡単に言うと、
下記の条件を満たすように設定します。

  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.0.3$$
$$VOL<0.4$$ $$VDD-Rp*0.03 < 0.4$$ $$R_p > \frac{VDD-0.4}{0.03}$$ となります。 Rpの下限値が求められます。 (0.03の部分は デバイスの実力値を 代入してくださいね。) これは、冒頭に紹介した 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年近いオジでもあるが、
会社では全然エラくない!

このままでは、
自分が培ってきた技術が
ただただ埋もれていくと
危機感を持つ。

最初に勤めた会社は、
色々な事が許せず退職し、
就職先の影も形もない状況で浪人。

浪人後に就職したメーカー・商社で、
自身の英語と技術知識に自信を持つ。
年収は浪人前の1.5倍。

最近はブログに目覚め、
技術記事やキャリア形成、
英語について、
思うところを発信する。
error: Content is protected !!
%d人のブロガーが「いいね」をつけました。