目次
前
次
IICバスアクセス
IICバスは、クロック(SCL)とデータ(SDA)の2本を
利用し、マスターとスレーブ間で、データをシリアルで伝送する。
SCLは、バスマスターが出力するが、SDAはリードとライトで
方向が変更になる。
マスターとスレーブの間で、次のシーケンスでデータ交換する。
- スタートコンディション設定
- データ交換
- ストップコンディション設定
スタートコンディション、ストップコンディション、データ交換に
分け説明する。
スタートコンディション
スタートコンディションは、次の3つのシーケンスでSDA、SCL
の状態を設定すればよい。
- (SCL,SDA)=(H,H) or (ON ,ON )
- (SCL,SDA)=(H,L) or (ON ,OFF)
- (SCL,SDA)=(L,L) or (OFF,OFF)
信号が確定したことを、スレーブのデバイスに認識させるため
多少時間が必要なので、関数iic_waitで時間を稼ぐとすると、
次のように定義すればよい。
void put_iic_start(void)
{
/* both high level */
SCL = ON ; SDA = ON ; iic_wait();
/* 0 -> SDA */
SDA = OFF ; iic_wait();
/* 0 -> SCL */
SCL = OFF ;
}
ストップコンディション
スタートコンディションは、次の3つのシーケンスでSDA、SCL
の状態を設定すればよい。
- (SCL,SDA)=(H,L) or (ON ,OFF)
- 時間稼ぎ
- (SCL,SDA)=(H,H) or (ON ,ON )
信号が確定したことを、スレーブのデバイスに認識させるため
多少時間が必要なので、関数iic_waitで時間を稼ぐとすると、
次のように定義すればよい。
void put_iic_stop(void)
{
/* set level */
SCL = ON ; SDA = OFF ; iic_wait();
/* both level change */
SDA = ON ; iic_wait();
}
データ交換
データ交換は、ライト処理とリード処理に分かれる。
ライト処理は、8ビットの中に次の3情報を含ませ、シリアル
転送する。
- デバイスID 4ビット
- アドレス 3ビット
- ライト指定 1ビット
デバイスIDは、そのデバイスにより固定されている。
例えば、EEPROMなら1010(2進数)である。
アドレスは、0〜7であるが、そのデバイスがハード上
(A2,A1,A0)にH、Lをどのパターンで指定しているか
を記述する。
ライト指定の1ビットは、常に0とする。
8ビットを出力すると、デバイスからACK、NACKの
信号が出力されるので、SDAを出力から入力に変更し、
返送信号を入力できるようにする。
H8/Tinyの場合の関数を作成する。
UBYTE put_iic_data(UBYTE x)
{
UBYTE i,tmp ;
/* load raw data */
tmp = x ;
/* transfer data with write code */
for ( i = 0 ; i < 8 ; i++ ) {
/* send bit datum */
SDA = OFF ;
if ( tmp & MASK80 ) { SDA = ON ; }
/* 1 -> SCL */
SCL = ON ; iic_wait();
/* shift */
tmp <<= 1 ;
/* 0 -> SCL */
SCL = OFF ; iic_wait();
}
/* change inupt */
IO.PCR5 &= ~MASK80 ;
/* 1 -> SCL */
SCL = ON ; iic_wait();
/* get acknowledge */
tmp = SDA ;
/* 0 -> SCL */
SCL = OFF ; iic_wait();
/* change output */
IO.PCR5 |= MASK80 ;
return tmp ;
}
リード処理は、8ビットの中に次の3情報を含ませ、シリアル
転送する。
- デバイスID 4ビット
- アドレス 3ビット
- リード指定 1ビット
デバイスIDとアドレスは、ライトの場合と同じである。
リード指定の1ビットは、常に1とする。
8ビットで、必要なコマンドを与えた後に、8ビットずつデータ
を返してくる。8ビットで収まらないときには、SDAピンに、
NACKを返す。SDAピンからACKを返すまで、8ビットの
データを入力しなければならないが、最下層の処理は、ACKを
返したかNACKを返したのかを、関数の返値として上位に提示
する。
H8/Tinyの場合の関数を作成する。
UBYTE get_iic_data(UBYTE x)
{
UBYTE i,result ;
/* change inupt */
IO.PCR5 &= ~MASK80 ;
/* default */
result = 0 ;
for ( i = 0 ; i < 8 ; i++ ) {
/* shift */
result <<= 1 ;
/* 1 -> SCL */
SCL = ON ; iic_wait();
/* get bit datum */
result |= SDA ; iic_wait();
/* 0 -> SCL */
SCL = OFF ; iic_wait();
}
/* change output */
IO.PCR5 |= MASK80 ;
if ( x > 0 ) { SDA = ON ; }
else { SDA = OFF ; }
iic_wait();
/* 1 -> SCL */
SCL = ON ; iic_wait();
/* 0 -> SCL */
SCL = OFF ; iic_wait();
return result ;
}
目次
前
次