---------------------------------
回复【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位。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
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;
}
假如ReadAddr这个地址位高于8位的话,除以256,也就是2的8次方,剩下的余数自然就是低地址了。
一周热门 更多>