トップページ > dsPIC入門 > dsPICでI2C(7)
//********************************************************************
//I2CでEEPROMを操作するための関数群
//********************************************************************
//********************************************************************
//関数プロトタイプ宣言
//********************************************************************
//I2C初期化用関数
void init_I2C(void);
//1バイト書き込み用関数
void EEPROM_write(int address,char data);
//1バイト読み出し用関数
char EEPROM_read(int address);
//時間稼ぎのための関数
void wait(void);
void wait2(void);
//********************************************************************
//ヘッダファイル
//********************************************************************
#include "p30f4012.h"
#include "i2c.h"
//********************************************************************
//初期化用関数
//********************************************************************
void init_I2C(void)
{
//I2Cの設定パラメータ
unsigned int I2Cconfig1 = I2C_ON & I2C_IDLE_CON & I2C_CLK_HLD & I2C_IPMI_DIS & I2C_7BIT_ADD & I2C_SLW_DIS
& I2C_SM_DIS &I2C_GCALL_DIS & I2C_STR_EN & I2C_NACK & I2C_ACK_DIS & I2C_RCV_DIS
& I2C_STOP_DIS & I2C_RESTART_DIS;
unsigned int I2Cconfig2 = 180; //100kbpsのつもり。
OpenI2C(I2Cconfig1,I2Cconfig2);
ConfigIntI2C(MI2C_INT_OFF & SI2C_INT_OFF);
IdleI2C();
}
//********************************************************************
//EEP-ROM書き込み用関数
//********************************************************************
void EEPROM_write(int address,char data)
{
char low_temp;
char high_temp;
low_temp = (char)(address & 0x00ff);
high_temp = (char)((address >> 8) & 0x00ff);
IdleI2C();
//============================================================
//スタートコンディション発行
StartI2C();
while(I2CCONbits.SEN);
//============================================================
//デバイス・アドレス送信
MasterWriteI2C(0b10100000);
//データ送信完了まで待つ。
while(I2CSTATbits.TRSTAT);
//スレーブ側からアクノリッジが帰ってきていることを確認
while(I2CSTATbits.ACKSTAT);
IdleI2C();
wait();
//============================================================
//アドレス上位送信
MasterWriteI2C(high_temp);
//データ送信完了まで待つ。
while(I2CSTATbits.TRSTAT);
//スレーブ側からアクノリッジが帰ってきていることを確認
while(I2CSTATbits.ACKSTAT);
IdleI2C();
wait();
//============================================================
//アドレス下位送信
MasterWriteI2C(low_temp);
//データ送信まで待ちます。
while(I2CSTATbits.TRSTAT);
//スレーブ側からアクノリッジが帰ってきていることを確認
while(I2CSTATbits.ACKSTAT);
IdleI2C();
wait();
//============================================================
//記録データ送信
MasterWriteI2C(data);
//データ送信まで待ちます。
while(I2CSTATbits.TRSTAT);
//スレーブ側からアクノリッジが帰ってきていることを確認
while(I2CSTATbits.ACKSTAT);
wait();
//通信を一時停止。
StopI2C();
IdleI2C();
wait2();
return;
}
//********************************************************************
//EEP-ROM読み出し用関数
//********************************************************************
char EEPROM_read(int address)
{
unsigned char received_data;
char low_temp;
char high_temp;
low_temp = (char)(address & 0x00ff);
high_temp = (char)((address >> 8) & 0xff);
//スタートコンディション発行
IdleI2C();
StartI2C();
while(I2CCONbits.SEN);
//============================================================
//アドレス送信
MasterWriteI2C(0b10100000);
//データ送信完了まで待つ。
while(I2CSTATbits.TRSTAT);
//スレーブ側からアクノリッジが帰ってきていることを確認
while(I2CSTATbits.ACKSTAT);
//待機
IdleI2C();
wait();
//============================================================
//High-Address送信
MasterWriteI2C(high_temp);
//データ送信まで待ちます。
while(I2CSTATbits.TRSTAT);
//スレーブ側からアクノリッジが帰ってきていることを確認
while(I2CSTATbits.ACKSTAT);
//待機
IdleI2C();
wait();
//============================================================
//Low_Address送信
MasterWriteI2C(low_temp);
//データ送信まで待ちます。
while(I2CSTATbits.TRSTAT);
//スレーブ側からアクノリッジが帰ってきていることを確認
while(I2CSTATbits.ACKSTAT);
//待機
IdleI2C();
wait();
//============================================================
//スタートコンディション再発行。
RestartI2C();
while(I2CCONbits.RSEN);
//============================================================
//アドレス送信
MasterWriteI2C(0b10100001);
//データ送信完了まで待つ。
while(I2CSTATbits.TRSTAT);
//スレーブ側からアクノリッジが帰ってきていることを確認
while(I2CSTATbits.ACKSTAT);
//待機
IdleI2C();
wait();
//============================================================
//データ受信
received_data = MasterReadI2C();
IdleI2C();
//データ送信完了を知らせるためにNACKを返します。
NotAckI2C();
IdleI2C();
//通信を一時停止。
StopI2C();
IdleI2C();
return received_data;
}
//********************************************************************
//時間稼ぎ関数
//********************************************************************
void wait(void)
{
int i;
for(i=0;i<500;i++);
}
void wait2(void)
{
unsigned int i;
for(i=0;i<60000;i++);
}