OpenEdv-开源电子网

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

AT24CXX全功能测试,优化读写时间

[复制链接]
回帖奖励 2 金钱 回复本帖可获得 2 金钱奖励! 每人限 1 次

3

主题

45

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
422
金钱
422
注册时间
2016-7-29
在线时间
93 小时
发表于 2026-6-30 00:12:13 | 显示全部楼层 |阅读模式
最近重看了下存储部分的资料,将学习和测试中遇到的问题,进行个总结分享;
程序参考原子的USMART方式进行调试,大家可以对比2种读和2种写协议所花费的时间
以下测试主要是在AT24C08基础上测试,其他的同理

一:AT24CXX按每页能一次性写入的字节数分,总共为5总这个一次性写入有啥好处?可以减少数据的写入时间,按页写时,只用启动1次总线,完成多字节数据写入,这个比多次启动总线,写入多个字节,效率更高;
手册里面有个tWR:写数据自定时,也就是在这个时间内擦除才能完成
  • AT24C01:       8B/页,tWR≤5ms
  • AT24C02:       8B/页,tWR≤10ms
  • AT24C04/08/16:  16B/页,tWR≤10ms
  • AT24C32/64:       32B/页,tWR≤5ms
  • AT24C128/256:   64B/页,tWR≤5ms

二:存储地址和器件地址
1. AT24C01

【存储单元地址:用8位表示】

2.AT24C02/04/08/16
从器件地址能看出,有P2 P1 P0这样的位,这个就是块位我理解是是1个块=256B能表示256个存储单元
像AT24C02总共有256B,它就没有块位,【存储单元地址:用8位表示】
AT24C04总共有512B,它有1个块位,能表示2个块,【存储单元地址:用9位表示,其中块位为扩展位】
AT24C08总共有1024B,它有2个块位,能表示4个块【存储单元地址:用10位表示,其中块位为扩展位】
AT24C016总共有2048B,它有3个块位,能表示8个块,8x256=2048B【存储单元地址:用11位表示,其中块位为扩展位】




3.AT24C32/64, 无块位

【存储单元地址:用16位表示】

4.AT24C128/256,无块位,

【存储单元地址:用16位表示】

三:读操作主要分3种
1. 当前地址读【1次读1B】
这个我主要用来测试,实际程序中未使用
这里面涉及到上一次主机对芯片的操作,如果是读操作,则按对应地址递增,到达存储的最后1页的最后1个地址时,则回卷到第一页的第1个地址;


但是如果是写操作的话,如果上一次是写的某一页最后1个地址时,则读当前地址则会读到那一页的第一个地址,大家可以用测试程序种的:u8 AT24CXX_ReadCurrentAddData(u16 ReadAddr)进行测试;
注意:实际使用的时候,需要先读或者写或者设置1次字节地址计数器值后,在发AT24CXX_ReadCurrentAddData函数测试,
因为上电复位后,字节地址计数器值时随机的,不确定位置,做上面3个动作的任意1个就是为了确定当前的地址

2. 随机地址读【1次读1B】
这里面有个假写的动作dummy写,这个假写目的主要就是为了设置这个字节地址计数器的,告诉EEPROM,主机是要操作这个地址了,从这个地址读或者写;

3. 序列读【1次读多个字节,直到主机发NACK时结束总线】
在操作这个协议时,我们需要先设置我们要开始读的地址,通过*4协议进行设置
u8 AT24CXX_ReadSequential(u16 ReadAddr, u8 *pBuffer, u16 NumToRead)
原子的例程,就是基于每启动2次总线,只读出1字节方式,多次循环读出多个字节,
使用序列读的话,只用启动1次总线,就可以读出需要长度的数据了,相比之下减小了读的时间;



