从24c128到24c.docx

上传人:牧羊曲112 文档编号:3258066 上传时间:2023-03-12 格式:DOCX 页数:10 大小:38.31KB
返回 下载 相关 举报
从24c128到24c.docx_第1页
第1页 / 共10页
从24c128到24c.docx_第2页
第2页 / 共10页
从24c128到24c.docx_第3页
第3页 / 共10页
从24c128到24c.docx_第4页
第4页 / 共10页
从24c128到24c.docx_第5页
第5页 / 共10页
亲,该文档总共10页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《从24c128到24c.docx》由会员分享,可在线阅读,更多相关《从24c128到24c.docx(10页珍藏版)》请在三一办公上搜索。

1、从24c128到24c24C256程序控制原理24C256是具有I2C接口的512x64存储器,在数据的存储过程中除了遵循I2C协议必须的逻辑以外,一个最容易忽视并且最容易导致出错的问题就是存储地址问题。 24C256的数据容量是32768,即可以存储的有效字节数。所以它的地址是16位整型数,有效范围是032768,数据字节为单位存储,在16位地址其中有效数据只有15位,低6位地址表示的容量是063,然后连续的9位地址表示页码的范围是0511,在数据连续存储过程中,相同的页面内,存储地址自动完成累加过程;数据在不同页面的存储时,地址不能自动累加,如果不做正确处理,数据将从本页开始的地址重新开始

2、覆盖已经存在的数据。例如,地址是63表示的是第0页的最后一个存储空间,地址64表示第1页最开始的存储空间。在当前存储地址是63时如果该器件处于连续存储模式下,数据将出错。 原因是什么呢? 24C256支持数据的连续存储,最大的存贮数量是64即一页的内容,如果在地址选择上超过了这个限制,数据将会覆盖本页开始的位置重新存储,这就造成数据的错误,在使用上,虽然数据是分页存储的,但在形式上是连续数据,所以存储中不需要特意区分页地址和页内地址。 在连续存储中,尽管数据每次存储的数量小于64,数据也可能出错,例如每次存储数量为11,地址的变化是0,11,22,33,44,55,66,看上去没有什么问题,地

3、址是按照每次11递增的,然而存储的结果还是出错了,原因是什么呢?在地址55开始的空间无法提供连续11个页内存储空间,当地址增加到63以后数据又从该页0地址重新开始,从而导致数据储存的错误。有效的解决办法是如果使用连续存储模式,地址的安排上要使存储块的大小为64,32,16,8,4,2此外都不能使用连续地址存储。如果数据采集中的有效数据位小于64,比如每次采集的结果是30字节,在连续存储模式下要按照32为单位存储,不足的字节补零处理。 以下是MSP430F449对24C256数据传输基本控制模块/延时处理模块 void IIC_Delay(void) _NOP; _NOP; _NOP; /启动I

4、2C模块 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为

5、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_Del

6、ay; P2DIR|=0X04;/ SCL=0 /发送单字符数据 void send _char(unsigned char data_out) / unsigned char i,tmp=0x80; for(i=0;i<8;i+) if(data_out & tmp)>0) send_one; else send_zero; tmp/=2; /读单字符数据 unsigned char read_char(void) unsigned char i,tmp=0x80; unsigned char data1=0; for (i=0;i<8;i+) P2DIR&=0XFD;/SDA=

7、1, 11111101 IIC_Delay;/ P2DIR&=0XFB;/SCL=1 FB=1111,1011 IIC_Delay; if(P2IN&0x02)>0x00) 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&BIT

8、1)=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; s

9、end_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

10、 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;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号