專注差異化嵌入式產品解決方案 給智能產品定制注入靈魂給予生命
提供開發工具、應用測試 完善的開發代碼案例庫分享
從全面的產品導入到強大技術支援服務 全程貼心伴隨服務,創造無限潛能!
用c語言實現24LC256讀寫
#i nclude
unsigned char i=0;
unsigned char receive=0x00;
void i2c_start()
{
SEN=1; //啟動
do{
}while(SSPIF==0);
SSPIF=0;
}
void i2c_stop()
{
PEN=1; //產生停止條件
do{
;
}while(SSPIF==0);
SSPIF=0;
}
void i2c_restart()
{
RSEN=1; //啟動,反復啟動
do{
;
}while(SSPIF==0);
SSPIF=0;
}
void i2c_dataout() //數據發送等待過程
{
do{
;
}while(SSPIF==0);
SSPIF=0;
}
void i2c_datain() //讀取24LC256時,不是讀的最后一個字節時使用
{
RCEN=1;
do{
;
}while(SSPIF==0);
SSPIF=0;
receive=SSPBUF;
ACKDT=0;
ACKEN=1;
do{
;
}while(SSPIF==0);
SSPIF=0;
}
void i2c_datainlast() //讀取最后一個字節,或只讀取24lc256中一個字節
{
SSPIF=0;
RCEN=1;
do{
;
}while(SSPIF==0);
SSPIF=0;
receive=SSPBUF;
ACKDT=1 ;
ACKEN=1;
do{
;
}while(SSPIF==0);
SSPIF=0;
}
void i2c_error()
{
i2c_stop();
return;
}
void write(unsigned int addr,unsigned char data,unsigned int n) //向iic寫入一字節數據 地址,數據,字節個數
{
i2c_start();
SSPBUF=0xA0;//EEPROM尋址碼和寫操作命令碼
i2c_dataout(); //發送
if(ACKSTAT)
i2c_error(); //無應答,錯誤!
else if(!ACKSTAT)
SSPBUF=addr/256;
//高eeaddr/256 ,取eeprom數據地址高字節
i2c_dataout(); //發送
if(ACKSTAT)
i2c_error(); //無應答,錯誤!
else if(!ACKSTAT)
SSPBUF=addr%256;//低eeaddr%256 ,取eeprom數據地址低字節
i2c_dataout(); //發送
for(i=0;i {
if(ACKSTAT)//應答
i2c_error(); //無應答,錯誤!
else if(!ACKSTAT)
SSPBUF=data;//eedata 入eeprom的數據
i2c_dataout();//發送
}
if(ACKSTAT)//應答
i2c_error();
i2c_stop(); //產生停止位,啟動eeprom內部些過程
do{
i2c_start();
SSPBUF=0xA0;
i2c_dataout();
i2c_stop();
if(!ACKSTAT)break;
}while(ACKSTAT);
}
unsigned int current_read(void)//current address read ok!
{
i2c_start();
SSPBUF=0xA1;//尋址命令碼0xA0 和 讀命令
i2c_dataout();
if(ACKSTAT)//應答
i2c_error();
else if(!ACKSTAT)
i2c_datainlast();
i2c_stop();
return ((unsigned int)receive);
}
unsigned int random_read(unsigned int eepromaddress)
{
i2c_start();
SSPBUF=0xA0;//EEPROM尋址碼和寫操作命令碼
i2c_dataout(); //發送
if(ACKSTAT)
i2c_error(); //無應答,錯誤!
else if(!ACKSTAT)
SSPBUF=eepromaddress/256;
//高eeaddr/256 ,取eeprom數據地址高字節
i2c_dataout(); //發送
if(ACKSTAT)
i2c_error(); //無應答,錯誤!
else if(!ACKSTAT)
SSPBUF=eepromaddress%256;//低eeaddr%256 ,取eeprom數據地址低字節
i2c_dataout(); //發送
if(ACKSTAT)
i2c_error(); //無應答,錯誤!
else if(!ACKSTAT)
i2c_restart();
SSPBUF=0xA1;//尋址命令碼0xA0 和 讀命令
i2c_dataout();
if(ACKSTAT)//應答
i2c_error();
else if(!ACKSTAT)
i2c_datainlast();
i2c_stop();
return ((unsigned int)receive);
}
void i2c_init()
{
SSPSTAT=0x00;
TRISC=0xD8;
SSPADD=19;
SSPIE=0;
SSPCON=0x28;
}
//在主程序中,先i2c_init();然后開始讀/寫24LC256中數據,經多次運行
no bug
//程序中的寄存器必須芯片內部包含,否則無法實現硬件iic讀寫。