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 就改好了。
最终效果如下：

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

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

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

Copy
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 外设使用的全流程，是旧版本写法，新版本已经废弃，不过因为新版写法死活用不了，所以我最后还是用旧版。
下面是实际代码：

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

那么今天就到这里，886.