【问题标题】:Is it necessary to pass value to an array before writing to EEPROM?在写入 EEPROM 之前是否需要将值传递给数组?
【发布时间】:2021-07-04 15:09:55
【问题描述】:

我是嵌入式世界的新手,想知道在写入 EEPROM 之前将值传递给数组是否对可靠性或准确性有好处?我在这里使用 I2C 协议。下面是向我的 EEPROM 芯片写入值的区别。我看到大多数人在写入之前将数据存储到数组中。如果不考虑可靠性和准确性,那背后的原因是什么?

uint64_t OperationTime;
uint8_t e2prom_w_buf[256];
uint8_t i;
for(i =0 ; i < 8 ; i++ )
{
    e2prom_w_buf[i]=OperationTime >> i*8;
}
e2prom_PageWrite(&e2prom_w_buf, Address, 8);

&

uint8_t
for(i =0 ; i < 8 ; i++ )
{
e2prom_PageWrite((OperationTime << i*8), Address, 8); // do I need a uint8_t cast here for OperationTime?
}

OperationTime 每秒在定时器中断函数中不断增加

I2C 设置 100kHz

【问题讨论】:

  • e2prom_PageWrite 是什么意思? e2prom_PageWrite 期待什么论点?

标签: c embedded


【解决方案1】:

在一个块中写入一个 EEPROM 比多个单字节操作更快。您应该查看特定 EEPROM 的数据表以了解原因,但只是选择一个典型的 SPI请参见注释 EEPROM 作为示例(本例中为 AT25M01)。它有一个字节写入序列,因此:

注意:我选择了一个 SPI 部分进行说明,因为时序图稍微简单一些。我注意到你提到 I2C - 原理是一样的,总线事务更复杂。

©2019 Microchip Technology Inc.

和一个 Page Write 因此:

©2019 Microchip Technology Inc.

Page Write 一次最多可以写入 256 个字节,只有起始地址,而对于一个字节写入,您必须写入每个字节的地址,并且必须等待写入完成(忙碌状态)之前你可以写下一个。因此,您必须为单字节写入发送 5 个字节,但对于页面写入仅发送 4 + n 个字节。因此,就 SPI(或您的情况下的 I2C)总线活动而言,写入单个字节需要写入总线的字节数接近 4 倍。

同样对于本例中的 AT25M01,写入周期时间为“最多 5ms”。一个字节写入需要 5 毫秒,而页面写入需要 5 毫秒。因此,对于字节写入,您示例中的 8 个字节可能需要多达 40 毫秒,而对于页面写入,则不会超过 5 毫秒。

页面写入的另一个好处是,在许多 MCU 上,您可以使用 DMA(直接内存访问)发送数据,因此写入 EEPROM 的软件开销很少或没有,MCU 可以执行其他工作。

【讨论】:

  • 感谢您的明确解释。我正在使用 ATMEL AT24C02。它也有相同的最大值。将 5ms 的周期时间写为 AT25M01 。我想知道在大多数 EEPROM 中读取字节是否有任何读取周期时间和限制。我知道将数据写入 EEPROM 可能会导致磨损。读操作呢?
  • 对于读访问,总线速度是限制因素。在这种情况下,SPI 能够更快地读取,但典型的 EEPROM 大小通常使这在很大程度上无关紧要。在大多数情况下,您在启动时将所需内容从 EEPROM 读取到 RAM 中,然后您就完成了。
【解决方案2】:

一些 EEPROM 设备的内存是按页组织的,它由多个字节组成。将多个字节写入同一页与写入单个字节所用的时间相同。因此,为了更快的写入/编程,首选页面写入操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-14
    • 2015-09-24
    • 2016-03-21
    相关资源
    最近更新 更多