忍者ブログ

Fグループ電子工作講座

秋月電子SH7125ボードで始めるマイコン開発

I2Cとは

参考:電子工作の実験室様I2Cの基礎知識
書籍:マイコンの1線2線3線インターフェース活用入門

関連
I2Cの設定(1)無理矢理動かす
I2Cの設定(2)もう少し真面目に動かす
I2Cの設定(3)関数化
I2Cを試してみる

I2C(アイ・スクェアード・シー)はシリアル通信の一種です。
といってもUARTやRS232Cとは別の機能で考え方も異なります。

RS232Cとの違いと使い道

RS232C(UART)があらかじめお互いに決めた速度で通信速度で通信を行うのに対してI2Cはデータとは別にデータが切り替わるタイミングを知らせるためのクロックの線を接続し、クロックに合わせてデータを送ります。クロックは人が作業を行う際の「せぇ、の、せぇ、の」といった掛け声に相当します。


RS232Cが1対1の通信だったのに対してI2Cは通信を管理するマスター1台対スレーブ多数にて通信を行います。
基本的にはマスターとなるマイコンとスレーブとなる周辺機器が多数接続されます。

RS232Cが別の機器と通信するのに機器毎に通信用の端子を確保しなければならないのに対して、
I2Cは通信する相手が増えてもマイコン側の通信端子は増やさなくても良いのが利点です。
スレーブとしてセンサーを増設しようが、PWM出力ユニットを接続しようが、マイコン側の通信端子は1セットあれば十分です。(大量の通信を行う場合は除く)
2本の通信線には様々な装置から情報が送信され、通信線はバスと呼ばれます。

小型の液晶モニターに文字を表示させる場合やセンサーからデータを取得する場合にも必要となる場合があります。また、外付けメモリーを使用したい場合にもI2Cが必要となることがあります。

通信の仕様

通信は先の説明の通り、バスはクロック(SCL)線とデータ(SDA)線の2本で構成されます。
基本的にクロックはマスターが管理し、マスターがクロックを送信します。
データはマスターが送信することもあればスレーブが送信することもあります。

バスは複数の端末から同時に送信が行われても回路が破損しない様になっています。
バスはプルアップされており、プルアップされた状態が1、GNDに落とされた状態が0を表します。

2つの端末が0と1同時に送信しようとした場合、バス上のデータは0が優先されます。
 
 
従ってある端末が1を送信し続けていれば、他の端末は情報を送信することができます。




各々のスレーブには端末番号(アドレス)を設定する必要があります。

マスターからの送信であれ、スレーブからの送信であれ、通信の開始はマスターからの送信ではじまります。
マスターはスレーブに対してどの端末と通信するかアドレスを指定して通信を開始します。

マスターからの送信の場合はほぼ一方的にデータを送信することになります。
マスターから送信する場合、相手のアドレスを送信し、その後データを送信します。


 ※アドレスは読書判定を含む8bit表記とした場合
 
アドレス、データ共に8bitで区切られます。
指定されたスレーブはアドレスやデータを受信する毎に受信確認応答(ACK:ACKnowledge)として0を送信します。
アドレスまたはデータ8bit+ACK1bitが1セットとして扱われます。
※一番最後のデータを受信した際にACKを送信する場合とNOACKとして1を送信する場合があるそうです。

アドレスの最下位ビットはマスターからの送信(スレーブへの書込み)かスレーブからの送信(スレーブからの読み出し)かの判定に使われます。書込み(W)の場合は0、読出し(R)の場合は1を送信します。

※2018/09/06追記
アドレスは読書判定を含まない7bitがで表記してある場合と、読書判定を含む8bitで表記してある場合がある様なので注意が必要です。読書判定を含まない7bitが正規表示の様です。
また、アドレスが10bit+読書判定1bitの場合もある様です。
また、ACKはすべての通信に対して返信するのではなく、通信を終了する直前はACK(0)を返さずNOACK(1)を返信する場合もある様です。


スレーブからの送信の場合、マスターからスレーブへ送信命令を送ります。
スレーブが送信命令を受信するとそれに反応してスレーブが送信を開始します。
 
マスターが送信している最中にスレーブが送信を開始する様な状況になります。
指定されたスレーブはアドレスを受信した際にACKを送信します。
マスターはスレーブからのデータを受信する毎にACKを送信します。

先の説明の通りACKはマスターからスレーブへ送信する場合は応答はスレーブが送信します。スレーブからマスターへ送信する場合は応答はマスターが送信します。


読出しアドレスと指定すれば素直にデータを出力してくれれば良いのですが、ややこしい場合もあります。通信する相手によっては

 書込み指令 → 読出し指令(→データ読出し)

としなければデータ出力をしない場合もあります。(後述)


クロックとデータの関係

送信データはクロックに合わせて0,1を切り替えます。
送信データの0,1切替はクロックが0の時に行います。
これはマスターでもスレーブでもアドレスでもデータでも同じです。

例外となるのは送信開始と送信終了の合図を行う場合です。
クロックが1の時に送信データが1から0へ切り替わると送信開始を表します。
クロックが1の時に送信データが0から1へ切り替わると送信終了を表します。
もうすこし汎用的な図にするとこうなります。

D0~D7は送信されるデータで0の時もあれば1の時もあります。


また、スレーブがクロックを送信する場合もあります。
スレーブ内の処理が間に合わない場合、通信を一時中断する必要があります。
しかし、通信はマスターから送られてくるクロックに従わなければいけません。
そこで、スレーブが通信を一時中断したい時、クロックLを送信し続けます。

するとクロックがLに固定され、これをマスターが検知して通信を中断します。
スレーブのクロック送信が停止すると通信が再開されます。

この様にデータ線だけでなく、クロック線もマスター、スレーブ共に送信、受信の両機能が必要となります。


スレーブ内の読出し番地指定(2018/09/22追記)

スレーブから読み出すデータが1種類の場合はスレーブ自体の番地指定だけで問題ありません。
しかし、多くの場合はスレーブ内に番地が割り振ってありスレーブ自体の番地以外にも番地を
指定する必要があります。
しかし、スレーブ自体の読出しアドレスを指定するとスレーブはアドレスを受信した時点で
データを送信開始してしまうため、スレーブ内の番地を指定することができません。
そこで、

 書込み指令 → 読出し指令(→データ読出し)

の手順を処理する必要があります。
より詳細な手順だと

 通信開始 → 書込み番地指定 → 内部番地指定 → 通信終了
 通信開始 → 読出し番地指定 → データ受信 → 通信終了

となります。

この手順で受信はできるのですが、1回目の通信終了から2回目の通信開始までに
他の通信が割り込むと1回目の通信設定が解除されるそうです。
そこで、

 通信開始 → 書込み番地 → 内部番地 → 通信開始 → 読出し番地 → データ受信 → 通信終了

の様に通信を終了せずに再度通信開始信号を送ることで他の通信の割り込みを防止します。
これをリスタートと呼びます。


続き
I2Cの設定(1)無理矢理動かす
I2Cの設定(2)もう少し真面目に動かす
PR

コメント

プロフィール

HN:
ぼんどF博士
性別:
男性
自己紹介:

最新コメント