欢迎来到天天文库
浏览记录
ID:16330749
大小:20.34 KB
页数:7页
时间:2018-08-09
《虚拟i2c接口通信协议》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、虚拟I2C接口通信协议 I2C协议规定在数据传送过程中必须确认数据传送的开始和结束。I2C协议技术规范中规定SCL为高电平,SDA由高电平向低电平跳变定为数据传送的开始;当时钟线SCL为高电平,数据线SDA由低电平向高电平跳变为结束信号。开始信号和结束信号都由主器件产生。在开始信号产生以后,总线即被认为忙状态。在信号结束一段时间内,总线被认为是空闲的。 I2C总线的数据传输格式是在I2C总线开始后,送出来的第一个字节数据用来选择从器件地址的。其中前7位为地址码,第8位为方向位(R/W),方向位为0表示发送,即主器件
2、把数据写到所选择的从器件中去;方向位为1表示读取,即主器件读取从器件中指定的地址的信息。开始后系统中各器件把自己的地址和主器件送到总线上的地址进行比较,如果和主器件发送到总线上的地址一致,则该器件即为被主器件寻址的器件,其接收信息还是发送信息由第8位(R/W)。I2C总线每次传送的字节数据不限,但每一字节必须是8位,而且每个传送的字节后面必须跟一个认可位(第9位),也叫应答位。每次传送都是先传最高位,通常器件在接收每字节后都会做响应,即释放SCL线,返回高电平,准备接收下一个字节数据,主器件可以继续发送。如果从器件
3、正在处理一个实时事件而不能接收数据,可以使SCL线保持低电平。此时主器件产生一个结束信号,使发送异常结束,迫使主器件处于等待状态。当从器件处理完毕时,释放SCL总线,主器件继续传送。 当主器件发送完一字节数据后,接着发送对应于SCL线上的一个时钟(ACK)认可位,此时钟内主器件释放SDA线,一字节传送结束,而从器件的响应信号将SDA线,一个字节传送结束,而从器件响应信号使SDA线拉成低电平,使SDA在该时钟的高电平期间为稳定的低电平。从器件响应信号结束后,SDA线返回高电平进入下一个传送周期。模拟I2C总线的C51
4、程序#include#include#defineucharunsignedchar;#defineuint unsignedint ;#define_Nop()_nop_();/*端口定义*/sbitSDA=P1^3; /*模拟I2C数据位8*/sbitSCL=P1^2; /*模拟I2C时钟位8*//*状态标志位*/bitACK;/********************voidStart_I2C()**************** 该函数为总线
5、启动函数****************************************************/viodStart_I2C(void){ SDA=1; /*发送起始条件数据信号*/ _Nop(); SCL=1; _Nop(); /*起始条件建立时间大于4.7us*/ _Nop(); _Nop(); _Nop(); _Nop(); SDA=0; /*发送起始信号*/ _Nop(); /*起始条件信号锁定时间大于
6、4us*/ _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); SCL=0; /*钳住I2C总线准备发送数据*/ _Nop(); _Nop();}/********************voidStop_I2C()**************** 该函数为总线结束函数****************************************************/viodStop_I2C(){ SDA=0; /*发送结束条
7、件数据信号*/ _Nop(); /*发送结束条件数据信号*/ SCL=1; _Nop(); /*起始条件建立时间大于4.7us*/ _Nop(); _Nop(); _Nop(); _Nop(); SDA=1; /*发送结束信号*/ _Nop(); _Nop(); _Nop(); _Nop(); _Nop();}/********************voidSendB(ucharc )**************** 该函数为字节数据传送函数,功能是将数据C发送出去, C可以是地址,也可以是
8、数据,发完后等待应答,并对此状态 位进行操作。****************************************************/voidSendB(ucharc ){uncharBitCnt;for(BitCnt=0;BitCnt<8;Bit++) /*要传送的数据长度为8位*/ { if((c<
此文档下载收益归作者所有