*4. 设置字节地址计数器值
这个类似于FATFS中读或者写文件指针,每读1次,指针值自动加1,
这里面有个假写的动作dummy写,这个假写目的主要就是为了设置这个字节地址计数器的,告诉EEPROM,主机是要操作这个地址了,此时我们在收到EEPROM返回ACK时,停止总线,这样就将字节地址计数器设置成功了;
这样我们就可以进行序列读数据了,
void AT24CXX_SetCount(u16 WriteAddr)

四:写操作主要分2种
1. 字节写入【1次写1B】
这里面需要分不同的AT24CXX,写入器件地址不同

2. 页写入【1次可以写入1页数据,页数据大小见"一"中描述】

原子的例程,就是基于每启动1次总线,只写入1字节方式,多次循环写入多个字节,
使用按页写的话,只用启动1次总线,就可以写入最大1页数据,相比之下减小了写的时间;

在同一页,写入1B和1页字节,相差时间不大,tWR左右,如果是按字节写入N的话,那就需要N*tWR的时间,时间明显就成倍数增加了,
实际测试的时候,将USMART中 runtime 1打开,就能明显看到这写入时间对比差异了

五:测试程序说明
数据结构部分,我习惯将设备常用到的参数,设计为1个结构体
typedef struct
{
       u8 t1;
       u16 t2;
       u32 t3;
       u8 t4;
       u8 t5;
       ......
}SYS_PARA_STU;

SYS_PARA_STU sys_para_def;
一次性读取完参数地址开始的那段数据,通过将指针强制转换,这样就能得到结构体sys_para_def里面所有成员的数据了
数据的写入,考虑到不止1次参数修改,可以将参数修改后,设置1个修改标志,并对其计数,只要在最大计数值内,比如30s,用户改了多次参数,那么每改1次计数清零,计数到30s就只用存1次,不必改1个就存一个,这样容易减少EEPROM写入的寿命

USMART调试部分
//AT24CXX调试
    (void*)AT24CXX_TypeSet,"void AT24CXX_TypeSet(u16 type)",//这个主要是可以通过设置测试全系列AT24CXX

    (void*)AT24CXX_ReadOneByte,"u8 AT24CXX_ReadOneByte(u16 ReadAddr)",
    (void*)AT24CXX_WriteOneByte,"void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)",
         
    (void*)AT24CXX_SetCount,"void AT24CXX_SetCount(u16 WriteAddr)",
        (void*)AT24CXX_ReadCurrentAddData,"u8 AT24CXX_ReadCurrentAddData(u16 ReadAddr)",
        (void*)myAT24CXX_ReadSequential,"void myAT24CXX_ReadSequential(u16 ReadAddr, u16 NumToRead)",

        (void*)myAT24CXX_ReadOnebyOne,"void myAT24CXX_ReadOnebyOne(u16 ReadAddr, u16 NumToRead)",
        (void*)myAT24CXX_WriteTest,"void myAT24CXX_WriteTest(u16 WriteAddr, u16 NumToWrite, u16 offset, u8 type)",
        (void*)myAT24CXX_WriteOnePage,"void myAT24CXX_WriteOnePage(u16 WriteAddr,  u8 offset)",


在测试程序里面,可以通过#define ATOM_BOARD设置多种不同IO口初始化,方便测试;
后续再更新下W25QXX部分测试









AT24CXX全系列功能测试V0.1 20260630.rar

7.81 KB, 下载次数: 1

Planets, no limit!
回复

使用道具 举报

3

主题

45

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
422
金钱
422
注册时间
2016-7-29
在线时间
93 小时
 楼主| 发表于 昨天 18:50 | 显示全部楼层
此贴作废,请直接看我的这个贴:AT24CXX全功能测试,优化读写时间,使用USMART调试
Planets, no limit!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

如发现本坛存在违规或侵权内容, 请点击这里发送邮件举报 (或致电020-38271790)。请提供侵权说明和联系方式。我们将及时审核依法处理,感谢配合。

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

GMT+8, 2026-7-15 04:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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