MPLAB-C18のI2C用関数の使い方


【MPALB-C18のI2C用関数】

MPLAB−C18にはあらかじめI2C制御用の組込み関数が用意されています。
しかもPIC内蔵のI2Cモジュール制御用と、I2Cモジュールを内蔵していないPIC用
のソフトウェア制御のI2C用関数の2種類が組込まれています。
ここでは、内蔵モジュール用のI2C用組込み関数の説明をします。

【関数の種類一覧】

用意されている組込み関数には下表のものがあります。これらを組み合わせて
I2C制御を行うことになります。

関数名 機能説明/基本フォーマット 使用例
AckI2C I2CバスにACKを送出する AckI2C();
 void AckI2C (void);
CloseI2C SSPモジュールを未使用状態にする CloseI2C();
 void VloseI2C (void);
DataRdyI2C SSPBUFにデータがあれば1を返し
無ければ0を返す
if (DataRdyI2C());
 unsigned char DataRdyI2C (void);
getscI2C
ReadI2C
I2Cバスから1バイト読みこむ unsigned char value;
value = ReadI2C();
 unsigned char ReadI2C (void);
getsI2C マスターモードで使用
 指定された長さのデータを I2Cバスから読み込む 
unsigned char string[15];
unsigned char *ptrstring;
ptrstring = string;
getsI2C(ptrstring, 15);
unsigned char getsI2C
    (unsigned char *rdptr, unsigned length);
IdleI2C I2Cバスがアイドル状態になるのを待つ IdleI2C();
 void IdleI2C (void);
NotAckI2C I2CバスにNot Acknowledgeを出力する NotAckI2C();
 void NotAckI2C (void);
OpenI2C SSPモジュールのコンフィギュレーションをする
sync_mode:アドレス長とマスター/スレーブを指定
  SALVE_7 :7ビットアドレスのスレーブモードにする
  SLAVE_10 :10ビットアドレスのスレーブモードにする
  MASTER :マスターモードにする
slew :スルーレート制御をする/しないの設定
  SLEW_OFF :100kHzモードにする
  SLEW_ON  :400kHzモードにする
OpenI2C(MASTER, SLEW_ON);
 void OpenI2C
   (unsigned char sync_mode, unsigned char slew);
putI2C
WriteI2C
I2Cバスに1バイトのデータを出力する WriteI2C('a');
 unsigned char WriteI2C (unsigned char data_out);
putsI2C ポインタの指すデータ群を、nullデータが見つかるまで
I2Cバスに送信する
   wrptr :RAM上のデータのポインター
戻り値
 マスターモードの時
  0 :正常終了  -2 :スレーブからNot Ackを受信
 -3 :衝突発生
 スレーブモードの時
  0 :正常終了  -2 :マスタからNot Ackを受信
unsigned char string[]
    = "data to send";
unsigned char *ptrstring;
ptrstring = string;
putsI2C(ptrstring);
 unsigned char putsI2C (unsigned char *wrptr);
RestartI2C I2Cバスにrestart conditionを出力する RestartI2C();
 void RestartI2C (void);
StartI2C I2Cバスにstart conditionを出力する StartI2C();
 void StartI2C (void)
StopI2C I2Cバスにstop conditionを出力する StopI2C();
 void StopI2C (void);


【マスター送信手順】

上表の関数の実際の使い方を説明します。まずマスター側送信の時のマスタ側の手順は
下記のようにします。

   IdleI2C();             // I2Cがアイドル状態を確認
   StartI2C();             // start conditionの送出
   while (SSPCON2bits.SEN)      // start condition終了待ち
   if (PIR2bits.BCLIF)        // 衝突チェック
     { return(-1); }       // 衝突発生エラーリターン
   else
   {
     if (writeI2C(control))     // アドレスとWrite Mode送信
       { return(-3); }      // エラーリターン
     IdleI2C();           // アイドル状態確認
     if (!SSPCON2bits.ACKSTAT){   // スレーブからのACK確認
       if (putsI2C(wrptr))    // データ出力
         { return(-4); }    // エラーリターン
     }
     else
       { return(-2); }      // Not Ackのエラーリターン
   }
   IdleI2C();             // アイドル確認
   StopI2C();             // stop condition送出
   while (SSPCON2bits.PEN);      // stop出力待ち
   if (PIR2bits.BCLIF)        // 衝突確認
     { return(-1); }        // 衝突発生エラーリターン
   return(0);             // 正常終了リターン


【マスター受信手順】

次はマスター側受信の時のマスタ側の手順の作り方です。

   IDLEI2C();             // アイドル状態確認
   StartI2C();             // 初期start condition送出
   while (SSPCON2bits.SEN);      // start出力完了待ち
   if (PIR2bits.BCLIF)        // 衝突チェック
     { return(-1); }        // 衝突発生エラーリターン
   else
   {
     if (WriteI2C(control))     // アドレスとRead Mode出力
       { return(-3); }      // 衝突発生エラーリターン
     IdleI2C();           // アイドル確認
     if (!SSPCON2bits.ACKSTAT) {  // ACKチェック
       if (getsI2C(rdptr,length))
         { return(-1); }    // 衝突検出エラーリターン
       NotAckI2C();        // Not Ack出力(終了通知)
       while (SSPCON2bits.ACKEN) // NotACK出力終了を待つ
       StopI2C();         // stop condition出力
       while (SSPCON2bits.PEN)  // Stop 出力待ち
       if (PIR2bits.BCLIF)    // 衝突チェック
         { return(-1); }    // 衝突エラーリターン
     }
     else
       { return(-2); }      // Not Ackエラーリターン
   }




  トップページへ