当前位置 博文首页 > freemote的博客:【玩转ESP32】6、驱动i2c设备---0.96 OLED

    freemote的博客:【玩转ESP32】6、驱动i2c设备---0.96 OLED

    作者:[db:作者] 时间:2021-07-05 09:55

    系列文章:
    【玩转ESP32】1、开发环境搭建
    【玩转ESP32】2、开发参考资料
    【玩转ESP32】3、点亮LED,Blink,blink,blink
    【玩转ESP32】4、ESP32驱动DHT11
    【玩转ESP32】5、i2c-tools访问i2c设备

    前言:在上文中聊了i2c-tools,主要使用命令行,本文使用代码驱动设备。本文以驱动oled展开,关于oled的详细说明,可查看一文彻底了解SSD1306驱动0.96寸OLED,在这里只聊esp32的i2c如何使用。

    1、初始化

    (1)配置i2c:指定i2c的引脚、模式、速率等;

    (2)安装i2c驱动:设置发送、接收缓冲,指定中断等;

    这个代码基本是固定的,当做主机的时候都可以使用以下代码来初始化

    static esp_err_t i2c_master_init(void)
    {
        int i2c_master_port = I2C_MASTER_NUM;
        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_port, &conf);
        return i2c_driver_install(i2c_master_port, conf.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0);
    }
    

    2、主机写

    在这里插入图片描述
    (1)创建一个句柄
    (2)产生起始信号
    (3)写设备地址
    (4)写数据
    (5)结束信号
    (6)主机发送命令,通知阻塞任务
    (7)删除句柄
    其中2、3、4、5属于标准i2c的流程,1、6、7属于esp32特有的。

    3、主机读

    在这里插入图片描述
    (1)创建一个句柄
    (2)产生起始信号
    (3)写设备地址
    (4)读数据
    (5)结束信号
    (6)主机发送命令,通知阻塞任务
    (7)删除句柄
    其中2、3、4、5属于标准i2c的流程,1、6、7属于esp32特有的。

    4、驱动oled

    0.96 oled只需要写数据即可,参考上面的主机写流程,对oled写代码如下:

    void I2C_WriteByte(uint8_t addr,uint8_t data)
    {
        i2c_cmd_handle_t cmd = i2c_cmd_link_create();
        i2c_master_start(cmd);
        i2c_master_write_byte(cmd, (ESP_SLAVE_ADDR << 1) | WRITE_BIT, ACK_CHECK_EN);
        i2c_master_write_byte(cmd, addr, ACK_CHECK_EN);
        i2c_master_write_byte(cmd, data, ACK_CHECK_EN);
    ?
        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("err=%d\r\n",ret);
        }
    }
    

    写数据的接口写好后,直接移植oled初始化、写数据就行;
    在这里插入图片描述

    欢迎关注微信公众号【物联网思考】,获取资料。在这里插入图片描述

    cs