at24c256应用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

at24c256应用
24C256程序控制原理(ZZ)
24C256是具有I2C接口的512x64存储器,在数据的存储过程中除了遵循I2C协议必须的逻辑以外,一个最容易忽视并且最容易导致出错的问题就是存储地址问题。

24C256的数据容量是32768,即可以存储的有效字节数。

所以它的地址是16位整型数,有效范围是0~32768,数据字节为单位存储,在16位地址其中有效数据只有15位,低6(0~5)位地址表示的容量是0~63,然后连续的9(6~14)位地址表示页码的范围是0~511,在数据连续存储过程中,相同的页面内,存储地址自动完成累加过程;数据在不同页面的存储时,地址不能自动累加,如果不做正确处理,数据将从本页开始的地址重新开始覆盖已经存在的数据。

例如,地址是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;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=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&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();
}。

相关文档
最新文档