トップページ > 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++); }