I2Cのはなし
I2Cとは
DATAとCLOCKを使う2線式の通信方式で、主に組み込みCPU(ホスト)と周辺ICとを結ぶ。
CLOCKはホストから周辺に出力する片方向だが、DATAは周辺からの応答(ACK)を確認するため、双方向通信となるクロック同期型シリアル通信だ。
ハード的には
バスラインは通常数KΩの抵抗で電源にプルアップされ何らかの原因でICが電源が入っていなかったり、バスラインがショートしていても破損につながらないようなしくみになっている。その点でCPUのポートとしてはCMOS出力でなくオープンドレイン(GND側FETのみ)の端子が使いやすい。外部に出す場合はオープンドレインのバッファICなどを繋げて使用すると良い。
周辺ICは、小容量のメモリ(EEPROMが多い)や、温度センサ、電子ポテンショメーターなどの種類がある。
伝送スピードは通常 100KHz程度で高速モードでは 400KHz程度で通信できるが、バスの長さ・周辺接続の多さによってはあまり速いスピードでは誤動作が起きる場合がある。
プロトコル的にはアドレス指定がコマンド上にあり、バスラインに複数の周辺機器を接続可能で、通常最大16個程度まであり、デバイスアドレスと呼ばれている。
---------- 以下ルネサステクノロジーの説明を引用すると ---------------
スレーブのアドレスを指定するためのアドレス・フィールドは 7ビットありますが、 そのすべてが自由に使える訳ではありません。
アドレスの最初の 4ビットが 0000 と 1111 は用途が規定されています。
0000 で始まるアドレスはジェネラル・コール・アドレス (0000 000) のような目的で使用します。
1111 で始まるアドレスの内で、 1111 0xx はこの xx の 2ビットとその後に続く 1バイトの合計10ビットでスレーブのアドレスを指定できます。
ただし、通常のマイコンでの使用では 10ビットのアドレスを使う可能性は低いと考えられます。
------------------------- END -----------------------------
バスラインの開始・終了にはCLOCKとDATAの立ち下がり順(バスがIdleの時は通常 High Level)にてSTART コマンド、 STOPコマンドが定義されている。また応答時のACKはシリアル8ビットで通常のデーターを送信した後周辺側が9ビット目に DATA ラインをLowレベルを返すことで実現している。
CPUによってはハード的に I2Cをサポートしているものもあるが、ACKが無い場合ソフトできちんと対応しないとハングアップしてしまう場合があり、PIC等もソフトでコントロールする方法も推奨されている。
電圧レベル的には周辺ICにもよるが 5Vや 3.3V等で使われ、ハイスピード時には周辺にパルス波として雑音妨害を起こす可能性があり、フィルタリングが必要な場合があるが、コンデンサなど多くなると波形がなまり、信号伝送に影響が出るので注意が必要だ。
ソフトウエア的には
エラーがあった場合どのような処理をするか考える必要がある。
まずバスラインが正常かどうか判断する。Idle時はDATA/CLOCKラインがHighである。
これを通信開始時に確認する必要がある。DATAラインがLowの場合は周辺ICがACKを返している場合もあるし、ラインがショートしている場合、電源が入っていない場合がある。
これらを考慮していないと、何かの場合にトラブルになります。
詳細はまた、I2Cのトラブルのはなしで....
| 固定リンク
「DIGITAL」カテゴリの記事
- I2C信号を見る はなし(2022.09.13)
- TTL レベルのはなし ふたたび(2022.02.13)
- 2022 新年あけましておめでとうございます。(2022.01.04)
- 12Bit DAコンバーターのはなし(2016.08.12)
- D ラッチとD フリップフロップのはなし(2014.10.30)
コメント
I2Cメモリはインクジェットプリンタの各インクカートリッジに入っていて、インク色情報・使用量などをメモリするのに使われます。このデーターが空っぽになると詰め替えインクなどでインクを足してもデーターが変わらないので使えないまま。メーカーも純正を買って欲しいからね。
投稿: OYU! | 2010年3月24日 (水) 20時49分