IIC总线通讯协议、EEPROM芯片
生活随笔
收集整理的這篇文章主要介紹了
IIC总线通讯协议、EEPROM芯片
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
EEPROM芯片: 掉電不會(huì)丟失數(shù)據(jù),可以保存數(shù)據(jù)。
IIC串行總線的組成及工作原理:
IIC總線傳輸協(xié)議
IIC產(chǎn)生起始與終止信號(hào):
IIC字節(jié)的傳送與應(yīng)答:
應(yīng)答位作用:
數(shù)據(jù)幀格式:
總線尋址
軟件模擬IIC通信時(shí)序
IIc通信代碼示例(通過(guò)數(shù)碼管顯示單片機(jī)通過(guò)IIC通信接收到的數(shù)據(jù)):
#include <reg52.h> #include <intrins.h>#define uint unsigned int #define uchar unsigned char #define At24c02ADDR 0XA0 //AT24C02硬件地址 #define I2cRead 1 //I2C讀方向位 #define I2cWrite 0 //I2C寫(xiě)方向位sbit DU = P2^6;//數(shù)碼管段選 sbit WE = P2^7;//數(shù)碼管段選 sbit SCL = P2^1;//I2C時(shí)鐘總線 sbit SDA = P2^0;//I2C數(shù)據(jù)總線 uchar num;//數(shù)碼管顯示的值 bit AckFlag;//應(yīng)答標(biāo)志位//共陰數(shù)碼管段選表0-9 uchar code SMGduan[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,}; //數(shù)碼管位選碼 uchar code SMGwei[] = {0xfe, 0xfd, 0xfb};void delay(uint z) {uint x,y;for(x = z; x > 0; x--)for(y = 114; y > 0 ; y--); } void display(uchar i) {static uchar wei; P0 = 0XFF;//清除斷碼WE = 1;//打開(kāi)位選鎖存器P0 = SMGwei[wei];WE = 0;//鎖存位選數(shù)據(jù)switch(wei){case 0: DU = 1; P0 = SMGduan[i / 100]; DU = 0; break;case 1: DU = 1; P0 = SMGduan[i % 100 / 10]; DU = 0; break; case 2: DU = 1; P0 = SMGduan[i % 10]; DU = 0; break; }wei++;if(wei == 3)wei = 0; } //定時(shí)器0初始化 void timer0Init() {EA = 1; //打開(kāi)總中斷ET0 = 1;//打開(kāi)定時(shí)器0中斷TR0 = 1; //啟動(dòng)定時(shí)器0TMOD |= 0X01; //定時(shí)器工作模式1,16位定時(shí)模式TH0 = 0xED;TL0 = 0xFF; //定時(shí)5ms } /**************************************************** IIC通信代碼 ****************************************************/ //延時(shí)5us void delay5us() {_nop_();//執(zhí)行一次是一個(gè)機(jī)器周期,進(jìn)入這個(gè)函數(shù)需要3個(gè)多機(jī)器周期 } //時(shí)鐘總線為高電平期間數(shù)據(jù)總線由高變低產(chǎn)生起始信號(hào) void I2cStart() {SCL = 1; SDA = 1;delay5us();//狀態(tài)保持5usSDA = 0;delay5us();//狀態(tài)保持5us//這個(gè)函數(shù)根據(jù)圖像來(lái)寫(xiě) } //時(shí)鐘總線為高電平期間,數(shù)據(jù)總線從高變低產(chǎn)生終止信號(hào) void I2cStop() {SCL = 0;SDA = 0;SCL = 1;delay5us();//狀態(tài)保持5usSDA = 1;delay5us();//狀態(tài)保持5us//這個(gè)函數(shù)根據(jù)圖像來(lái)寫(xiě) }bit ReadACK() {SCL = 0;//拉低時(shí)鐘總線,允許從機(jī)控制SDASCL = 1;//拉高,讀SDAdelay5us();if(SDA)//非應(yīng)答{SCL = 0;return(1);//返回1}else//應(yīng)答 {SCL = 0;return(0);//返回0} }void SendACK(bit i) {SCL = 0;//拉低時(shí)鐘總線,允許主機(jī)控制SDAif(i) //發(fā)非應(yīng)答SDA = 1;else //發(fā)應(yīng)答SDA = 0;SCL = 1; //拉高總線,讓從機(jī)讀SDAdelay5us();//保持5usSCL = 0; //拉低時(shí)鐘總線,允許SDA釋放SDA = 1;//釋放數(shù)據(jù)總線 }void I2cSendByte(uchar DAT) {uchar i; for(i=0; i<8; i++) //分別寫(xiě)8次,每次寫(xiě)1位{SCL = 0;//拉低時(shí)鐘總線,允許SDA變化if(DAT & 0x80)//先寫(xiě)數(shù)據(jù)最高位SDA = 1; //寫(xiě)1elseSDA = 0; //寫(xiě)0SCL = 1; //拉高時(shí)鐘,讓從機(jī)讀SDADAT <<= 1; //為發(fā)送下一位左移1位}SCL = 0; //拉低時(shí)鐘總線,允許SDA釋放SDA = 1;//釋放數(shù)據(jù)總線 }void At24c02Write(uchar ADDR, DAT) {I2cStart();//I2C起始信號(hào)I2cSendByte(At24c02ADDR + I2cWrite);//發(fā)送器件地址加讀寫(xiě)方向位if(ReadACK()) //讀從機(jī)應(yīng)答AckFlag = 1; //NOACKelseAckFlag = 0; //ACKI2cSendByte(ADDR);//發(fā)送儲(chǔ)存單元地址字節(jié)if(ReadACK())//讀從機(jī)應(yīng)答AckFlag = 1; //NOACKelseAckFlag = 0; //ACKI2cSendByte(DAT);//發(fā)送一字節(jié)數(shù)據(jù)if(ReadACK())//讀從機(jī)應(yīng)答AckFlag = 1; //NOACKelseAckFlag = 0; //ACKI2cStop(); //I2C停止信號(hào) }uchar I2cReadByte() {uchar i, DAT;for(i=0; i<8; i++)//分別讀8次,每次讀一位{DAT <<= 1; //數(shù)據(jù)左移1位,準(zhǔn)備接收一位SCL = 0; //拉低時(shí)鐘總線,允許從機(jī)控制SDA變化SCL = 1; //拉高時(shí)鐘總線,讀取SDA上的數(shù)據(jù)if(SDA)DAT |= 0X01;//為1則寫(xiě)1,否則不行執(zhí)行寫(xiě)1,通過(guò)左移補(bǔ)0}return(DAT); //返回讀出的數(shù)據(jù) }uchar At24c02Read(uchar ADDR) {uchar DAT;I2cStart();//I2C起始信號(hào)I2cSendByte(At24c02ADDR + I2cWrite);//發(fā)送器件地址加讀寫(xiě)方向位if(ReadACK())//讀從機(jī)應(yīng)答AckFlag = 1; //NOACKelseAckFlag = 0; //ACKI2cSendByte(ADDR);//I2C發(fā)送一個(gè)字節(jié)ReadACK();//讀從機(jī)應(yīng)答I2cStart();//再次產(chǎn)生I2C起始信號(hào)I2cSendByte(At24c02ADDR + I2cRead);//發(fā)送器件地址加讀寫(xiě)方向位 讀if(ReadACK())//讀從機(jī)應(yīng)答AckFlag = 1; //NOACKelseAckFlag = 0; //ACKDAT = I2cReadByte();//讀一字節(jié)SendACK(1);//主機(jī)發(fā)送非應(yīng)答I2cStop(); //I2C停止信號(hào)return(DAT);//返回讀出數(shù)據(jù)}void main()//main函數(shù)自身會(huì)循環(huán) { timer0Init();//定時(shí)器0初始化EA = 0;//屏蔽中斷At24c02Write(3, 188);//給第3單元寫(xiě)入數(shù)據(jù)“188”delay(2);//延時(shí)等待AT24C02處理num = At24c02Read(3);//讀出第3單元內(nèi)數(shù)據(jù)送給顯示變量if(AckFlag)//當(dāng)從機(jī)非應(yīng)答P1 = 0;//亮P1所有燈elseP1 = 0XFF;//滅P1所有燈EA = 1;//開(kāi)中斷while(1); } //定時(shí)器0中斷函數(shù) void timer0() interrupt 1 {TH0 = 0xED;TL0 = 0xFF; //定時(shí)5msdisplay(num); //數(shù)碼管顯示函數(shù) }總結(jié)
以上是生活随笔為你收集整理的IIC总线通讯协议、EEPROM芯片的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 小说阅读器未能连接服务器怎么办,小强小说
- 下一篇: 第三十六期:人工智能统计调查:86%的消