I2C (内部集成电路)总线可用于与连接到与 ESP32 相同的总线的多个外部设备进行通信。ESP32 板上有两个 I2C 控制器,每个控制器可以设置为主模式或从模式。
以下部分将指导您完成配置和操作 I2C 驱动程序的基本步骤:
I2C 驱动程序标识是从 i2c_port_t
中选择的两个端口号之一。在驱动程序配置期间通过 i2c_mode_t
选择 “master” 或 “slave” 指定端口的操作模式。
建立 I2C 通信的第一步是配置驱动程序。这是通过设置 i2c_config_t
结构中包含的几个参数来完成的:
i2c_opmode_t
中选择 slave 或 master然后,要初始化给定 I2C 端口的配置,请使用端口号和 i2c_config_t
结构作为函数调用参数调用函数 i2c_param_config()
。
在此阶段,i2c_param_config()
还将“其他 I2C 配置参数”设置为常用的默认值。要检查值是什么以及如何更改它们,请参阅超出默认值。
初始化配置后,下一步是通过调用 i2c_driver_install()
来安装 I2C 驱动程序。此函数调用需要以下参数:
i2c_port_t
中选择i2c_opmode_t
中选择的操作模式,从机或主机安装 I2C 驱动程序后,ESP32 即可与其他 I2C 设备通信。通信编程取决于所选 I2C 端口是以主机模式还是从机模式工作。
ESP32 工作在主机模式的 I2C 端口负责与从 I2C 设备建立通信,并发送命令以触发从机设备工作,如进行测量和发回结果。
为了组织这个过程,驱动程序提供了一个称为 “command link” 的容器,该容器应填充一系列命令,然后传递给 I2C 控制器执行。
构建 I2C 主设备向从设备发送 n 个字节的命令链接的示例如下所示:
下面介绍如何设置“主写入”的命令链接以及内部的内容:
i2c_cmd_link_create()
创建命令链接。然后命令链接填充一系列要发送给从站的数据:
i2c_master_start()
i2c_master_write_byte()
。该地址作为此函数调用的参数提供。i2c_master_write()
的参数。i2c_master_stop()
i2c_master_write_byte()
和 i2c_master_write()
命令都有另外的参数来定义 slave 是否应该确认接收的数据。
2. 通过调用 i2c_master_cmd_begin()
来触发 I2C 控制器执行命令链接。
3. 最后一步,完成命令发送后,通过调用 i2c_cmd_link_delete()
释放命令链接使用的资源。
在读取数据时,不是 “i2c_master_read …”,而是使用 i2c_master_read_byte()
和/或 i2c_master_read()
填充命令链接。此外,最后一次读取配置为不提供主机的确认。
发送从机地址后,请参见上图中的步骤 3,主机可以写入或从从机读取数据。主设备实际执行的操作信息隐藏在从设备地址的最低位。
因此,命令链接指示从机主机将写入数据包含地址,如 (ESP_SLAVE_ADDR << 1)| I2C_MASTER_WRITE
,如下所示:
API 提供了从属设备读取和写入数据的功能 - * i2c_slave_read_buffer()
和 i2c_slave_write_buffer()
。peripherals/i2c中提供了使用这些功能的示例。
调用函数 i2c_isr_register()
注册中断处理程序,调用 i2c_isr_free()
删除处理程序。ESP32技术参考手册(PDF)中提供了 I2C 控制器触发的中断描述。
在驱动程序配置期间(调用 i2c_param_config()
时,请参阅配置驱动程序),有一些 I2C 通信参数设置为某些默认的常用值。某些参数也已在 I2C 控制器的寄存器中配置。通过调用专用函数,可以将这些参数更改为用户定义的值:
i2c_set_period()
i2c_set_start_timing()
/ i2c_set_stop_timing()
i2c_set_data_timing()
i2c_set_timeout()
定时值在 APB 时钟周期中定义。APB 的频率在
I2C_APB_CLK_FREQ
中指定。
i2c_set_data_mode()
可在 i2c_trans_mode_t
中定义的模式中选择上述每个函数都有一个_get_
对应项来检查当前设置的值。
要在驱动程序配置期间查看参数设置的默认值,请参阅文件driver / i2c.c查找定义了_DEFAULT
后缀。
通过功能i2c_set_pin()
,还可以选择不同的 SDA 和 SCL 引脚并改变上拉配置,改变已经输入的 i2c_param_config()
。
ESP32 的内部上拉电阻范围为几十 kOhm,因此在大多数情况下,它们本身不足以用作 I2C 上拉电阻。我们建议添加外部上拉电阻,其值如 I2C 标准中所述。
大多数驱动程序的函数在成功完成时返回 ESP_OK
,或者在失败时返回特定的错误代码。始终检查返回的值并实现错误处理是一种好习惯。例如,驱动程序也打印出日志消息。检查输入配置的正确性,其中包含错误说明。有关详细信息,请参阅文件driver / i2c.c查找定义 _ERR_STR后
缀。
使用专用中断来捕获通信故障。例如,当 I2C 花费太长时间来接收数据时,会触发 I2C_TIME_OUT_INT
中断。有关相关信息,请参阅中断处理。
要在通信失败时重置内部硬件缓冲区,可以使用i2c_reset_tx_fifo()
和i2c_reset_rx_fifo()
。
如果使用 i2c_driver_install()
建立 I2C 通信一段时间之后不再需要 I2C 通信,则可以通过调用 i2c_driver_delete()
来移除驱动程序以释放分配的资源。
I2C 主机和从机示例:peripherals/i2c.