- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
自学单片机之IIC通信
IIC通信1.1 器件地址: 每个接到I2C总线上的器件都有唯一的地址。用来确认主机和从机。 从机的地址(7位),第8位是数据的传送方向位(R/T),用“0”表示主机发送数据(T),“1”表示主机接收数据(R)。(如果芯片资料提供的器件地址为八位,则左移一位作为该器件的地址。第八位依然为数据传送方向位) 主机发送地址时,总线上的每个从机都将这7位地址码与自己的地址进行比较,如果相同,则认为自己正被主机寻址,根据R/T位将自己确定为发送器或接收器。 从机的地址由固定部分和可编程部分组成。在一个系统中可能希望接入多个相同的从机,从机地址中可编程部分决定了可接入总线该类器件的最大数目。如一个从机的7位寻址位有4位是固定位,3位是可编程位,这时仅能寻址8个同样的器件,即可以有8个同样的器件接入到该I2C总线系统中。1.2 数据传送组合方式:(注:有阴影部分表示数据由主机向从机传送,无阴影部分则表示数据由从机向主机传送。) A表示应答, A非表示非应答(高电平)。S表示起始信号,P表示终止信号。。 a、主机向从机发送数据 b、主机在第一个字节后,立即从从机读数据c、在传送过程中,当需要改变传送方向时,起始信号和从机地址都被重复产生一次,但两次读/写方向位正好反相1.3 硬件IIC---- 单片机有IIC总线引脚 模拟IIC---- 单片机无IIC总线引脚,用IO口进行模拟IIC总线IIC模拟时序图:(1)起始信号Void I2CStart(void){ SDA = 1;SomeNop( );SCL = 1;SomeNop( );SDA = 0;SomeNop( );}(2)终止信号void I2cStop(void){SDA = 0;SomeNop( );SCL = 1;SomeNop( );SDA = 1;SomeNop( );}1.51.6 单片机读写过程A 写入过程:起始信号-----器件地址+0 (写命令字) 从机应答-----器件存储首地址----从机应答--date1---从机应答-----.....-----date n 从机应答 (也可以不应答) 停止信号B 读取过程: 起始信号 ---- 器件地址+0( 伪写入)---从机应答---写入要被读出数据存储首地址----从机应答 --- 起始信号---器件地址+1(读数据命令字)---- 从机应答--date1 ---主机接收应答----date n 主机非应答 ---停止信号1.7 内部数据传送采用移位操作: 注 :从高位开始 1 .8 AT24C02总线时序:1.9 程序编写:注 :SCL=0时,数据可变,SCL=1时,数据稳定。也就是说,要想改变传送的下一个 位 ,则首先SCL=0.#include i2c.hvoid delay8us(void) //?? 0us{ unsigned char a,b; for(b=1;b0;b--) for(a=1;a0;a--);}void i2cstart(void) //起始信号函数,注意最后将SCL信号拉低,使数据可变{SDA=1;delay8us();SCL=1;delay8us();SDA=0;delay8us();SCL=0;}void i2cstop() //终止信号函数因为终止 所以最后SCL信号不用理会{SDA=0;delay8us();SCL=1;delay8us();SDA=1;delay8us();}uchar i2csengbyte(uchar dat) //iic发送字节函数 最后有一个等待应答操作, 应答成功 返回值1 应答失败 返回值0{int i,b;for(i=0;i8;i++){SDA=dat7;dat=1;delay8us();SCL=1;delay8us();SCL=0;delay8us();}//SDA=1;//delay8us();SCL=1; delay8us();while (SDA) // 时钟线拉高 等待从机拉低数据线 ,拉低则为应答成功 最后依 然拉低时钟线,使数据可变{b++;if(b==200){SCL=0; delay8us();return 0;}}SCL=0;delay8us();return 1;}uchar i2creadbyte() //iic接收字符函数 注意先移位再赋值{uchar i,dat=0;for(i=0;i8;i++){SCL=1;delay8us();dat=1;dat|=SDA;SCL=0;delay8us();}return dat;}void i2c_24c02writebyte(uchar add,uchar dat)
文档评论(0)