トップページ > dsPIC入門 > dsPICでI2C(7)

シリアルEEPROMのための基本関数

ソースコード:EEPROM用の関数

//********************************************************************
//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++);  
}





前へ   次へ