ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:156.44KB ,
资源ID:9703659      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-9703659.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(AT24C01应用实例.docx)为本站会员(b****8)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

AT24C01应用实例.docx

1、AT24C01应用实例单片机模拟I2C总线及AT24C01应用实例www.zsMCU.com 2006-2-25 逸风 I 2 C(InterIntegrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。I 2 C总线产生于在80年代,最初为音频和视频设备开发,如今主要在服务器管理中使用,其中包括单个组件状态的通信。例如管理员可对各个组件进行查询,以管理系统的配置或掌握组件的功能状态,如电源和系统风扇。可随时监控内存、硬盘、网络、系统温度等多个参数,增加了系统的安全性,方便了管理。 1. I2C总线特点 I 2 C总线最主要的优点是其简

2、单性和有效性。由于接口直接在组件之上,因此I 2 C总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件。I 2 C总线的另一个优点是,它支持多主控(multimastering), 其中任何能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。2. I2C总线工作原理 2.1 总线的构成及信号类型 I2C总线是一种串行数据总线,只有二根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。在CPU与被控IC之间、IC与IC之间进行双

3、向传送,最高传送速率100kbps。各种被控制电路均并联在这条总线上,但就像电话机一样只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址,在信息的传输过程中,I 2 C总线上并接的每一模块电路既是主控器(或被控器),又是发送器(或接收器),这取决于它所要完成的功能。CPU发出的控制信号分为地址码和控制量两部分,地址码用来选址,即接通需要控制的电路,确定控制的种类;控制量决定该调整的类别(如对比度、亮度等)及需要调整的量。这样,各控制电路虽然挂在同一条总线上,却彼此独立,互不相关。 2.2 位的传输SDA 线上的数据必须在时钟的高电平周期保持稳定数据线的高或低电平状态只有在SCL 线的

4、时钟信号是低电平时才能改变,见图1:图12.3 开始信号SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。2.4 结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。图22.5 应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。2.6 总线基本操作 I 2 C规程运用主/从双向通讯。器件发送数据到总线上,则定义为发送器,器件接收数据则定义为接收器。

5、主器件和从器件(本文为AT24C01)都可以工作于接收和发送状态。 总线必须由主器件(通常为微控制器CPU)控制,主器件产生串行时钟(SCL)控制总线的传输方向,并产生起始和停止条件。SDA线上的数据状态仅在SCL为低电平的期间才能改变,SCL为高电平的期间,SDA状态的改变被用来表示起始和停止条件。参见图2。3. I2C应用实例AT24C01AT24C系列串行E2PROM具有I2C总线接口功能,功耗小,宽电源电压(根据不同型号2.5V6.0V),工作电流约为3mA,静态电流随电源电压不同为30A110A。3.1AT24C系列 E2PROM接口及地址选择由于I2C总线可挂接多个串行接口器件,在

6、I2C总线中每个器件应有唯一的器件地址,按I2C总线规则,器件地址为7位数据(即一个I2C总线系统中理论上可挂接128个不同地址的器件),它和1位数据方向位构成一个器件寻址字节,最低位D0为方向位(读/写)。器件寻址字节中的最高4位(D7D4)为器件型号地址,不同的I2C总线接口器件的型号地址是厂家给定的,如AT24C系列E2PROM的型号地址皆为1010,器件地址中的低3位为引脚地址A2A1A0,对应器件寻址字节中的D3、D2、D1位,在硬件设计时由连接的引脚电平给定。图3对于E2PROM的片内地址,容量小于256字节的芯片(AT24C01/02),8位片内寻址(A0A7)即可满足要求。然而

7、对于容量大于256字节的芯片,则8位片内寻址范围不够,如AT24C16,相应的寻址位数应为11位(211=2048)。若以256字节为1页,则多于8位的寻址视为页面寻址。在AT24C系列中对页面寻址位采取占用器件引脚地址(A2、A1、A0)的办法,如AT24C16将A2、A1、A0作为页地址。凡在系统中引脚地址用作页地址后,该引脚在电路中不得使用,作悬空处理。AT24C系列串行E2PROM的器件地址寻址字节如图4所示,表中P0 P1 P2表示页面寻址位。图43.2AT89S51单片机与AT24C01 E2PROM通讯的硬件实现图5 是用AT89S51 P2口模拟I2C总线与E2PROM连接电路

8、图(以AT24C01为例),由于AT24C01是漏极开路,图中R1、R2为上拉电阻(5.1k)。A0A2地址引脚脚均接地。图5 AT24C01与51单片机接口3.3 AT24C系列 E2PROM读写操作 软件实现方法对AT24C系列 E2PROM的读写操作完全遵守I2C总线的主收从发和主发从收的规则。3.3.1AT24C01的写操作写操作分为字节写和页面写两种操作,对于页面写根据芯片的一次装载的字节不同有所不同。关于页面写的地址、应答和数据传送的时序参见图6 和图7。 连续写操作是对E2PROM连续装载n个字节数据的写入操作,n随型号不同而不同,一次可装载字节数也不同。AT24C01/02 8

9、字节/每页AT24C04/08/16 16字节/每页图6 写一个字节的时序图图7写一页的时序图3.3.2AT24C01的读操作读操作有三种基本操作:当前地址读、随机读和顺序读。图10给出的是顺序读的时序图。应当注意的是:最后一个读操作的第9个时钟周期不是“不关心”。为了结束读操作,主机必须在第9个周期间发出停止条件或者在第9个时钟周期内保持SDA为高电平、然后发出停止条件。 AT24C系列片内地址在接收到每一个数据字节地址后自动加1,故装载一页以内规定数据字节时,只须输入首地址,若装载字节多于规定的最多字节数,数据地址将“上卷”,前面的数据被覆盖。连续读操作时为了指定首地址,需要两个伪字节写来

10、给定器件地址和片内地址,重复一次启动信号和器件地址(读),就可读出该地址的数据。由于伪字节写中并未执行写操作,地址没有加1。以后每读取一个字节,地址自动加1。 在读操作中接收器接收到最后一个数据字节后不返回肯定应答(保持SDA高电平)随后发停止信号。图8 读当前地址内容图9读任意地址内容图10读连续地址内容4 汇编写的24C01 单字节读写程序; =; 24C01存储器I2C总线实验 汇编语言例子; =; ew51仿真编程器 配套实验板学习例程; 中山单片机学习网 智佳科技 站长:逸风; http:/www.zsMCU.com; E-mail:info; =SDA EQU P2.0SCL EQ

11、U P2.1Address EQU 08HI2CData EQU 09H ORG 0000H START: MOV SP,#60H MOV Address,#00H MOV I2CData,#55H CALL I2C_WRITE ;写入数据 MOV I2CDATA,#0AAH ; MOV Address,#00H CALL I2C_READ MOV I2CData,A ;读出数据 NOP NOPMAIN: JMP MAIN/*=写一个字节 Address地址 I2CDatata写入的数据=*/I2C_WRITE: I2C_WRITE_A: LCALL I2C_START MOV A,#1010

12、0000B;发送写命令 LCALL I2C_SEND8BIT LCALL I2C_ACK JC I2C_WRITE_A ;=1,表示无确认,再次发送 MOV A,Address;发送写入地址 LCALL I2C_SEND8BIT LCALL I2C_ACK MOV A,I2Cdata;发送写入数据 LCALL I2C_SEND8BIT LCALL I2C_ACK LCALL I2C_STOPRET /*=读一个字节 Address地址 Data读出的数据=*/I2C_READ: I2C_READ_A: LCALL I2C_START MOV A,#10100000B LCALL I2C_SEN

13、D8BIT LCALL I2C_ACK JC I2C_READ_A ;=1,表示无确认,再次发送 MOV A,Address LCALL I2C_SEND8BIT LCALL I2C_ACK I2C_READ_B: LCALL I2C_START MOV A,#10100001B LCALL I2C_SEND8BIT LCALL I2C_ACK JC I2C_READ_B LCALL I2C_RECEIVE8BIT MOV I2CData,A LCALL I2C_ACK LCALL I2C_STOPRET;=;发送开始信号I2C_START:SETB SCLSETB SDANOPNOPCLR

14、SDANOPNOPCLR SCLRET;=;发送结束信号I2C_STOP: CLR SDA NOP NOP SETB SCL NOP NOP SETB SDARET;=;发送接收确认信号I2C_ACk: SETB SDA SETB SCL NOP NOP JB SDA,I2C_ACK0 CLR C SJMP I2C_ACK_END I2C_ACK0: SETB C I2C_ACK_END: CLR SCLRET;=;送八位数据I2C_SEND8BIT: MOV B,#08HI2C_SEND8BIT_A: RLC A MOV SDA,C SETB SCL NOP NOP CLR SCL DJNZ

15、 B,I2C_SEND8BIT_ARET;=;接收八位数据I2C_RECEIVE8BIT: MOV B,#08H CLR A SETB SDAI2C_RECEIVE8IT_A: SETB SCL NOP NOP MOV C,SDA RLC A CLR SCL DJNZ B,I2C_RECEIVE8IT_ARET5. C语言写的24C01 单字节读写程序/*= 24C01存储器I2C总线实验 C语言例子= ew51仿真编程器 配套实验板学习例程 中山单片机学习网 智佳科技 站长:逸风 E-mail:info=*/#include #include sbit SDA=0x90;sbit SCL=0

16、x91;/函数声明unsigned char i2c_read(unsigned char);void i2c_write(unsigned char,unsigned char);void i2c_send8bit(unsigned char);unsigned char i2c_receive8bit(void);void i2c_start(void);void i2c_stop(void);bit i2c_ack(void);/=void main(void) unsigned char dd; i2c_write(0x00,0x55); _nop_(); dd=i2c_read(0x

17、00); for(;) /*=i2c_write(地址,数据),写一个字节=*/void i2c_write(unsigned char Address,unsigned char Data) do i2c_start(); i2c_send8bit(0xA0); while(i2c_ack(); i2c_send8bit(Address); i2c_ack(); i2c_send8bit(Data); i2c_ack(); i2c_stop(); return;/*=i2c_read(地址,数据),写一个字节=*/unsigned char i2c_read(unsigned char Ad

18、dress) unsigned char c; do i2c_start(); i2c_send8bit(0xA0); while(i2c_ack(); /=1,表示无确认,再次发送 i2c_send8bit(Address); i2c_ack(); do i2c_start(); i2c_send8bit(0xA1); while(i2c_ack(); c=i2c_receive8bit(); i2c_ack(); i2c_stop(); return(c);/=/发送开始信号void i2c_start(void) SDA = 1; SCL = 1; SDA = 0; SCL = 0; r

19、eturn;/发送结束信号void i2c_stop(void) SDA = 0; SCL = 1; SDA = 1; return; /发送接收确认信号bit i2c_ack(void) bit ack; SDA = 1; SCL = 1; if (SDA=1) ack = 1; else ack = 0; SCL = 0; return (ack);/送八位数据void i2c_send8bit(unsigned char b) unsigned char a; for(a=0;a8;a+) if(bA)&0X80) FONT SDA = 1; else SDA = 0; SCL = 1;

20、 SCL = 0; return;/接收八位数据unsigned char i2c_receive8bit(void) unsigned char a; unsigned char b=0; for(a=0;a8;a+) SCL = 1; b=b1; if (SDA=1) b=b|0x01; /按位或 SCL = 0; return (b);6.在I 2 C总线的应用中应注意的事项总结为以下几点 : 1) 严格按照时序图的要求进行操作2) 若与口线上带内部上拉电阻的单片机接口连接,可以不外加上拉电阻。3) 程序中为配合相应的传输速率,在对口线操作的指令后可用NOP指令加一定的延时。 4) 为了减少意外的干扰信号将EEPROM内的数据改写可在EEPROM内部没有用的空间写入标志字,每次上电时或复位时做一次检测,判断EEPROM是否被意外改写。说明:本文的前3节 是由本人从网上收集的各种文章中,修改、整理而成。第4节和第5节 软件部份是本人自已编写的,由于水平有限,错误之处敬请谅解。

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2