gombeのブログ

マイコンの電子工作系PIC32/KiCad/C/C++/3D/

I2Cの使い方 回路編

0、なぜI2C?

I2Cは2本の信号線によるシリアル通信の一種です。低速ではあるものの、多数のスレーブに接続できるためセンサーの接続やコントロールICの制御など様々なところで使われます。

I2Cは通信方式がシリアル通信の中でも特殊なため使用する前にその仕組みを理解する必要があります。

[caption id="attachment_4471" align="alignnone" width="474"]基本回路図 基本回路図[/caption]

この回路の1番の特徴はスレーブの数に基本的には制約がありません。マスターとしては普通はマイコンを使います。スレーブには例えばセンサーとか様々なデバイスを接続します。マスターには複数デバイスが使えますが通常は一つです。

で、なぜこのような便利な仕様になっているのかについて解説します。ポイントはオープンコレクタ接続(オープンドレイン)にあります。アイドル時(通信していない間)はプルアップ抵抗を通して2つの端子はHi出力になります。ここで、なんらかの原因でLo出力にしたい場合は何かのデバイスがLoを出力します。Hi出力にしたい場合はHiを出力ではなく、Z(ハイインピーダンス)に設定します。通常はプルアップを通してHi状態になります。それにより、LoとHiで電源が貫通することが防げます。(通常の機器はLoとLoで出力が競合しても壊れません。)

1、電源について

ここでポイントとなるのがハイインピーダンスとなるという点です。そのためスレーブには最大プルアップ抵抗につながれている電源の電圧がかかります。そのため複数電源が必要な回路もも場合によってはレベル変換なしにサポートすることができます。

ここで5Vと3V3のラインがあるとしましょう。もし3V3ラインのデバイスが5Vトレラントの場合はレベル変換は必要ありません。5Vの電源にプルアップしましょう。そうでない場合は諦めてレベル変換をしましょう。

例えばSTMマイコンではIOがトレラントになっているピンが多いのでそのピンを使えば回路が簡単になります。

2、プルアップ抵抗

プルアップ抵抗は通信に非常に大切です。この値を誤って設定すると信号伝達が正しく行えなくなる恐れがあります。

バス間には浮遊容量成分が存在します。それらを十分にドライブできる通信バス、例えばプッシュプルタイプのSPIなどにはプルアップ抵抗は通信に必要ないことがあるでしょう。しかし今ここではHiへのドライブは抵抗を通してのみ行われます。そのためプルアップ抵抗は速度に合わせて十分に余裕を持ってドライブできるように値を設定すべきです。

400kbpsで通信したいのであれば、2k2などを使いましょう。逆に速度が低速であれば通信時の消費電力を考えて5kをつけることもあるでしょう。デバイスが増えれば容量成分も増加します。抵抗値を下げる必要もあるかもしれません。波形を観測する必要も出てくるかもしれません。