I2C協(xié)議標準代碼
1. 起始信號&停止信號
起始信號:當 SCL 線(xiàn)是高電平時(shí) SDA 線(xiàn)從高電平向低電平切換。
停止信號:當 SCL 線(xiàn)是高電平時(shí) SDA 線(xiàn)由低電平向高電平切換。
2. 起始信號代碼
void I2cstart() //起始信號
{
SDA=1;
Delay8us();
SCL=1;
Delay8us();
SDA=0;
Delay8us();
SCL=0;
Delay8us();
}
3. 停止信號代碼
void I2cstop() //停止信號
{
SDA=0;
Delay8us();
SCL=1;
Delay8us();
SDA=1;
Delay8us();
}
4.發(fā)送一個(gè)字節
unsigned char I2cSendByte(unsigned char dat) //CPU向設備發(fā)送一個(gè)字節
{
unsigned char a=0,b=0;
for(a=0;a<>
{
SDA=dat>>7;
dat=dat<>
Delay8us();
SCL=1;
Delay8us();
SCL=0;
Delay8us();
}
SDA=1;
Delay8us();
SCL=1;
while(SDA) //等待設備應答
{
b++;
if(b>200)
{
SCL=0;
Delay8us();
return 0; //設備無(wú)應答,返回0,并跳出此程序
}
}
SCL=0;
Delay8us();
return 1; //設備有應答,返回1,并跳出此程序
}
5.讀取一個(gè)字節
unsigned char I2cReadByte() //CPU向設備讀取一個(gè)字節
{
unsigned char a=0,dat=0;
SDA=1;
Delay8us();
for(a=0;a<>
{
SCL=1;
Delay8us();
dat<>
dat|=SDA;
Delay8us();
SCL=0;
Delay8us();
}
return dat; //返回dat,并跳出此程序
}
6. 向24C02地址addr,寫(xiě)數據dat
void At24c02Write(unsigned char addr,unsigned char dat) //向24C02地址addr,寫(xiě)數據dat
{
I2cstart(); //啟動(dòng)
I2cSendByte(0xa0); //發(fā)送24C02設備地址
I2cSendByte(addr); //發(fā)送24C02寄存器地址
I2cSendByte(dat); //發(fā)送數據
I2cstop(); //停止
}
7. 讀取24C02寄存器addr中的數據
unsigned char At24c02Read(unsigned char addr) //讀取24C02寄存器addr中的數據
{
unsigned char num;
I2cstart(); //開(kāi)始
I2cSendByte(0xa0); //發(fā)送24C02設備地址-寫(xiě)
I2cSendByte(addr); //發(fā)送24C02寄存器地址
I2cstart(); //改變傳輸方式,重新開(kāi)始
I2cSendByte(0xa1); //發(fā)送24C02設備地址-讀
num=I2cReadByte(); //接收數據并保存至num
I2cstop(); //停止
return num; //返回讀取值num
}
8.I2C寫(xiě)數據八個(gè)步驟
第一步,發(fā)送一個(gè)起始信號。
第二步,發(fā)送7bit從機地址,即24C02的地址。此處需要注意,發(fā)送數據時(shí),無(wú)法發(fā)送7bit數據,此處發(fā)送了7bit地址+1bit讀寫(xiě)選擇位,即發(fā)送7bit+r/w。最低位為1表示讀,為0表示寫(xiě)。
第三步,產(chǎn)生一個(gè)ACK應答信號,此應答信號為從機器件產(chǎn)生的應答。
第四步,發(fā)送寄存器地址,8bit數據。
第五步,產(chǎn)生一個(gè)ACK應答信號,此應答信號為從機器件產(chǎn)生的應答。
第六步,發(fā)送一個(gè)數據,8bit數據。
第七步,產(chǎn)生一個(gè)ACK應答信號,此應答信號為從機器件產(chǎn)生的應答信號。
第八步,發(fā)送一個(gè)停止信號。
9. I2C讀數據十一個(gè)步驟
第一步,發(fā)送一個(gè)起始信號。
第二步,發(fā)送7bit從機地址,即24C02的地址。此處需要注意,發(fā)送數據時(shí),無(wú)法發(fā)送7bit數據,此處發(fā)送了7bit地址+1bit讀寫(xiě)選擇位,即發(fā)送7bit+r/w。最低位為1表示讀,為0表示寫(xiě)。
第三步,產(chǎn)生一個(gè)ACK應答信號,此應答信號為從機器件產(chǎn)生的應答。
第四步,發(fā)送寄存器地址。
第五步,產(chǎn)生一個(gè)ACK應答信號,此應答信號為從機器件產(chǎn)生的應答。
第六步,再次發(fā)送一個(gè)起始信號。
第七步,發(fā)送7bit從機地址,即24C02的地址。此處需要注意,發(fā)送數據時(shí),無(wú)法發(fā)送7bit數據,此處發(fā)送了7bit地址+1bit讀寫(xiě)選擇位,即發(fā)送7bit+r/w。最低位為1表示讀,為0表示寫(xiě)。
第八步,產(chǎn)生一個(gè)ACK應答信號,此應答信號為從機器件產(chǎn)生的應答。
第九步,讀取一個(gè)字節(8bit)的數據。
第十步,產(chǎn)生一個(gè)ACK應答信號,此應答信號為CPU產(chǎn)生。
第十一步,產(chǎn)生一個(gè)停止信號。
聯(lián)系客服