I2CAT24C04总结.doc

  1. 1、本文档共26页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
I2CAT24C04总结

I2C之AT24C04总结1、AT24C04介绍2、AT24C04之准备工作3、AT24C04之小试牛刀4、对应源程序 4K位串行CMOS E2PROM引脚的认识:SCL 串行时钟SDA 串行数据/地址A0、 A1、 A2 器件地址输入端WP 写保护(WP 管脚连接到Vcc, 所有的内容都被写保护(只能读)。当WP 管脚连接到Vss 或悬空,允许器件进行正常的读/写操作。) 图1 24c04连接图 我们要注意的第一点是器件地址全部是0,即接地处理。第二点是读写保护WP接地,意味着我们可以随意存取。第三点是我们要用到的引脚连接到了P3^6和P3^7上。在这里还要提醒一下,就是引脚上一定要有上拉电阻!阻值在470~1k都可以的,具体的数值可以参考相关的手册。 在程序里我们需要先做以下定义: sbit AT24C04_SCL=P3^7; sbit AT24C04_SDA=P3^6; 在写这个程序的时候,要使用到键盘,不用太多按键,我们暂时只用四个。把实验板上面的跳线JP8接到“-”端上,使第一行的按键变为独立键盘就可以了。线路图如图2所示。 图2 键盘部分电路图 键盘这部分我就不说了吧,直接附上我用到的这部分程序,在我的程序中,并没有判断按键是否松开,而是使用的延时,这样的好处是一直按着按键,数据会一直在变化,要不然,频繁的按真的很累人。 转到按键程序 对于里面用到的延时函数,一个是US级延时函数,一个是ms级延时函数,分别调用一下是延时2us和1ms。 对于显示部分吧,使用的就是LCD1602显示了。这部分程序参见这里。 显示程序 说完了这些,准备的就差不多了,我们可以对着PDF写AT24C04程序了。 3、AT24C04之小试牛刀 我们打破PDF中的介绍顺序,按照实际写程序时的顺序分开分析。 第一项是我们要用她,那就要知道她是怎么开始吧?这就是I2C总线时序中的开始和停止。时序图如下。 图3 开始停止时序 有一个需要注意的地方,就是当SCL为高电平时,所有的SDA的变化都会被认为是开始或停止信号。所以,我们必须注意,在对SDA进行操作之前,一定要注意SCL的值。 例如在我们写开始信号之前,我们没法判断两个信号的具体电位,那么我们就要做最坏的打算。首先SDA=1,然后SDA=0,此间要让SCL保持在高电平。为保证SCL为高电平,我们要用SCL=1指令使SCL保持在高电平。SCL放在什么位置就成了重点。如果我们SDA变为高电平之前,这样却成了SCL=1后SDA=1,形成了停止信号!!这个是我们要避免的,那么我们就要让SDA变化的时候,全部避开SCL为高电平段。程序如下。 void I2C_START() { //AT24C04_SCL=0;delayus(1); //这样做有些繁琐,我们可以直接不用,因为我们跳出 //所有的子函数时,都会让SCL=0!!! AT24C04_SDA=1;delayus(1);//注意先后顺序 AT24C04_SCL=1;delayus(1); AT24C04_SDA=0;delayus(1);//下降沿开始 AT24C04_SCL=0;delayus(1); } 我们以同样的思维,可以得到停止子函数,如下。 void I2C_STOP() { AT24C04_SCL=0;delayus(1); AT24C04_SDA=0;delayus(1); AT24C04_SCL=1;delayus(1); AT24C04_SDA=1;delayus(1);//上升沿停止 } 下面我们来看一下写的时序。 图4 写时序 时序的第一部分给我们展现了一个第八位数据写完后的情况,也就是说要有一个ACK应答信号。具体关于ACK应答信号的内容,可以参考器件手册。 第二部分是从开始到停止。至于时序图中给出的时间我们可以不用考虑。只需要记住,当SDA变化时SCL为0,SDA变化完后,SCL在变为1来告知24C04接收数据线上的信号。具体的实现函数如下所示。 void I2C_Wdata(unsigned char data4) { unsigned char i; unsigned char temp; temp=data4; for(i=0;i8;i++) { AT24C04_SCL=0; temp=temp1;//先发送高位 AT24C04_SDA=CY;delayus(1); AT24C04_SCL=1;delayus(1); } AT24C04_SCL=0;delayus(1); } 这里还需要注意的一点是我们每当SDA或者SCL变化一次,就会调用一下delayus(1)来延时2us,是用来稳定信号和保证信号保持的时间。 上面是写的时序,我们还要有读的子函数啊……其实,读得

文档评论(0)

130****9768 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档