410 likes | 596 Views
数据存储 AT24Cxx 及其应用. 内容提要. I 2 C 总线概述 AT24Cxx 简介 AT24Cxx 引脚 AT24Cxx 时序图 AT24Cxx 操作流程 AT24Cxx 示例. I 2 C ( I2C 、 IIC )总线概述.
E N D
内容提要 • I2C总线概述 • AT24Cxx简介 • AT24Cxx引脚 • AT24Cxx时序图 • AT24Cxx操作流程 • AT24Cxx示例
I2C (I2C、 IIC )总线概述 • I2C(Inter-Integrated Circuit )总线是Philips公司最先推出的一种双向数据传输总线,仅使用两根连线便可以实现全双工同步数据传输。在I2C总线中,一条为串行数据线(SDA),另一条为串行时钟线(SCL)。I2C总线占用引脚少,接口协议简单。目前多数公司均推出了I2C总线接口的各种器件,如存储器、A/D、D/A、键盘、LCD等,大大方便了用户的选择。
I2C (I2C、 IIC )总线概述 • I2C总线采用两线制,由数据线SDA和时钟线SCL构成。I2C总线对数据通信进行了严格的定义。 • 典型的I2C总线系统结构如下图所示。I2C总线上可以挂接多个器件,其中每个器件必须都支持I2C总线通信协议。
I2C (I2C、 IIC )总线概述 • 其中,I2C总线的SCL和SDA端口(开漏极,线与)在使用时必须连接上拉电阻。I2C总线的传输速率可以支持100khz和400khz两种,对于100khz的速率一般采用10k欧姆的上拉电阻,对于400khz的速率一般采用2k欧姆的上拉电阻。
I2C (I2C、 IIC )总线特点 • I2C总线最主要的优点是其简单性和有效性。由于接口直接在组件之上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件。 • I2C总线的另一个优点是,它支持多主控(multimastering),其中任何能够进行发送和接收的设备都可以成为主总线(I2C总线上并接的每一模块电路既是主控器(或被控器),又是发送器(或接收器),这取决于它所要完成的功能)。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。
I2C (I2C、 IIC )总线协议 • I2C 总线协议定义如下: 1 只有在总线空闲时才允许启动数据传送;(时钟线与数据线都为高电平时为空闲信号) 2 在数据传送过程中,当时钟线为高电平时数据线必须保持稳定状态,不允许有跳变;时钟线为高电平时数据线的任何电平变化将被看作总线的起始或停止信号。 • 起始信号。 时钟线保持高电平期间,数据线电平从高到低的跳变作为I2C总线的起始信号。 • 停止信号 时钟线保持高电平期间,数据线电平从低到高的跳变作为I2C总线的停止信号
I2C总线的信号类型 • I2C总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。 • 开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。 • 结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。 • 应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。 • 这些信号中,起始信号是必需的,结束信号和应答信号,都可以不要。
I2C总线的信号类型 • 开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。 • 结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
I2C总线的信号类型 • 位的传输 SDA 线上的数据必须在时钟的高电平周期保持稳定,数据线的高或低电平状态只有在SCL 线的时钟信号是低电平时才能改变。
I2C总线接口EEPROM存储器 • 目前,市场上I2C总线接口器件有多种,利于A/D转换器、D/A转换器、时钟芯片和存储器等。这里以典型的I2C总线接口的存储器为例进行介绍。 • I2C总线接口EEPROM存储器是一种采用I2C总线接口的串行总线存储器,这类存储器具有体积小、引脚少、功耗低、工作电压范围宽等特点。目前,Atmel、Microchip、National等公司均提供各种型号的I2C总线接口的串行EEPROM(电可擦出可编程只读存储器,即Electrically Erasable Programmable Read-Only Memory)存储器。在单片机系统中使用较多的EEPROM存储器是24系列串行EEPROM。它具有型号多、容量大、支持I2C总线协议、占用单片机I/O端口少、芯片扩展方便、读写简单等优点。
AT24CXX • 这里以Atmel公司的产品为例进行介绍,At24Cxx系列是Atmel公司典型的I2C串行总线的EEPROM,工作于从器件模式。 • AT24Cxx:01~1024 • 容量=xx X 1Kbit • 型号系列列表 • AT24C01:1K(128X8) AT24C02:2K(256X8) • AT24C04:4K(512X8) AT24C08:8K(1KX8) • AT24C16:16K(2KX8) AT24C512:512K(64KX8) • AT24C1024:1M(128KX8) • 例如AT24C08存储容量为8k位(1024个字节*8位容量计算方法
AT24CXX • I2C总线接口的EEPROM存储器 • 工作电压可选择低电压或标准电压(1.8v、2.7v、5v) • 100khz(1.8v)或400khz(2.7v、5v) • 8字节页写操作(1k、2k),16字节页写操作(4k、8k、16k) • 内部数据写周期(最大5ms) • 重复擦写100万次以上 • 内容数据可以掉电保存100年
AT24CXX • 引脚定义如下: • Vcc、GND为芯片的供电引脚 • A0、A1、A2为芯片的引脚地址和页面选择输入 • SCL为I2C总线接口的串行时钟线 • SDA为I2C总线接口的串行数据线 (高位在前,低位在后;上升沿数据写入,下降沿数据读出) • WP为写保护引脚,当WP接高电平时,只能对该器件进行读操作,不能写操作,用于硬件数据的保护;当WP接低电平时,可以对该器件进行读写操作。
AT24CXX芯片地址 • 每片芯片16/32页,每页8字节,地址需要7/8位,总线最大可挂8片 • 每片芯片32页,每页16字节,地址需要9位,总线最大可挂4片 • 每片芯片64页,每页16字节,地址需要10位,总线最大可挂2片 • 每片芯片128页,每页16字节,地址需要11位,总线最大可挂1片 • 具有I2C接口的EEPROM存储器的前面4为全部都是1010 • 页面地址Px:不用连接 • 芯片地址Ax:需要连接为高电平或低电平 • R/W:1——读操作;0——写操作
AT24Cxx单元地址 • AT24C01: 00H-7FH 128x8bit • AT24C02: 00H-FFH 256x8bit • AT24C04: 000H-1FFH 512x8bit • AT24C08: 000H-3FFH 1024x8bit • AT24C16: 000H-7FFH 2048x8bit • AT24C32: 000H-FFFH 4096x8bit • AT24C64: 0000H-1FFFH 8192x8bit • AT24C128: 0000H-3FFFH 16384x8bit • AT24C256: 0000H-7FFFH 32768x8bit • AT24C512: 0000H-FFFFH 65536x8bit
100KHz参数分析 • f=100KHz=0.1MHz • t=1/0.1us=5us(一个高电平持续的时间+一个低电平持续的时间) • scl的高低电平持续时间各为3us • scl为高电平时,sda数据线电平不能变化(否则就是开始信号或停止信号);scl为低电平时,sda数据线电平才能变化(即此时给sda赋需要发送的值)。
400KHz参数分析 • f=400KHz=0.4MHz • t=1/0.4us=2.5us(一个高电平持续的时间+一个低电平持续的时间) • scl的高低电平持续时间各为2us • scl为高电平时,sda数据线电平不能变化(否则就是开始信号或停止信号);scl为低电平时,sda数据线电平才能变化(即此时给sda赋需要发送的值)。
写操作 • 写操作: • 字节写操作 • 页写操作 在写操作完成后,需要一定的延时来完成内部写周期,也可以进行忙检测;否则操作就会失败。
字节写操作 • 在字节写模式下:主器件发送起始命令和从器件地址信息(R/W位置零)给从器件,在从器件产生应答信号后;主器件发送从器件存储单元的字节地址,主器件在收到从器件的另一个应答信号后;再发送数据到被寻址的存储单元。从器件再次应答并在主器件产生停止信号后开始内部数据的擦写,在内部擦写过程中,从器件不再应答主器件的任何请求。即stop信号结束后,AT24CXX需要一定的时间完成内部数据写入。
页写操作 • 页写时AT24C01/02:8字节;AT24C04/08/16:16字节 • 地址指针会自动加1(在同一页面,超出字节会自动覆盖) • 字节多于8个或16个时,会自动覆盖前面所写入的单元。 • 接收到8或16字节数据和主器件发送的停止信号后,从器件启动内部写周期将数据写到数据区。所有接收的数据在一个写周期内写入从器件。即stop信号结束后,从器件需要一定的时间完成内部数据写入。 • 同一页最后一个字节同一页第一个字节
读操作 • 读操作 • 立即/当前地址读操作 • 选择/随机地址读操作 • 顺序/连续地址读操作 • 立即/当前地址读多字节操作 • 选择/随机地址读多字节操作
立即/当前地址读操作 • 从器件地址计数器内容为最后操作字节的地址加1,也就是说如果上次读/写的操作地址为N,则立即读的地址从地址N+1开始。 • 接收到从器件地址信号后(R/W位置1),它首先发送一个应答信号,然后发送一个8 位字节数据;主器件不需发送一个应答信号但要产生一个停止信号。 • 本次读取数据的地址是在上次读取数据的地址加1(可以不在同一页面内,最后一页最后一个字节第一页第一个字节)
选择/随机地址读操作 • 选择性读操作允许主器件对寄存器的任意字节进行读操作。主器件首先通过发送起始信号、从器件地址(此时R/W 位置1)和它想读取的字节数据的地址,执行一个伪写操作;在从器件应答之后,主器件重新发送起始信号和从器件地址(此时R/W 位置1),从器件响应并发送应答信号,然后输出所要求的一个8 位字节数据,主器件不发送应答信号但产生一个停止信号。 • 开始必须有“伪字节写入”操作,然后再重新启动star信号。
顺序/连续地址读操作 • 连续读操作可通过立即读或选择性读操作启动。在从器件发送完一个8 位字节数据后,主器件产生一个应答信号来响应告知从器件,主器件要求更多的数据。对应每个主机产生的应答信号,从器件将发送一个8位数据字节,当主器件不发送应答信号而发送停止位时结束此操作。(字节个数自己设定,可以不在同一页面内,最后一页最后一个字节第一页第一个字节) • 前面的操作以当前地址读取或随机地址读取的前面操作相同。(红线框标记)
各功能函数 • 起始信号函数 • 停止信号函数 • 从机应答信号函数 • 主机应答信号函数 • 忙信号检测函数 • 字节写入函数(一字节8位,上升沿写入) • 字节读取函数(一字节8位,下降沿读出) 主机控制总线,从总线上给从机发送数据 主机释放总线,从总线上采集从机发送的数据
各功能函数 • 字节写操作 • 页写操作 • 当前地址读操作 • 随机地址读操作 • 当前地址连续读操作 • 随机地址连续读操作
开始信号 /* * * * * * 启动总线 * * * * *//*SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。*/ void i2cstart(void) { scl=0; // _nop_();//delay05us(); sda=1; // _nop_();//delay05us(); scl=1; //_nop_();//delay05us(); sda=0; // _nop_();//delay05us(); scl=0; // _nop_();//delay05us(); }
停止信号 /* * * * * * 停止总线 * * * * *//*SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。*/ void i2cstop(void) { scl=0; // _nop_();//delay05us(); sda=0; // _nop_();//delay05us(); scl=1; // _nop_();//delay05us(); sda=1; // _nop_();//delay05us(); }
上升沿写入数据 void write(unsigned char x)//上升沿写入数据 { unsigned char y,i; y=x; CY=0; for(i=0;i<8;i++) { y=y<<1; sda=CY;//准备数据 scl=1;//上升沿 // _nop_();//delay05us(); scl=0; // _nop_();//delay05us(); } }//scl低电平时,准备好要写入的位数据;scl上升为高电平时,写入一位
下降沿读取数据 unsigned char read(void)//下降沿读取数据 { unsigned char x,i; bit f; x=0; for(i=0;i<8;i++) { sda=1;//主机释放总线,准备接收从机发送的位数据 x=x<<1; scl=1; // _nop_();//delay05us(); f=sda;//读取数据 scl=0;//下降沿 // _nop_();//delay05us(); x=x+(unsigned char)f; } return(x); }
从机应答(0/1) /*从机应答——主机发送一个数据后,从机在主机发送第9个时钟时应答:收到,应答0;没收到,应答1*/ bit ack(void) { bit f; sda=1;//主机释放总线,准备接收从机的应答 // _nop_();//delay05us(); scl=1; // _nop_();//delay05us(); f=sda;//读取数据 scl=0;//下降沿 // _nop_();//delay05us(); return(f); }
主机应答(0/1) /*主机应答——从机发送一个数据后,主机在主机发送第9个时钟时应答:收到并且需要另外的数据,应答0;收到并且不需要另外的数据,应答1*/ void noack(bit f) { sda=f;//准备数据 scl=1;//上升沿 // _nop_();//delay05us(); scl=0; // _nop_();//delay05us(); }
忙检测 /* * * * * 忙检测 * * * * */ /*写操作需要一定的时间,或采用忙检测:0——完成写;1——正在进行写*/ void i2cbusy(void) { bit f; i2cstart(); write(0xa0); f=ack(); while(f) { i2cstart(); write(0xa0); f=ack(); } }
字节写操作 /*字节写:x--器件地址;y--单元地址;z--数据*/ void writebyte(unsigned char x,unsigned char y,unsigned char z) { wp=0;//可读写操作 i2cstart(); write(x&0xfe);//最低位必须为0 ack();//从机应答 write(y); ack(); write(z); ack();//从机应答 i2cstop(); wp=1;//关闭可写操作,只能读操作 }
随机读操作 /*随机读操作:x--器件地址;y--单元地址;返回读取的数据*/ unsigned char randomread(unsigned char x,unsigned char y) { unsigned char z; wp=0; i2cstart(); write(x&0xfe);//最低位必须为0 ack();//从机应答 write(y); ack();//从机应答 //伪写操作 wp=1; i2cstart(); write(x|0x01);//最低位必须为1 ack();//从机应答 z=read(); noack(1);//主机应答 i2cstop(); return(z); }
总结 • 在I2C总线的应用中应注意的事项总结为以下几点 :1)严格按照时序图的要求进行操作 2)若与口线上带内部上拉电阻的单片机接口连接,可以不外加上拉电阻。 3)程序中为配合相应的传输速率,在对口线操作的指令后可用NOP(_nop_())指令加一定的延时。 • AT24Cxx系列的模型在Memory Ics里的24Cxx(注意要有仿真模型,时钟频率,写时间周期的参数)