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准备好,最后再读取数据。