欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

i2c读写函数怎么写,i2c read

时间:2022-11-16 20:14:43

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#include"derivative.h"#defineIIC_SDA_CTLPTCDD_PTCDD1#defineIIC_SDA_DATPTCD_PTCD1#defineIIC_SCL_CTLPTCDD_PTCDD0#defineIIC_SCL_DATPTCD_PTCD0#defineIIC_MST_HI0#defineIIC_MST_LO1voidIIC_Start(void);voidIIC_Restart(void);voidIIC_Stop(void);byteIIC_SendByte(byte);byteIIC_Read(byte*,byte);byteIIC_Write(byte*,byte);voidIIC_Delay(void);voidIIC_Delay(void){bytei;for(i=0;i<8;i++){}}//==============================================================//MastergeneratesaSTARTconditiononIICbus//==============================================================voidIIC_Start(void){IIC_SDA_CTL=IIC_MST_HI;IIC_SCL_CTL=IIC_MST_HI;IIC_Delay();IIC_SDA_CTL=IIC_MST_LO;IIC_SDA_DAT=0;IIC_Delay();IIC_SCL_CTL=IIC_MST_LO;IIC_SCL_DAT=0;IIC_Delay();}//==============================================================//MastergeneratesaRESTARTconditiononIICbus//==============================================================voidIIC_Restart(void){IIC_SDA_CTL=IIC_MST_HI;//SDAbacktohighwhileSCLremaininlowIIC_Delay();IIC_SCL_CTL=IIC_MST_HI;//SCLbacktohigh,busidlenowIIC_Delay();IIC_SDA_CTL=IIC_MST_LO;//RESTARTconditionoccurIIC_Delay();IIC_SCL_CTL=IIC_MST_LO;//SCLtolowforstandbyIIC_Delay();}//==============================================================//MastergeneratesaSTOPconditiononIICbus//==============================================================voidIIC_Stop(void){IIC_SDA_CTL=IIC_MST_LO;//makesureSDAislowIIC_Delay();IIC_SCL_CTL=IIC_MST_HI;//I2C_SCL_CTLgotohighfirstIIC_Delay();IIC_SDA_CTL=IIC_MST_HI;//I2C_SDA_CTLhavelow-hightransitionwhileSCLishighIIC_Delay();}//==============================================================//MastersendoutabyteofdataandreturnwithACK/NACK//returnwith0x00ifACKreceived//returnwith0xffifNACKreceived//==============================================================byteIIC_SendByte(byteoutDat){bytebit;//sendout8-bitdatafor(bit=0;bit<8;bit++){if(outDat&0x80)IIC_SDA_CTL=IIC_MST_HI;elseIIC_SDA_CTL=IIC_MST_LO;IIC_Delay();IIC_SCL_CTL=IIC_MST_HI;IIC_Delay();IIC_SCL_CTL=IIC_MST_LO;outDat<<=1;}//checkfortheACK/NACKIIC_SDA_CTL=IIC_MST_HI;//masterreleaseSDAIIC_Delay();IIC_SCL_CTL=IIC_MST_HI;//mastersendaclockIIC_Delay();if(IIC_SDA_DAT)bit=0xff;//NACKelsebit=0;//ACKIIC_SCL_CTL=IIC_MST_LO;IIC_Delay();return(bit);}//==============================================================//MasterwriteastringofbytesthroughIICus//Returnwith0x00ifsuccessful//Returnwith0xffiffailed//==============================================================byteIIC_Write(byte*buff,bytetotal){while(total){if(IIC_SendByte(*buff++))//getNACKafterdatabyteoutreturn(0xff);//aborttotal--;//__RESET_WATCHDOG();//neededonlyforEEPROMbyte-program}return(0);}//==============================================================//MasterreadabyteofdataandsetACK/NACK//returnwithdataread//==============================================================byteIIC_ReadByte(byteackFlag){bytebit,dat;IIC_SDA_CTL=IIC_MST_HI;//makesuremasterreleaseSDA//read8bitssofdatafor(bit=0;bit<8;bit++){dat<<=1;IIC_SCL_CTL=IIC_MST_HI;IIC_Delay();if(IIC_SDA_DAT)//readbackdatadat|=0x01;IIC_SCL_CTL=IIC_MST_LO;IIC_Delay();}//echowithACK/NACKif(ackFlag==0)IIC_SDA_CTL=IIC_MST_LO;//echobackACKelseIIC_SDA_CTL=IIC_MST_HI;//echobackNACKIIC_Delay();IIC_SCL_CTL=IIC_MST_HI;IIC_Delay();IIC_SCL_CTL=IIC_MST_LO;IIC_Delay();return(dat);}//==============================================================//MasterreadastringofdatabytesthroughIICus//==============================================================byteIIC_Read(byte*buff,bytetotal){bytecount;if(total==0)return(0);if(total==1){//readonebyteonlybuff[0]=IIC_ReadByte(1);//NACKafterreadreturn(1);}else{//readmorethanonebytescount=0;while(total>1){IIC_Delay();buff[count++]=IIC_ReadByte(0);。

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。