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