AT24C256写不进去

2019-07-20 02:05发布

---------------------------------
回复【12楼】DADONG:
---------------------------------

关于地址,说个道理,自己就可以总结出来:

操作存储器,不论读或写,都需要指明目的字节的地址;
不同容量,地址的位数不同。比如2402是256字节,需要8位地址;24C16是2048字节,需要11位地址;容量越大,地址位数越多。

地址靠的是两个字节来表示:DEVICE ADDRESS 和之后的 WORD ADDRESS。
DEVICE ADDRESS中的5位有固定用途,剩下3位可以作为地址位使用,和后面的WORD ADDRESS拼起来,最长11位。
容量在2048字节以内的芯片,11位地址就足够了。

那么,容量再大,怎么办?
只好再增加一个字节,一共 11 + 8 =19位。这样,容量大到512K,都可以照顾到。

道理上说,制定协议的时候,可以只增加1位、2位、3位等,同样能达到目的,
但协议就显得有点乱,用户程序的兼容性也不好。所以,厂家索性一次增加8位。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
23条回答
DADONG
2019-07-22 07:04
我的AT24C256只能读写一个,页读写就只能读写第一个成功而已:代码如下:void I2C_Read_AT24C64(uint WAddrH,uint WAddrL,uint RNum){ //??WAddrH,WAddrL???×???·??????????RNum??×???
uchar Cnt; //????×??à32??×???
uchar ACK;
uchar recvie_count=0;
I2C_SDA_OUT(); 
I2C_SDA_IN();
  IIC_Start(); //?????¨??
  do{
  IIC_Send(0xa0);//AT24C64???????·
             ACK = IIC_Wait_Ack();
        }while(ACK);
do{
IIC_Send(WAddrH); //???????·????5??
     ACK = IIC_Wait_Ack();
}while(ACK);
do{
IIC_Send(WAddrL); //???????·????8??
     ACK = IIC_Wait_Ack();
}while(ACK);
IIC_Start(); //?????????¨??
do{
IIC_Send(0xa1); //AT24C64???????·
     ACK = IIC_Wait_Ack();
}while(ACK);
for(Cnt = 0;Cnt < RNum;Cnt ++){ //???·????RNum??×???

RD24C64[Cnt]=IIC_Read();
recvie_count=RD24C64[Cnt];
printf("?????????????? ");
printf("%c ",recvie_count);
if(Cnt != RNum - 1)
I2C_ACK_Send(0);
// IIC_Ack();
}
I2C_ACK_Send(1); //????×??ó????×??????????ó??·?????
// IIC_NAck();
IIC_Stop(); //?¨???á??
// return 0;
}

一周热门 更多>