c - 使用 ESP32 写入 I2C EEPROM 页的问题

标签 c i2c eeprom esp32

我在使用 ESP32 将多个字节写入 24LC256 EEPROM 时遇到问题。

以下函数负责读取和写入 EEPROM。 (据我了解,使用此 EEPROM 页面写入仅限于 64 字节增量,此代码仅用于测试)

EEPROM写入功能

esp_err_t eeprom_write(uint8_t deviceaddress, uint16_t eeaddress, uint8_t* data, size_t size) {
    i2c_cmd_handle_t cmd = i2c_cmd_link_create();
    i2c_master_start(cmd);
    i2c_master_write_byte(cmd, (deviceaddress << 1) | EEPROM_WRITE_ADDR, 1);
    i2c_master_write_byte(cmd, eeaddress>>8, 1);
    i2c_master_write_byte(cmd, eeaddress&0xFF, 1);

    i2c_master_write(cmd, data, size, 1);   // Start page write

    i2c_master_stop(cmd);    // Call stop command
    esp_err_t ret = i2c_master_cmd_begin(I2C_NUM_1, cmd, 1000/portTICK_PERIOD_MS);
    i2c_cmd_link_delete(cmd);
    return ret;
}

EEPROM读取功能

esp_err_t eeprom_read(uint8_t deviceaddress, uint16_t eeaddress, uint8_t* data, size_t size) {
    i2c_cmd_handle_t cmd = i2c_cmd_link_create();
    i2c_master_start(cmd);
    i2c_master_write_byte(cmd, (deviceaddress<<1)|EEPROM_WRITE_ADDR, 1);
    i2c_master_write_byte(cmd, eeaddress<<8, 1);
    i2c_master_write_byte(cmd, eeaddress&0xFF, 1);
    i2c_master_start(cmd);
    i2c_master_write_byte(cmd, (deviceaddress<<1)|EEPROM_READ_ADDR, 1);

    // Sequential read support
    if (size > 1) {
        i2c_master_read(cmd, data, size-1, 0);  // Send ack for these bytes
                                            // as part of a sequential read
    }
    i2c_master_read_byte(cmd, data+size-1, 1);  // Do not ack the last byte
    i2c_master_stop(cmd);
    esp_err_t ret = i2c_master_cmd_begin(I2C_NUM_1, cmd, 1000/portTICK_PERIOD_MS);
    i2c_cmd_link_delete(cmd);
    return ret;
}

奇怪的是,我能够向 EEPROM 写入 13 个字节,并且一切似乎都很好。

eeprom_write(0x50, 0x0000, data_wr, 13);   // Returns ESP_OK
eeprom_read(0x50, 0x0000, data_rd, 64);    // Returns ESP_OK

但是,当向 EEPROM 写入超过 13 个字节时,顺序读取功能就会出现问题。

eeprom_write(0x50, 0x0000, data_wr, 14);   // Returns ESP_OK
eeprom_read(0x50, 0x0000, data_rd, 64);    // Return ESP_FAIL

我确信我所做的一切都遵循 24LC256 数据表的读写规则。我有什么遗漏的吗?

最佳答案

显然,两次通话之间所需要的只是短暂的延迟。在 ESP32 进行另一次调用之前,EEPROM 需要一些时间将页面缓冲区写入存储单元。

eeprom_write(0x50, 0x0000, data_wr, 64);   // ESP_OK
vTaskDelay(20/portTICK_PERIOD_MS);
eeprom_read(0x50, 0x0000, data_rd, 64);    // ESP_OK

现在一切正常。

关于c - 使用 ESP32 写入 I2C EEPROM 页的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51847065/

相关文章:

c - 在 c 中打印 wav header

STM32F4 : EEPROM 25LC256 management through SPI

c - 错误: invalid operands to binary >> (have 'float' and 'int' )

c - STM32F207 Nucleo144板,写入常驻内存

c - C语言中字符串的循环

c - 在 c 中使用 getchar() 获取段错误(核心转储)

linux - 如何为i2c传感器编写I2C设备驱动程序?

c - I2C ACK 位不会被硬件清除

C - 读取二进制文件,验证校验和

embedded - 嵌入式应用中bit banging SPI/I2C有什么缺点