mini板成功实现AT24C04/08/16/32/64/128/256读写功能

2019-07-21 00:22发布

最近由于需要使用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代码——更换自己使用的芯片类型





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
peng1554
1楼-- · 2019-07-21 05:00
多谢分享~~~
Acuity
2楼-- · 2019-07-21 05:01
知马力
3楼-- · 2019-07-21 10:24
请问楼主,下列的255及0x55是否需要修改?
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;                                                                                          
}
人去搂空
4楼-- · 2019-07-21 13:33
 精彩回答 2  元偷偷看……

一周热门 更多>