I2C协议怎么写篇1
voiddelay_scl(){unsigneddatai=10;do{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}while(--i);}voiddelay(unsignedchardatak)//精确延时k*0.1us{unsignedchardatai=250;do{do{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}//执行一个nop为1个时钟周期while(--i);}while(--k);//执行一个while为2个时钟周期}voidi2c_init()//I2C的初始化:SDA和SCL都为高电平{sda=1;delay_scl();scl=1;delay_scl();}voidi2c_start()//开始信号{i2c_init();sda=0;delay_scl();}voidi2c_stop()//停止信号{sda=0;delay_scl();scl=1;delay_scl();sda=1;delay_scl();}voidi2c_response()//应答信号{unsignedcharxdatai;scl=1;delay_scl();while((sda==1)&&(i<250))i++;scl=0;delay_scl();}voidi2cwrite_byte(unsignedchardatadat)//写1个字节{unsignedcharxdatai,temp;temp=dat;for(i=0;i<8;i++){temp=temp<<1;scl=0;delay_scl();sda=CY;delay_scl();scl=1;delay_scl();}scl=0;delay_scl();sda=1;delay_scl();}unsignedchari2cread_byte()//读1个字节{unsignedcharxdatai,k;scl=0;delay_scl();sda=1;delay_scl();for(i=0;i<8;i++){scl=1;delay_scl();k=(k<<1)|sda;scl=0;delay_scl();}returnk;}voidi2cwrite_add(unsignedchardataaddress,unsignedchardatadat)//写数据,1个字节地址位,1个字节数据{i2c_start();i2cwrite_byte(0xEE);//16进制Oxa0转成8bit二进制数:前7位是设备号,末位"0"表示向设备写入。
i2c_response();i2cwrite_byte(address);//写地址i2c_response();i2cwrite_byte(dat);//写数据i2c_response();i2c_stop();delay(100);//收到stop命令后,需twr时间来写数据,此期间不接收任何信息}unsignedcharI2Cread_add(unsignedchardataaddress)//读数据,1个字节地址位,函数返回数据值{unsignedcharxdatadat;i2c_start();i2cwrite_byte(0xEE);//16进制Oxa0转成8bit二进制数:前7位是设备号,末位"0"表示向设备写入。i2c_response();i2cwrite_byte(address);//向设备写入需要查找的地址(移动设备内指针)i2c_response();i2c_start();//刷新,再次查找设备i2cwrite_byte(0xEF);//16进制Oxa0转成8bit二进制数:前7位是设备号,末位"1"表示从设备读取。
i2c_response();dat=i2cread_byte();//读取数据i2c_stop();//读完后主机返回"非应答"(高电平),并直接发出终止信号delay(10);returndat;}。
c51单片机I2c总线的读写编程步骤篇2
你说的是IO模拟i2c吧,这个你参考下#pragmaot(6,SIZE)#defineERRORCOUNT10enumeepromtype{M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M24256};enumeepromtypeEepromType;/******************************I2C总线******************************/bitRW24XX(uchar*DataBuff,ucharByteQuantity,uintAddress,ucharControlByte,enumeepromtypeEepromType){voidDelay(ucharDelayCount);voidIICStart(void);voidIICStop(void);bitIICRecAck(void);voidIICNoAck(void);voidIICAck(void);ucharIICReceiveByte(void);voidIICSendByte(ucharsendbyte);uchardataj,i=ERRORCOUNT;biterrorflag=1;while(i--){IICStart();IICSendByte(ControlByte&0xfe);if(IICRecAck())continue;if(EepromType>M2416){IICSendByte((uchar)(Address>>8));if(IICRecAck())continue;}IICSendByte((uchar)Address);if(IICRecAck())continue;if(!(ControlByte&0x01)){j=ByteQuantity;errorflag=0;while(j--){IICSendByte(*DataBuff++);if(!IICRecAck())continue;errorflag=1;break;}if(errorflag==1)continue;break;}else{IICStart();IICSendByte(ControlByte);if(IICRecAck())continue;while(--ByteQuantity){*DataBuff++=IICReceiveByte();IICAck();}*DataBuff=IICReceiveByte();//readlastbytedataIICNoAck();errorflag=0;break;}}IICStop();if(!(ControlByte&0x01)){Delay(255);Delay(255);Delay(255);Delay(255);}return(errorflag);}/*****************启动总线********************/voidIICStart(void){scl=0;sda=1;scl=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();sda=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();scl=0;sda=1;}/*****************停止IIC总线****************/voidIICStop(void){scl=0;sda=0;scl=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();sda=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();scl=0;}/**************检查应答位*******************/bitIICRecAck(void){scl=0;sda=1;scl=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();CY=sda;//因为返回值总是放在CY中的scl=0;return(CY);}/***************对IIC总线产生应答*******************/voidIICACK(void){sda=0;scl=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();scl=0;_nop_();_nop_();sda=1;}/*****************不对IIC总线产生应答***************/voidIICNoAck(void){sda=1;scl=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();scl=0;}/*******************向IIC总线写数据*********************/voidIICSendByte(ucharsendbyte){uchardataj=8;for(;j>0;j--){scl=0;sendbyte<<=1;//无论C51怎样实现这个操作,始终会使CY=sendbyte^7;sda=CY;scl=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}scl=0;}/*****************从IIC总线上读数据子程序******************/ucharIICReceiveByte(void){registerreceivebyte,i=8;scl=0;while(i--){scl=1;receivebyte=(receivebyte<<1)|sda;scl=0;}return(receivebyte);}/***************一个简单延时程序******************/voidDelay(ucharDelayCount){while(DelayCount--);}voidDelay_Msec(uchart){uchari;while(t>0){for(i=0;i<200;i++){WDT=1;_nop_();_nop_();_nop_();_nop_();}t--;}}/***************24C256读一个字节*****************/ucharRd_24c256(uintbeginbyte){uchardataresult;uchari;EA=0;i=RW24XX(&result,1,beginbyte,rd_24c256,M24256);EA=1;return(result);}/***************24C256写一个字节***************/voidWr_24c256(uintaddress,uchardatum){uchari;EA=0;i=RW24XX(&datum,1,address,wr_24c256,M24256);Delay_Msec(10);EA=1;}。
c51单片机I2c总线的读写编程步骤篇3
你说的是IO模拟i2c吧,这个你参考下#pragmaot(6,SIZE)#defineERRORCOUNT10enumeepromtype{M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M24256};enumeepromtypeEepromType;/******************************I2C总线******************************/bitRW24XX(uchar*DataBuff,ucharByteQuantity,uintAddress,ucharControlByte,enumeepromtypeEepromType){voidDelay(ucharDelayCount);voidIICStart(void);voidIICStop(void);bitIICRecAck(void);voidIICNoAck(void);voidIICAck(void);ucharIICReceiveByte(void);voidIICSendByte(ucharsendbyte);uchardataj,i=ERRORCOUNT;biterrorflag=1;while(i--){IICStart();IICSendByte(ControlByte&0xfe);if(IICRecAck())continue;if(EepromType>M2416){IICSendByte((uchar)(Address>>8));if(IICRecAck())continue;}IICSendByte((uchar)Address);if(IICRecAck())continue;if(!(ControlByte&0x01)){j=ByteQuantity;errorflag=0;while(j--){IICSendByte(*DataBuff++);if(!IICRecAck())continue;errorflag=1;break;}if(errorflag==1)continue;break;}else{IICStart();IICSendByte(ControlByte);if(IICRecAck())continue;while(--ByteQuantity){*DataBuff++=IICReceiveByte();IICAck();}*DataBuff=IICReceiveByte();//readlastbytedataIICNoAck();errorflag=0;break;}}IICStop();if(!(ControlByte&0x01)){Delay(255);Delay(255);Delay(255);Delay(255);}return(errorflag);}/*****************启动总线********************/voidIICStart(void){scl=0;sda=1;scl=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();sda=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();scl=0;sda=1;}/*****************停止IIC总线****************/voidIICStop(void){scl=0;sda=0;scl=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();sda=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();scl=0;}/**************检查应答位*******************/bitIICRecAck(void){scl=0;sda=1;scl=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();CY=sda;//因为返回值总是放在CY中的scl=0;return(CY);}/***************对IIC总线产生应答*******************/voidIICACK(void){sda=0;scl=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();scl=0;_nop_();_nop_();sda=1;}/*****************不对IIC总线产生应答***************/voidIICNoAck(void){sda=1;scl=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();scl=0;}/*******************向IIC总线写数据*********************/voidIICSendByte(ucharsendbyte){uchardataj=8;for(;j>0;j--){scl=0;sendbyte<<=1;//无论C51怎样实现这个操作,始终会使CY=sendbyte^7;sda=CY;scl=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}scl=0;}/*****************从IIC总线上读数据子程序******************/ucharIICReceiveByte(void){registerreceivebyte,i=8;scl=0;while(i--){scl=1;receivebyte=(receivebyte<<1)|sda;scl=0;}return(receivebyte);}/***************一个简单延时程序******************/voidDelay(ucharDelayCount){while(DelayCount--);}voidDelay_Msec(uchart){uchari;while(t>0){for(i=0;i<200;i++){WDT=1;_nop_();_nop_();_nop_();_nop_();}t--;}}/***************24C256读一个字节*****************/ucharRd_24c256(uintbeginbyte){uchardataresult;uchari;EA=0;i=RW24XX(&result,1,beginbyte,rd_24c256,M24256);EA=1;return(result);}/***************24C256写一个字节***************/voidWr_24c256(uintaddress,uchardatum){uchari;EA=0;i=RW24XX(&datum,1,address,wr_24c256,M24256);Delay_Msec(10);EA=1;}。
I2C总线协议中的应答函数,读写函数中,SDA和SCL到底该怎么判断篇4
应答函数:
1."ACK"isalwaystoberespondedbythei2cmasterorslaverwhichrecevingthecurrentbyte.
(1)currentbyte:slaveaddress/wordaddress/data
(2)ACKbitstate:SCLdrivebymaster
SDAdrivebythei2cmasterorslaverwhichrecevingthecurrentbyte
(3)ACK:SDA=0duringSCLhighcycle,NoACK:SDA=high-ZduringSCLhighcycle
2.Onlyneedtorepondthe"NoACK"atlastbyteofreadaccessbyi2cmaster.
读写函数:
1.SCLalwaysdrivebymasterwheneitherwriteaccessorreadaccess
2.SDAdrivebymasterwhenslaveaddress,masterwirtedatabyte(notincludeACKbit)
SDAdrivebyslaverwhenmasterread/slaverwritedatabyte(notincludeACKbit)
怎么从I2C总线读数据篇5
i2c有其协议的,我当时从不会到掌握其协议用了一阵子,就是狂读协议和例程我把当时用非斯卡尔单片机读i2cmems传感器的历程写在下面#include