ESP32 IIC 主机

esp32 有两种 方法初始化IIC ;

1 老的库 头文件iic.h (官方 已经 弃用了)

2 新的库  主机和从机 分别对应不同的库文件 如果只esp只作为主机 只需要调用 主机头文derver/i2c_master.h即可 从机同理 

注意 :如果找不到 derver/i2c_master.h 参考这个文档

ESP32S3-vscode 编译缺少头文件-CSDN博客

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;
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是ESP32使用IIC接口读取SHT21温湿度传感器的IDF代码示例: ```c #include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/i2c.h" #define I2C_MASTER_SCL_IO 22 /*!< GPIO number for I2C master clock */ #define I2C_MASTER_SDA_IO 21 /*!< GPIO number for I2C master data */ #define I2C_MASTER_NUM I2C_NUM_0 /*!< I2C port number for master dev */ #define I2C_MASTER_TX_BUF_DISABLE 0 /*!< I2C master do not need buffer */ #define I2C_MASTER_RX_BUF_DISABLE 0 /*!< I2C master do not need buffer */ #define I2C_MASTER_FREQ_HZ 100000 /*!< I2C master clock frequency */ #define SHT21_ADDR 0x40 /*!< SHT21 I2C address */ 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 sht21_read_id() { uint8_t cmd[1] = {0xEFC8}; // send command to read ID uint8_t data[8] = {0}; i2c_cmd_handle_t cmd_handle = i2c_cmd_link_create(); i2c_master_start(cmd_handle); i2c_master_write_byte(cmd_handle, (SHT21_ADDR << 1) | I2C_MASTER_WRITE, true); i2c_master_write(cmd_handle, cmd, 1, true); i2c_master_stop(cmd_handle); esp_err_t ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd_handle, 1000 / portTICK_RATE_MS); i2c_cmd_link_delete(cmd_handle); if (ret != ESP_OK) { printf("Failed to send command\n"); return; } // delay for conversion vTaskDelay(100 / portTICK_RATE_MS); // read ID cmd[0] = 0xFA0F; // send command to read ID cmd_handle = i2c_cmd_link_create(); i2c_master_start(cmd_handle); i2c_master_write_byte(cmd_handle, (SHT21_ADDR << 1) | I2C_MASTER_WRITE, true); i2c_master_write(cmd_handle, cmd, 1, true); i2c_master_start(cmd_handle); i2c_master_write_byte(cmd_handle, (SHT21_ADDR << 1) | I2C_MASTER_READ, true); i2c_master_read(cmd_handle, data, 8, I2C_MASTER_LAST_NACK); i2c_master_stop(cmd_handle); ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd_handle, 1000 / portTICK_RATE_MS); i2c_cmd_link_delete(cmd_handle); if (ret != ESP_OK) { printf("Failed to read ID\n"); return; } uint16_t id = (data[0] << 8) | data[1]; uint8_t crc = data[2]; if (crc != (uint8_t)id * 5 / 256) { printf("CRC error\n"); return; } printf("SHT21 ID: 0x%04X\n", id); } void app_main() { i2c_master_init(); sht21_read_id(); } ``` 在示例中,使用ESP-IDF提供的I2C驱动程序,初始化I2C主机并发送命令读取SHT21传感器的ID。在读取ID之前需要等待一段时间,以便传感器完成转换。读取ID后,需要验证CRC以确保数据正确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值