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

2019-07-20 23:32发布

EEPROM在连续一页之后会进入,内部数据搬运时间Twr  ,而这个时间我们不能继续写入,我们一般用延时最大时间5MS。我现在想提高连续写的速度,但是我不知道内部数据什么时候搬运完了可以继续写入?有什么方法可以实现更快速度呢?@正点原子
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
正点原子
1楼-- · 2019-07-21 02:13
 精彩回答 2  元偷偷看……
ZGT6
2楼-- · 2019-07-21 05:22
求助原子哥
xkwy
3楼-- · 2019-07-21 09:26
寻址
比如AT24C02地址为000b,
则在起始信号后发送0xA0,
若回应为ACK(0),则说明你可以继续操作,
若回应为NACK(1),则说明其忙碌(Busy),此时你可以反复地寻址,直到其空闲(Idle)
a.png

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

z (8).jpg

ZGT6
4楼-- · 2019-07-21 14:00
 精彩回答 2  元偷偷看……
ZGT6
5楼-- · 2019-07-21 14:18
 精彩回答 2  元偷偷看……
xkwy
6楼-- · 2019-07-21 16:42
你看看我之前写的代码:

[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]

一周热门 更多>