目次

IICバスアクセス

 IICバスは、クロック(SCL)とデータ(SDA)の2本を  利用し、マスターとスレーブ間で、データをシリアルで伝送する。  SCLは、バスマスターが出力するが、SDAはリードとライトで  方向が変更になる。  マスターとスレーブの間で、次のシーケンスでデータ交換する。
  1. スタートコンディション設定
  2. データ交換
  3. ストップコンディション設定
 スタートコンディション、ストップコンディション、データ交換に  分け説明する。

スタートコンディション

 スタートコンディションは、次の3つのシーケンスでSDA、SCL  の状態を設定すればよい。
  1. (SCL,SDA)=(H,H) or (ON ,ON )
  2. (SCL,SDA)=(H,L) or (ON ,OFF)
  3. (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  の状態を設定すればよい。
  1. (SCL,SDA)=(H,L) or (ON ,OFF)
  2. 時間稼ぎ
  3. (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情報を含ませ、シリアル  転送する。
  1. デバイスID 4ビット
  2. アドレス  3ビット
  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情報を含ませ、シリアル  転送する。
  1. デバイスID 4ビット
  2. アドレス  3ビット
  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 ;  }
目次

inserted by FC2 system