【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
ReadI2CI2Cバスから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
WriteI2CI2Cバスに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エラーリターン
}