打印
[PIC®/AVR®/dsPIC®产品]

24LC024读写问题

[复制链接]
808|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yllqabz|  楼主 | 2020-5-4 09:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
控制芯片用的STM32F103,不知道这个EEPROM跨页写是怎么操作的?试了很久还是只能正常读写前16个,查了很多资料,感觉要跨页写可以重新指定新页地址,这样就不存在跨页,如下程序所示:

if(HAL_I2C_Mem_Write(&hi2c2, ADDR_24LC02_Write, 0, I2C_MEMADD_SIZE_8BIT, WriteBuffer, 16, 0x10) == HAL_OK)
{
        while(HAL_I2C_IsDeviceReady(&hi2c2, ADDR_24LC02_Write, 20, 0x10))
                HAL_Delay(5);
                       
        if(HAL_I2C_Mem_Write(&hi2c2, ADDR_24LC02_Write, 0x10, I2C_MEMADD_SIZE_8BIT, WriteBuffer+16, 16, 0x10) == HAL_OK)
        {
              while(HAL_I2C_IsDeviceReady(&hi2c2, ADDR_24LC02_Write, 20, 0x10))
                      HAL_Delay(5);
                               
                if(HAL_I2C_Mem_Write(&hi2c2, ADDR_24LC02_Write, 0x20, I2C_MEMADD_SIZE_8BIT, WriteBuffer+32, 16, 0x10) == HAL_OK)
                {
                        while(HAL_I2C_IsDeviceReady(&hi2c2, ADDR_24LC02_Write, 20, 0x10))
                                HAL_Delay(5);
                }
        }
}

但是,结果就是不成功。望有经验的盆友指点一二。

使用特权

评论回复
沙发
ayb_ice| | 2020-5-4 10:52 | 只看该作者
页就是高地址不变,只变低地址

假设页大小为16,如果地址用一个字节表示,页地址就是高半字节,

一次写的过程页地址是固定不变的,变的只是低半字节,从00~15循环滚动,哪怕你连续写100个字节也是这样的

使用特权

评论回复
板凳
yllqabz|  楼主 | 2020-5-4 12:57 | 只看该作者
ayb_ice 发表于 2020-5-4 10:52
页就是高地址不变,只变低地址

假设页大小为16,如果地址用一个字节表示,页地址就是高半字节,

那我怎样才能写多个页呢?请详细指教

使用特权

评论回复
地板
ayb_ice| | 2020-5-4 13:06 | 只看该作者
yllqabz 发表于 2020-5-4 12:57
那我怎样才能写多个页呢?请详细指教

将个连续写分成多页写

如果页大小是8,现在需要写8个字节,
从0地址开始写,就只需要写一次,连续写8个字节
如果从地址1开始,就需要写两次,第一次写7个字节,然后再写一个字节
。。。

使用特权

评论回复
5
ayb_ice| | 2020-5-4 13:07 | 只看该作者
中间需要等待写完成才能开始下一次写

使用特权

评论回复
6
yllqabz|  楼主 | 2020-5-4 15:15 | 只看该作者
ayb_ice 发表于 2020-5-4 13:07
中间需要等待写完成才能开始下一次写

我上面那段程序也是分段写的,EEPROM是16bit/页(24LC024),写一次后等待5ms,然后再写的下一次,每次地址也是重新指定了的(分别是0x0,0x10,0x20),但就是只能存上前16个。看了很久页不知道怎么回事,能帮忙分析一下吗?已经没有思路了

使用特权

评论回复
7
ayb_ice| | 2020-5-4 15:31 | 只看该作者
yllqabz 发表于 2020-5-4 15:15
我上面那段程序也是分段写的,EEPROM是16bit/页(24LC024),写一次后等待5ms,然后再写的下一次,每次地址 ...

我从不用硬件的IIC

5ms延时不一定够的,看手册, 以前的一般是20ms

另外参考下例程代码吧

使用特权

评论回复
8
ayb_ice| | 2020-5-4 15:35 | 只看该作者
yllqabz 发表于 2020-5-4 15:15
我上面那段程序也是分段写的,EEPROM是16bit/页(24LC024),写一次后等待5ms,然后再写的下一次,每次地址 ...

先保证写一个字节是正确的,再扩展

使用特权

评论回复
9
yllqabz|  楼主 | 2020-5-4 17:00 | 只看该作者
ayb_ice 发表于 2020-5-4 15:35
先保证写一个字节是正确的,再扩展

写一个是没有问题的,能正常回读。就是涉及跨页就不行了。另外这个5ms延时必须是整整5ms吗?多一点都不行吗

使用特权

评论回复
10
yllqabz|  楼主 | 2020-5-4 17:01 | 只看该作者
ayb_ice 发表于 2020-5-4 15:31
我从不用硬件的IIC

5ms延时不一定够的,看手册, 以前的一般是20ms

参考例程上面也是用的这种方式,只不过它的EEPROM一页很大,256byte

使用特权

评论回复
11
ayb_ice| | 2020-5-4 17:17 | 只看该作者
yllqabz 发表于 2020-5-4 17:00
写一个是没有问题的,能正常回读。就是涉及跨页就不行了。另外这个5ms延时必须是整整5ms吗?多一点都不行 ...

这个时间要看具体的芯片手册, 一般在5~20Ms之间,为了确保可靠,还应该适当加长点

使用特权

评论回复
12
ayb_ice| | 2020-5-4 17:18 | 只看该作者
yllqabz 发表于 2020-5-4 17:01
参考例程上面也是用的这种方式,只不过它的EEPROM一页很大,256byte

是不是已经写进去了,是读的问题呢

使用特权

评论回复
13
Prry| | 2020-5-5 23:31 | 只看该作者
注意页写大小,24L024页大小应该是16字节,页写之间要延时
参考
【1】页写算法 https://blog.csdn.net/qq_20553613/article/details/78550427
【2】24系列驱动 https://blog.csdn.net/qq_20553613/article/details/82733817

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

7

帖子

0

粉丝