资源预览内容
第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
亲,该文档总共5页全部预览完了,如果喜欢就下载吧!
资源描述
24C256 程序控制原理(ZZ)24C256 是具有 I2C 接口的 512x64 存储器,在数据的存储过程中除了遵循 I2C 协议必须的逻辑以外,一个最容易忽视并且最容易导致出错的问题就是存储地址问题。 24C256 的数据容量是 32768,即可以存储的有效字节数。所以它的地址是 16 位整型数,有效范围是 032768,数据字节为单位存储,在 16 位地址其中有效数据只有 15 位,低 6(05)位地址表示的容量是 063 ,然后连续的 9(614)位地址表示页码的范围是 0511 ,在数据连续存储过程中,相同的页面内,存储地址自动完成累加过程;数据在不同页面的存储时,地址不能自动累加,如果不做正确处理,数据将从本页开始的地址重新开始覆盖已经存在的数据。例如,地址是 63(二进制码 111111)表示的是第 0 页的最后一个存储空间,地址 64(二进制码 1,000000)表示第 1 页最开始的存储空间。在当前存储地址是 63 时如果该器件处于连续存储模式下,数据将出错。 原因是什么呢? 24C256 支持数据的连续存储,最大的存贮数量是 64 即一页的内容,如果在地址选择上超过了这个限制,数据将会覆盖本页开始的位置重新存储,这就造成数据的错误,在使用上,虽然数据是分页存储的,但在形式上是连续数据,所以存储中不需要特意区分页地址和页内地址。 在连续存储中,尽管数据每次存储的数量小于 64,数据也可能出错,例如每次存储数量为 11,地址的变化是 0,11,22,33,44 ,55,66 ,看上去没有什么问题,地址是按照每次 11 递增的,然而存储的结果还是出错了,原因是什么呢?在地址 55 开始的空间无法提供连续 11 个页内存储空间,当地址增加到 63 以后数据又从该页 0 地址重新开始,从而导致数据储存的错误。有效的解决办法是如果使用连续存储模式,地址的安排上要使存储块的大小为 64,32 ,16,8 ,4,2 此外都不能使用连续地址存储。如果数据采集中的有效数据位小于 64,比如每次采集的结果是 30 字节,在连续存储模式下要按照 32 为单位存储,不足的字节补零处理。 以下是 MSP430F449 对 24C256 数据传输基本控制模块/延时处理模块 void IIC_Delay(void) _NOP(); _NOP(); _NOP(); /启动 I2C 模块 void start_IIC(void) / 启动 I2 P2OUT&=0xf9; /设置 P2 输出 P2DIR&=0XFD; /SDA=1, 上拉电阻使得 P2.1 为 H,FD=1111,1101 P2DIR&=0XFB; /SCL=1 FB=1111,1011 P2DIR|=0X02; / SDA=0 P2DIR|=0X04; / SCL=0 /停止 I2C 模块 void stop_IIC(void) / P2DIR|=0X02;/SDA=0 IIC_Delay(); P2DIR&=0XFB;/SCL=1 FB=1111,1011 P2DIR&=0XFD;/SDA=1, 上拉电阻使得 P2.1 为 H,FD=1111,1101 IIC_Delay(); P2DIR|=0X04;/ SCL=0 /发送 “ 0”模块 void send_zero(void) / P2DIR|=0X02;/ SDA=0 IIC_Delay(); P2DIR&=0XFB;/SCL=1 FB=1111,1011 IIC_Delay(); P2DIR|=0X04;/ SCL=0 /发送 1 模块 void send_one(void) / P2DIR&=0XFD;/SDA=1, 上拉电阻使得 P2.1 为 H,FD=1111,1101 IIC_Delay(); P2DIR&=0XFB;/SCL=1 FB=1111,1011 IIC_Delay(); P2DIR|=0X04;/ SCL=0 /发送单字符数据 void send _char(unsigned char data_out) / unsigned char i,tmp=0x80; for(i=0;i0) send_one(); else send_zero(); tmp/=2; /读单字符数据 unsigned char read_char(void) unsigned char i,tmp=0x80; unsigned char data1=0; for (i=0;i0x00) data1|=tmp; P2DIR|=0X04;/ SCL=0 IIC_Delay(); tmp/=2; return data1; / 检查应答信号模块 void iic_ACK(void) ack_flag=0x00; P2DIR&=0XFD;/SDA=1, FD=1111,1101 IIC_Delay(); P2DIR&=0XFB;/SCL=1 FB=1111,1011 IIC_Delay(); while(P2IN&BIT1)=BIT1); P2DIR|=0X04;/ SCL=0 IIC_Delay(); /拒绝应答模块 void iic_NACK(void) P2DIR&=0XFD;/SDA=1, IIC_Delay(); P2DIR&=0XFB;/SCL=1 FB=1111,1011 IIC_Delay(); P2DIR|=0X04;/ SCL=0 IIC_Delay(); P2DIR|=0X02;/ SDA=0 IIC_Delay();/ /写连续数据模块 void WriteNbyte(unsigned char *p,unsigned int addr,unsigned char number) start_IIC(); send_char(0xa2); iic_ACK(); send_char(addr/256); /high address byte iic_ACK(); send_char(addr%256); iic_ACK(); do send_char(*p); p+; iic_ACK(); while(-number); stop_IIC(); delay(10); /发送应答模块:ACK (LOW) void S_ACK(void) P2DIR|=0X02;/ SDA=0 IIC_Delay(); P2DIR&=0XFB;/SCL=1 FB=1111,1011 IIC_Delay(); P2DIR|=0X04;/ SCL=0 IIC_Delay(); /连续读字符模块 void ReadNbyte(unsigned char *p,unsigned int addr,unsigned char number) start_IIC(); send_char(0xa2); iic_ACK(); send_char(addr/256); iic_ACK(); send_char(addr%256); iic_ACK(); start_IIC(); send_char(0xa3); iic_ACK(); do *p=read_char(); p+; if(number!=1) S_ACK(); /send ACK while(-number); iic_NACK(); stop_IIC();
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号