在写入 EEPROM 之前是否需要将值传递给数组?

Is it necessary to pass value to an array before writing to EEPROM?

我是嵌入式世界的新手,想知道在写入 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

一些EEPROM设备的内存是按页组织的,由多个字节组成。将多个字节写入同一页所花费的时间与写入单个字节所花费的时间相同。因此,页写操作更适合更快 writes/programming.

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

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

©2019 Microchip Technology Inc.

和一个页面写入因此:

©2019 Microchip Technology Inc.

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

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

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