C++ ときどき ごはん、わりとてぃーぶれいく☆

USAGI.NETWORKのなかのひとのブログ。主にC++。

Pro Micro の I2C とプルアップ抵抗値の計算メモ

Pro Micro で I2C を使った通信を行う設計をしたい場合にプルアップ抵抗の適正値の計算方法を知らないので調べたメモ。

調査前の既知の知識は Let's Split では 4.7kΩ の抵抗器を使う回路が特に説明も無く登場しているのを知っている程度。

MEGA32U4 のデータシートの 29.6. の表と NXP SemiconductorsI2C 仕様書を読むと次の式が得られた。

  • \Huge Rp_{min, fSCL \leq 100kHz}=\frac{Vcc(V)-0.4(V)}{3(mA)}=1.533(kΩ)
  • \Huge Rp_{max, fSCL \leq 100kHz}=\frac{1000(ns)}{0.8473 \times Cb}=440.0(kΩ)
  • \Huge Rp_{min, fSCL > 100kHz}=\frac{Vcc(V)-0.4(V)}{3(mA)}=1.533(kΩ)
  • \Huge Rp_{max, fSCL > 100kHz}=\frac{300(ns)}{0.8473 \times Cb}=132.0(kΩ)

但し、

  • 配線の長さ: \Huge 30(cm)
  • 配線の直径: \Huge 0.6(mm)
  • 配線の距離あたりの静電容量: \Huge C(pF/m)=\frac{0.02413}{log_{10}\frac{D(m)}{r(m)}} = 8.940(pF/m)
  • 配線の静電容量 \Huge Cb = 8.940(pF/m) \times 30(cm) = 2.682(pF)

実際のところは I2C で繋ぐデバイス間でデータの取りこぼしというか化けが起こらずに期待動作を維持できる波形が保たれなければならないので…

  • この min, max の間で
  • 省エネ的には小さな値なほど有利で
  • HIGH = ビット値 1 の波形の立ち上がりには小さな値ほど有利だけど
  • 小さすぎると LOW = ビット値 0 への波形の下がりが悪くなって不安定になったり、立ち上がりにパルスが出たり

する。ようなので、厳密にはオシロスコープも見ながら機器の通信エラーの発生を観測して実験的に決めるのが良いのでしょうけど、つまるところ…

  • 10kΩ くらい挿しておけばいいんじゃない(試作なら一応半固定ボリュームにでもしておけば安心)

という歯切れの悪い結論しか机上のこうした簡単な計算では目処をたてられないようです。なるほど、電子のお気持ちわからん😅

参考