Skip to content

FM24LC64B芯片的使用方法

简介

数据手册

数据手册

接口

  • FM24LC64B芯片的接口为I2C接口,通过I2C总线与主控芯片进行通信。
  • 芯片的地址为0x50,其中A0和A1和A2引脚可以通过硬件连接或软件配置来改变地址。
  • 芯片的读写速度为100kHz。
  • 芯片的容量为64Kbit,即 8K*8,可存储8K个字节的数据。
  • 芯片的功耗为2.5uA。
  • 芯片的温度范围为-40°C到+85°C。
  • 芯片的工作电压为2.7V到5.5V。

I2C接口的使用方法: 参考I2C方法

使用方法

1. 首先要初始化I2C总线。

c
    i2c_master_bus_config_t i2c_mst_config = {
        .clk_source = I2C_CLK_SRC_DEFAULT,
        .i2c_port = I2C_MASTER_NUM,
        .scl_io_num = I2C_MASTER_SCL_IO,
        .sda_io_num = I2C_MASTER_SDA_IO,
        .glitch_ignore_cnt = 7,
        .flags.enable_internal_pullup = true,
    };

    i2c_master_bus_handle_t bus_handle;
    ESP_ERROR_CHECK(i2c_new_master_bus(&i2c_mst_config, &bus_handle));

在这里获取得到的bus_handle就是I2C总线的句柄。后面用这个句柄来操作I2C总线。

2. 然后要初始化FM24LC64B芯片。

c
esp_err_t FM24CL64B_init(i2c_master_bus_handle_t *i2c_handle,i2c_master_dev_handle_t *FM24CL64B_handle)
{

    i2c_device_config_t FM24CL64B_cfg = {
        .dev_addr_length = FM24LC_ADDR_LEN,
        .device_address = FM24LC_ADDR,
        .scl_speed_hz = 100000,
    };

    // i2c_master_dev_handle_t FM24CL64B_handle;
    esp_err_t err = i2c_master_bus_add_device(*i2c_handle, &FM24CL64B_cfg, FM24CL64B_handle);


    return ESP_OK;
}

在这里获取得到的FM24CL64B_handle就是FM24LC64B芯片的句柄。后面用这个句柄来操作FM24LC64B芯片。

3.写入数据

c
esp_err_t FM24CL64B_write(i2c_master_dev_handle_t *dev_handle, uint16_t addr, uint8_t *data, size_t len) 
{
    // 发送地址和数据
    uint8_t buffer[2+len];
    buffer[0] = addr >> 8; // 地址高字节
    buffer[1] = addr & 0xFF; // 地址低字节
    memcpy(&buffer[2], data, len); // 数据
    esp_err_t err = i2c_master_transmit(*dev_handle, buffer, 2+len, FM24LC_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
    if (err != ESP_OK)
    {
        ESP_LOGE("FM24LC_DEMO", "I2C传输失败");
        return err;
    }   
   //  vTaskDelay(pdMS_TO_TICKS(80)); // 等待EEPROM准备好
    return ESP_OK;
}

通过读取手册,可以知道,写入指令后,接着写入数据。 所以写入时,要先将命令与数据合并成一个数组,然后通过I2C总线发送出去,即i2c_master_transmit

4.读取数据

c
esp_err_t FM24CL64B_read(i2c_master_dev_handle_t *dev_handle, uint16_t addr, uint8_t *data, size_t len)
{
    uint8_t cmd[2] = {addr >> 8, addr & 0xFF}; // 读取地址
    esp_err_t err = i2c_master_transmit(*dev_handle, cmd, 2, FM24LC_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
    if (err != ESP_OK)
    {
        ESP_LOGE("FM24LC_DEMO", "I2C传输失败");
        return err;
    }
   //  vTaskDelay(pdMS_TO_TICKS(80)); // 等待EEPROM准备好
    err = i2c_master_receive(*dev_handle, data, len, FM24LC_MASTER_TIMEOUT_MS / portTICK_PERIOD_MS);
    if (err!= ESP_OK)
    {
        ESP_LOGE("FM24LC_DEMO", "I2C接收失败");
        return err;
    }
    return ESP_OK;
}

读取时,先发送读取地址,然后等待EEPROM准备好,最后再读取数据。