ESP32,IIC驱动M24M02,写2M数据
时间: 2024-01-23 22:03:21 浏览: 160
M24M02的存储容量为2Mbit,即256KB。因此,如果要写入2M数据,则需要使用多个M24M02芯片或者其他更大容量的存储器件。以下是使用ESP-IDF SDK编写的C语言示例代码,用于向M24M02芯片中写入数据:
```c
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/i2c.h"
#define I2C_MASTER_SCL_IO 22 // 连接到M24M02芯片的SCL引脚
#define I2C_MASTER_SDA_IO 21 // 连接到M24M02芯片的SDA引脚
#define I2C_MASTER_NUM I2C_NUM_0 // I2C控制器的编号
#define I2C_MASTER_TX_BUF_DISABLE 0 // I2C发送缓冲区禁用
#define I2C_MASTER_RX_BUF_DISABLE 0 // I2C接收缓冲区禁用
#define I2C_MASTER_FREQ_HZ 100000 // I2C总线的频率设置为100kHz
#define M24M02_ADDR 0x50 // M24M02芯片的I2C地址
#define PAGE_SIZE 64 // M24M02芯片的页大小为64字节
#define DATA_LENGTH 512 // 数据缓冲区的长度
#define WRITE_TEST_DATA_LEN 2048 // 要写入的数据长度
static esp_err_t i2c_master_init() {
i2c_config_t conf;
conf.mode = I2C_MODE_MASTER;
conf.sda_io_num = I2C_MASTER_SDA_IO;
conf.sda_pullup_en = GPIO_PULLUP_ENABLE;
conf.scl_io_num = I2C_MASTER_SCL_IO;
conf.scl_pullup_en = GPIO_PULLUP_ENABLE;
conf.master.clk_speed = I2C_MASTER_FREQ_HZ;
i2c_param_config(I2C_MASTER_NUM, &conf);
return i2c_driver_install(I2C_MASTER_NUM, conf.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0);
}
void i2c_master_write_M24M02() {
uint8_t* data = (uint8_t*) malloc(DATA_LENGTH);
uint8_t addr_buf[2] = {0x00, 0x00}; // 写入数据起始地址
for (int i = 0; i < WRITE_TEST_DATA_LEN / PAGE_SIZE; i++) {
for (int j = 0; j < PAGE_SIZE; j++) {
data[j] = i * PAGE_SIZE + j; // 写入测试数据
}
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
i2c_master_write_byte(cmd, (M24M02_ADDR << 1) | I2C_MASTER_WRITE, true);
i2c_master_write(cmd, addr_buf, 2, true);
i2c_master_write(cmd, data, PAGE_SIZE, true);
i2c_master_stop(cmd);
esp_err_t ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_RATE_MS);
i2c_cmd_link_delete(cmd);
if (ret == ESP_OK) {
printf("M24M02 write success! Page No.%d\n", i);
} else {
printf("M24M02 write failed! Page No.%d\n", i);
}
vTaskDelay(50 / portTICK_RATE_MS); // 等待写入完成
addr_buf[1] += PAGE_SIZE; // 更新下一次写入的地址
}
free(data);
}
void app_main() {
i2c_master_init();
i2c_master_write_M24M02();
}
```
在这个示例中,我们使用ESP32的I2C控制器来向M24M02芯片中写入数据。首先通过调用`i2c_master_init()`函数对I2C控制器进行初始化,然后通过调用`i2c_master_write_M24M02()`函数来向M24M02芯片中写入数据。其中,通过`i2c_cmd_handle_t`类型的变量`cmd`来组织I2C总线上的读写操作,通过调用`i2c_master_cmd_begin()`函数来实际执行I2C总线上的读写操作。需要注意的是,在实际使用时,需要根据具体的硬件连接和M24M02芯片的地址等参数进行相应的修改。同时,由于M24M02芯片的页大小为64字节,因此在写入数据时需要将数据分为多个64字节的页进行写入。在每次写入操作之间需要加入一定的延时,等待写入操作完成。
阅读全文