ashwatermelon

ashwatermelon

ESP-IDF学习笔记第二节:I2C

我又来了,这节我们讲怎么用 ESP32 的 I2C 外设并移植江科大的 OLED 代码。
首先江科大的 OLED 代码是软件 I2C,这边先说一下软件 I2C 怎么移植。
我们要动的文件主要就是 OLED.c 和 OLED_Font.h 两个文件。
首先是 OLED.c,这个文件我们主要就是更改初始化 OLED_I2C_Init () 函数以及 OLED_W_SCL (x) 和 OLED_W_SDA (x) 两个宏定义。
我们先导入 "driver/gpio.h" 头文件(上节忘记提了),根据 OLED_I2C_Init () 原本的初始化内容,初始化两个引脚,一个 SCL 一个 SDA,都配置为开漏输出上拉模式。
然后 OLED_W_SCL (x) 和 OLED_W_SDA (x) 两个宏定义则由原来的 GPIO_WriteBit () 改为 gpio_set_level () ,这样 OLED.c 就改好了。
最终效果如下:

image

然后我们要动 OLED_Font.h 文件,就是要把里面的二维数组的每一组给加好大括号,不知道为什么要这么搞,但编译器就是要你这么做()

image

完成这些后代码就移植完毕了,下面我来说一下 I2C 外设怎么用。
首先 ESP-WROOM-32 有且仅有一个 I2C 外设,引脚定义图如下:

image

也就是 22 号引脚为 SCL,21 号引脚为 SDA。
那么怎么配置 I2C 外设呢?
首先我们要配置 i2c_config_t 结构体,这个结构体包括下面这些参数:
I2C_CONFIG_ST.clk_flags
时钟选择

I2C_CONFIG_ST.master.clk_speed
时钟速度

I2C_CONFIG_ST.mode
I2C模式(主机从机)

I2C_CONFIG_ST.scl_io_num
SCL引脚号码

I2C_CONFIG_ST.scl_pullup_en
是否使用SCL引脚内部上拉

I2C_CONFIG_ST.sda_io_num
SDA引脚号码

I2C_CONFIG_ST.sda_pullup_en
是否使用SDA引脚内部上拉

配置好结构体后调用 i2c_param_config () 函数初始化 I2C。
然后我们调用 i2c_driver_install () 安装 I2C 驱动。
接着我们调用 i2c_cmd_link_create () 创建 I2C 指令缓存区,并用一个 i2c_cmd_handle_t 变量储存句柄。
然后我们用 i2c_master_start () 开始 I2C,用 i2c_master_write_byte () 和 i2c_master_read_byte () 进行读和写。
最后我们用 i2c_master_stop () 结束 I2C,用 i2c_master_cmd_begin () 把缓存区的指令发送出去,然后 i2c_cmd_link_delete () 清楚缓存区。

这就是 I2C 外设使用的全流程,是旧版本写法,新版本已经废弃,不过因为新版写法死活用不了,所以我最后还是用旧版。
下面是实际代码:

image

仍然是在江科大源码基础上改的,把软件部分修改成硬件。
下面是最终效果:

IMG20250913152059

那么今天就到这里,886.

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。