OpenEdv-开源电子网

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

关于EEPROM的连续写最短写入延时问题?

[复制链接]

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2015-9-1
在线时间
30 小时
发表于 2016-3-7 14:34:55 | 显示全部楼层 |阅读模式
1金钱
EEPROM在连续一页之后会进入,内部数据搬运时间Twr  ,而这个时间我们不能继续写入,我们一般用延时最大时间5MS。我现在想提高连续写的速度,但是我不知道内部数据什么时候搬运完了可以继续写入?有什么方法可以实现更快速度呢?@正点原子

最佳答案

查看完整内容[请看2#楼]

EEPROM本就很慢。都是ms级别的。想要快,可以用页连续写。或者干脆换一个方案,用FRAM吧,这个速度杠杠的。。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2016-3-7 14:34:56 | 显示全部楼层
EEPROM本就很慢。都是ms级别的。想要快,可以用页连续写。或者干脆换一个方案,用FRAM吧,这个速度杠杠的。。。
回复

使用道具 举报

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2015-9-1
在线时间
30 小时
 楼主| 发表于 2016-3-7 14:38:17 | 显示全部楼层
求助原子哥
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-3-7 15:08:46 | 显示全部楼层
寻址
比如AT24C02地址为000b,
则在起始信号后发送0xA0,
若回应为ACK(0),则说明你可以继续操作,
若回应为NACK(1),则说明其忙碌(Busy),此时你可以反复地寻址,直到其空闲(Idle)
a.png

------不正经的分割线-----

z (8).jpg

坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2015-9-1
在线时间
30 小时
 楼主| 发表于 2016-3-7 16:02:42 | 显示全部楼层
xkwy 发表于 2016-3-7 15:08
寻址,
比如AT24C02地址为000b,
则在起始信号后发送0xA0,

你的意思是
void MAT24CXX_Wait_Busy(void)   
{            
        MIIC_Start();  
        MIIC_Send_Byte(0XAE);            //发送写命令
         while((MIIC_SDA) == 1);   // BUSY
}
回复

使用道具 举报

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2015-9-1
在线时间
30 小时
 楼主| 发表于 2016-3-7 16:04:44 | 显示全部楼层
xkwy 发表于 2016-3-7 15:08
寻址,
比如AT24C02地址为000b,
则在起始信号后发送0xA0,

还是
void MAT24CXX_Wait_Busy(void)   
{   
        MIIC_Start();  
        while((MIIC_SDA) == 1)// BUSY
        MIIC_Send_Byte(0XAE);          //发送写命令;   
}
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-3-7 16:58:50 | 显示全部楼层
你看看我之前写的代码:

[mw_shl_code=c,true]
# include "AT24C02.h"
# include "i2c.h"

/* 成功返回0,失败返回非零错误代码 */
uint8 EEPROM_write(uint8 *buf, uint8 addr, uint8 len)
{
    uint8 i = 0;
   
    /**参数有效性判断**/
    if (len == 0) return 0x01;                  //若读入字节长度为0,退出
    if (addr > 0xff-len) return 0x02;           //若读入的起始地址太靠后,退出
   
    while (len > 0)
    {
        /**先连接器件**/
        while (1)
        {
            I2CStart();
            if (0 == I2CWrite(0xA2)) break;     //若接到应答则进行下一步
            I2CStop();
            if (i++ > 100) return 0x11;         //若连接失败,退出
        }
        
        /**再写入操作地址**/
        if (I2CWrite(addr)) return 0x21;        //若不能接受地址,则退出
        
        /**写入数据**/
        while (len > 0)
        {
            if (I2CWrite(*buf++)) return 0x22;  //若不能接受数据,则退出
            len--;
            addr++;
            if ((addr&0x07) == 0) break;        //若到达下一页,则翻页
        }

        I2CStop();                              //停止本页写操作
    }
   
    return 0x00;                                //写入成功返回0
}

/* 成功返回0,失败返回非零错误代码 */
uint8 EEPROM_read(uint8 *buf, uint8 addr, uint8 len)
{                 
    uint8 i = 0;
   
    /**参数有效性判断**/
    if (len == 0) return 0x01;                  //若读入字节长度为0,退出
    if (addr > 0xff-len) return 0x02;           //若读入的起始地址太靠后,退出
   
    /**先连接器件**/
    while (1)
    {
        I2CStart();
        if (0 == I2CWrite(0xA2)) break;         //若接到应答则进行下一步
        I2CStop();
        if (i++ > 100) return 0x11;             //若连接失败,退出
    }
   
    /**告知其即将操作的地址**/
    if (I2CWrite(addr)) return 0x21;            //若不能接受地址,则退出
   
    /**重启总线开始读取**/
    I2CStart();
    if (I2CWrite(0xA3)) return 0x22;            //若没有应答,则退出
   
    while (--len) *buf++ = I2CRead(0);          //读取足数的字节
    *buf = I2CRead(1);                          //读取最后一个字节并返回非应答位
   
    I2CStop();

    return 0x00;                                //读取成功返回0
}
[/mw_shl_code]
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

20

主题

297

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1830
金钱
1830
注册时间
2013-7-29
在线时间
276 小时
发表于 2016-3-7 17:24:38 | 显示全部楼层
写延时一般是10ms
回复

使用道具 举报

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2019-8-19
在线时间
47 小时
发表于 2021-8-18 17:22:35 | 显示全部楼层
挂载4个芯片 维护一张表.或者在数据结尾插入区块地址.
写完这个芯片马上写下一个   等于硬件上绕开等待时间
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 06:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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