esp32 有两种 方法初始化IIC ;
1 老的库 头文件iic.h (官方 已经 弃用了)
2 新的库 主机和从机 分别对应不同的库文件 如果只esp只作为主机 只需要调用 主机头文derver/i2c_master.h即可 从机同理
注意 :如果找不到 derver/i2c_master.h 参考这个文档
Inter-Integrated Circuit (I2C) - ESP32 - — ESP-IDF 编程指南 v5.2.2 文档 (espressif.com)
作为主机代码:
1.初始化配置:
void iic_config(i2c_master_dev_handle_t *eeprom_handle)
{
i2c_master_bus_config_t i2c_mst_config = {
.clk_source = I2C_CLK_SRC_DEFAULT, //时钟源选择 这里选择 默认
.i2c_port = I2C_NUM_0, //eps32 端口 有 I2C_NUM_0 I2C_NUM_1
.scl_io_num = 42, //这是iic外设 的端口 可以任意映射到IO口
.sda_io_num = 41,
.glitch_ignore_cnt = 7, //默认7
.flags.enable_internal_pullup = true, //是否上拉
};
ESP_ERROR_CHECK(i2c_new_master_bus(&i2c_mst_config, &bus_handle));//安装iic外设
i2c_device_config_t dev_cfg = {
.dev_addr_length = I2C_ADDR_BIT_LEN_7, //iic从设备 地址位数
.device_address = 0x50, //iic从设备 设备地址
.scl_speed_hz = 100000, //iic速率 有两种速率模式 标准 和快速 分别是100 400
};
ESP_ERROR_CHECK(i2c_master_bus_add_device(bus_handle, &dev_cfg, &dev_handle));//添加从设备
*eeprom_handle = dev_handle;
}
2.发送数据:
int iic_send_string(i2c_master_dev_handle_t Dev_handle, unsigned char *str, uint16_t Length)
{
char code = 0;
if (i2c_master_transmit(Dev_handle, str, Length, -1) == ESP_OK)
{
code = 1;
}
vTaskDelay(10);//加一个延时 等待总线空闲 否则 如果连续操作 会出现 错误
return code;
}
3.接收数据:
int iic_receive_data(i2c_master_dev_handle_t Dev_handle, unsigned char *str, uint16_t Length)
{
char code = 0;
if (i2c_master_receive(Dev_handle, str, Length, -1) == ESP_OK)
{
code = 1;
}
vTaskDelay(10);
return code;
}
4.接收和发送:
int iic_send_receive_data(i2c_master_dev_handle_t Dev_handle, unsigned char *t_data, uint16_t SendLength, unsigned char *r_data, uint16_t ReceLength)
{
char code = 0;
if (i2c_master_transmit_receive(Dev_handle, t_data, SendLength, r_data, ReceLength, -1) == ESP_OK)
{
code = 1;
}
vTaskDelay(10);
return code;
}
5.识别特定设备 是否挂载总线上:
int iic_check_device_moust(unsigned char device_adder)
{
int code = 0;
if (i2c_master_probe(bus_handle, device_adder, -1) == ESP_OK)
{
code = 1;
}
vTaskDelay(10);
return code;
}