I2Cの仕様を考える
I2Cの仕様とは
I2Cバスは最近はマイコンでハード的に処理してくれるので、あまりトラブルに苦労した覚えがないが、スレーブを沢山繋げたりすると信号が読めなくなったり、デバイスによってACK信号が弱かったりすることもあったので、I2Cの信号仕様を改めてチェックしてみた。
ハード的には
上記仕様書の図面ですが、仕様上は SDA 、SCLともに双方向オープンドレイン出力になるそうで、デバイスの自己クロックと同期させるためCLKのLow期間を伸ばす仕様もあるので、CLKの立ち上がりはマスターがHighにしたからといっても、周辺がLow期間を伸ばすことがあり得るので、マスターと言えどもCLKラインがちゃんとHighになったか確認しなければいけないそうです。
とはいえ、通常はCLKなんかは 出力だけしか見てない場合が多いのですが、PICなんかは自分でちゃんとやってるのかな?と確認する必要が出てきました。
右図はポートの電圧的仕様です。電源電圧は2V以下の低い電圧から 16V程度まで広範な電圧に対応されていますが、通常 5Vや3.3Vではプルアップ抵抗を使います。そこでの入力範囲は図の黄色い範囲で、電源電圧より上下に0.5Vマージンがありますが、Vdd=5Vで Lowは 1.5V以下、Highは3V以上と結構制限されてます。また、出力ではLowにするだけなのですが、3mAを流した時でも0.4V以下というけっこう厳しいスペックです。 実際は電圧スペックだけでなく、問題になるのがバスに繋がるデバイスの容量によって波形が鈍ってしまうことです。
I2Cには通常 100kHz と 400kHzのクロックスピードと、より早いHsモード(3.4Mbit/s)がありますが、通常使われる100kと400kの立ち上がり、立ち下がりのスペックを図に示します。
バスラインの容量性負荷の最大値は 400pFなので、立ち上がり・立ち下がりが遅い時には容量を減らせられればそのほうが有利ですが、減らせられない場合は通常 4.7kΩ程度のプルアップ抵抗を 1kΩぐらいまで下げて高速に対応します。それでも鈍って読めない場合はI2Cのクロックの設定を下げて遅いスピードで使うことも考えられます。また、バスラインに高電圧スパイクを受ける可能性がある場合にはデバイスを守るため、バスラインとデバイスに直列に保護用抵抗を入れます。あまり大きな抵抗を入れると上記入出力電圧から外れたり、立ち上がり、立ち下がりが満足しなくなるので、注意が必要です。
ソフト的には
I2Cの大前提として、「CLKのLow期間のみに SDAを変化できる」というものがあります。ですからクロックがLowから High に変わったときはスレーブとしてはデーター読むのに良いタイミングなのですが、これから外れているのが START と STOP コンディションです。スレーブはスタートコンディションを見つけるのにCLKが HighでもじっとSDAがLowになるのをを監視しているなんて、けっこうすごい(実はハードでやっているから関係ないけど)と思ってしまうのですが...。
昔はすべてソフトでポート制御して I2C組んでたけど、たいへんだったなぁ..
| 固定リンク
「DIGITAL」カテゴリの記事
- TTL レベルのはなし ふたたび(2022.02.13)
- 2022 新年あけましておめでとうございます。(2022.01.04)
- 12Bit DAコンバーターのはなし(2016.08.12)
- D ラッチとD フリップフロップのはなし(2014.10.30)
- XPにさよなら(2014.08.12)
コメント