最近由于需要使用STM32进行对AT24C128的读写,所以在mini板上进行实验。
首先将原有24C02芯片更换为24C128芯片。
然后修改代码。
贴出代码前,简单说明一下:
AT24Cxx系列芯片的寻址方式中,24C01~24C02的寻址方式相同。
24C01的存储空间为1Kbit,即 1024bit /8=128byte,即一共128位,寻址地址共128个,寻址位仅需要4位。
同理,24C02存储空间为2Kbit,2048bit /8=256byte,一共256位,寻址地址需要256个,寻址位仅需要8位。
而从24C04开始,寻址位将大于8位,一个寻址数据不够用。而该芯片通过两次输入寻址位的方式进行寻址,
先发送高8位,进行一次ASK,再发送低8位,再ASK,然后进行之后的步骤。
原子哥提供的例程代码中,有对这部分内容的体现,但代码存在两个问题:
1.关于寻职位的分级点设定问题:原子哥把AT24C16作为两个寻址字节的分界点
2.高地址输入后进行了两次ACK
图片是原代码,蓝 {MOD}线画出的地方需要做调整。
下面贴出需要修改,且已经修改好的两段代码:
24cxx.c中:
//在AT24CXX指定地址读出一个数据
//ReadAddr:开始读数的地址
//返回值 :读到的数据
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{
u8 temp=0;
IIC_Start();
if(EE_TYPE>AT24C02)
{
IIC_Send_Byte(0XA0); //发送写命令
IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr>>8);//发送高地址
//此处多余一个 IIC_Wait_Ack();
}else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); //发送器件地址0XA0,写数据
IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr%256); //发送低地址
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(0XA1); //进入接收模式
IIC_Wait_Ack();
temp=IIC_Read_Byte(0);
IIC_Stop();//产生一个停止条件
return temp;
}
//在AT24CXX指定地址写入一个数据
//WriteAddr :写入数据的目的地址
//DataToWrite:要写入的数据
void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
{
IIC_Start();
if(EE_TYPE>AT24C02)
{
IIC_Send_Byte(0XA0); //发送写命令
IIC_Wait_Ack();
IIC_Send_Byte(WriteAddr>>8);//发送高地址
}else
{
IIC_Send_Byte(0XA0+((WriteAddr/256)<<1)); //发送器件地址0XA0,写数据
}
IIC_Wait_Ack();
IIC_Send_Byte(WriteAddr%256); //发送低地址
IIC_Wait_Ack();
IIC_Send_Byte(DataToWrite); //发送字节
IIC_Wait_Ack();
IIC_Stop();//产生一个停止条件
delay_ms(10);
}
24cxx.h中:
#define EE_TYPE AT24C128
将“AT24C02”修改为自己使用的型号
其他代码不需要更改。
至此,更改完成。
总结一下,分4步:
1.更换芯片
2.修改.C代码——修改分界点
3.修改.C代码——删除多余IIC_Wait_Ack();
4.修改.H代码——更换自己使用的芯片类型
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
https://blog.csdn.net/qq_20553613/article/details/82733817
u8 AT24CXX_Check(void)
{
u8 temp;
temp=AT24CXX_ReadOneByte(255);//避免每次开机都写AT24CXX
if(temp==0X55)return 0;
else//排除第一次初始化的情况
{
AT24CXX_WriteOneByte(255,0X55);
temp=AT24CXX_ReadOneByte(255);
if(temp==0X55)return 0;
}
return 1;
}
一周热门 更多>