OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6620|回复: 6

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

[复制链接]

18

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
209
金钱
209
注册时间
2014-10-5
在线时间
41 小时
发表于 2019-2-27 16:27:35 | 显示全部楼层 |阅读模式
最近由于需要使用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
图片是原代码,蓝色线画出的地方需要做调整。


下面贴出需要修改,且已经修改好的两段代码:

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代码——更换自己使用的芯片类型





原代码截图

原代码截图
我已经是STM32熟练工了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10569
金钱
10569
注册时间
2017-2-18
在线时间
1913 小时
发表于 2019-2-27 19:26:15 | 显示全部楼层
回复 支持 反对

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2019-2-28 00:03:42 | 显示全部楼层
回复 支持 反对

使用道具 举报

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2018-4-21
在线时间
15 小时
发表于 2019-6-4 16:50:29 | 显示全部楼层
请问楼主,下列的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;                                                                                          
}
回复 支持 反对

使用道具 举报

0

主题

143

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2019-5-30
在线时间
4 小时
发表于 2019-6-5 11:35:05 | 显示全部楼层
谢谢分享!
回复 支持 反对

使用道具 举报

11

主题

84

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1455
金钱
1455
注册时间
2020-6-18
在线时间
225 小时
发表于 2021-5-21 10:13:23 | 显示全部楼层
用你的方法,24C04的,结果是255以后正常,0~255不正常了,看了下,可以把这句“IIC_Send_Byte(0XA1); //进入接收模式”改成”IIC_Send_Byte(0XA1+((ReadAddr/256)<<1));“
回复 支持 反对

使用道具 举报

18

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
209
金钱
209
注册时间
2014-10-5
在线时间
41 小时
 楼主| 发表于 2021-5-24 23:36:09 | 显示全部楼层
二三五 发表于 2021-5-21 10:13
用你的方法,24C04的,结果是255以后正常,0~255不正常了,看了下,可以把这句“IIC_Send_Byte(0XA1); //进 ...

多谢多谢,这个帖子是很久很久以前的了
我已经是STM32熟练工了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-23 08:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表