用c語言實現(xiàn)24LC256讀寫(非軟件模擬方式)
#include
unsignedchari=0;
unsignedcharreceive=0x00;
voidi2c_start()
{
SEN=1;//啟動
do{
}while(SSPIF==0);
SSPIF=0;
}
voidi2c_stop()
{
PEN=1;//產生停止條件
do{
;
}while(SSPIF==0);
SSPIF=0;
}
voidi2c_restart()
{
RSEN=1;//啟動,反復啟動
do{
;
}while(SSPIF==0);
SSPIF=0;
}
voidi2c_dataout()//數(shù)據(jù)發(fā)送等待過程
{
do{
;
}while(SSPIF==0);
SSPIF=0;
}
voidi2c_datain()//讀取24LC256時,不是讀的最后一個字節(jié)時使用
{
RCEN=1;
do{
;
}while(SSPIF==0);
SSPIF=0;
receive=SSPBUF;
ACKDT=0;
ACKEN=1;
do{
;
}while(SSPIF==0);
SSPIF=0;
}
voidi2c_datainlast()//讀取最后一個字節(jié),或只讀取24lc256中一個字節(jié)
{
SSPIF=0;
RCEN=1;
do{
;
}while(SSPIF==0);
SSPIF=0;
receive=SSPBUF;
ACKDT=1;
ACKEN=1;
do{
;
}while(SSPIF==0);
SSPIF=0;
}
voidi2c_error()
{
i2c_stop();
return;
}
voidwrite(unsignedintaddr,unsignedchardata,unsignedintn)//向iic寫入一字節(jié)數(shù)據(jù)地址,數(shù)據(jù),字節(jié)個數(shù)
{
i2c_start();
SSPBUF=0xA0;//EEPROM尋址碼和寫操作命令碼
i2c_dataout();//發(fā)送
if(ACKSTAT)
i2c_error();//無應答,錯誤!
elseif(!ACKSTAT)
SSPBUF=addr/256;
//高eeaddr/256,取eeprom數(shù)據(jù)地址高字節(jié)
i2c_dataout();//發(fā)送
if(ACKSTAT)
i2c_error();//無應答,錯誤!
elseif(!ACKSTAT)
SSPBUF=addr%256;//低eeaddr%256,取eeprom數(shù)據(jù)地址低字節(jié)
i2c_dataout();//發(fā)送
for(i=0;i
if(ACKSTAT)//應答
i2c_error();//無應答,錯誤!
elseif(!ACKSTAT)
SSPBUF=data;//eedata入eeprom的數(shù)據(jù)
i2c_dataout();//發(fā)送
}
if(ACKSTAT)//應答
i2c_error();
i2c_stop();//產生停止位,啟動eeprom內部些過程
do{
i2c_start();
SSPBUF=0xA0;
i2c_dataout();
i2c_stop();
if(!ACKSTAT)break;
}while(ACKSTAT);
}
unsignedintcurrent_read(void)//currentaddressreadok!
{
i2c_start();
SSPBUF=0xA1;//尋址命令碼0xA0和讀命令
i2c_dataout();
if(ACKSTAT)//應答
i2c_error();
elseif(!ACKSTAT)
i2c_datainlast();
i2c_stop();
return((unsignedint)receive);
}
unsignedintrandom_read(unsignedinteepromaddress)
{
i2c_start();
SSPBUF=0xA0;//EEPROM尋址碼和寫操作命令碼
i2c_dataout();//發(fā)送
if(ACKSTAT)
i2c_error();//無應答,錯誤!
elseif(!ACKSTAT)
SSPBUF=eepromaddress/256;
//高eeaddr/256,取eeprom數(shù)據(jù)地址高字節(jié)
i2c_dataout();//發(fā)送
if(ACKSTAT)
i2c_error();//無應答,錯誤!
elseif(!ACKSTAT)
SSPBUF=eepromaddress%256;//低eeaddr%256,取eeprom數(shù)據(jù)地址低字節(jié)
i2c_dataout();//發(fā)送
if(ACKSTAT)
i2c_error();//無應答,錯誤!
elseif(!ACKSTAT)
i2c_restart();
SSPBUF=0xA1;//尋址命令碼0xA0和讀命令
i2c_dataout();
if(ACKSTAT)//應答
i2c_error();
elseif(!ACKSTAT)
i2c_datainlast();
i2c_stop();
return((unsignedint)receive);
}
voidi2c_init()
{
SSPSTAT=0x00;
TRISC=0xD8;
SSPADD=19;
SSPIE=0;
SSPCON=0x28;
}
//在主程序中,先i2c_init();然后開始讀/寫24LC256中數(shù)據(jù),經多次運行
nobug
//程序中的寄存器必須芯片內部包含,否則無法實現(xiàn)硬件iic讀寫。
c語言相關文章:c語言教程
評論