【ESP32入门学习 五】I2S,I2C,LEDC,UART 等外设驱动的使用简析

1. UART ESP32 芯片中有三个 UART 控制器可供使用,本节分别以 UARTn 代指三个 UART 控制器,n 为0,1,2。 API 使用 ESP32的UART驱动程序时的典型工作流程: 设置通信参数 - 波特率,数据位...

1. UART

ESP32 芯片中有三个 UART 控制器可供使用,本节分别以 UARTn 代指三个 UART 控制器,n 为0,1,2。

API 使用

ESP32的UART驱动程序时的典型工作流程:

  1. 设置通信参数 - 波特率,数据位,停止位等
    有两种方法可以设置 UART 的通信参数. 一种是通过调用 uart_param_config() 在 uart_config_t 结构中提供配置参数来一次性完成.
    另一种方法是通过调用函数单独配置特定参数:
  • 波特率 - uart_set_baudrate()
  • 传输的位数 - uart_set_word_length() 指定 uart_word_length_t 的值
  • 奇偶校验控制 - uart_set_parity() 指定 uart_parity_t 的值
  • 停止位数目 - uart_set_stop_bits() 指定 uart_stop_bits_t 的值
  • 硬件流控制模式 - uart_set_hw_flow_ctrl() 指定 uart_hw_flowcontrol_t 的值
  • 通信模式 - uart_set_mode() 指定 uart_mode_t 的值
  1. 设置通信引脚 - 连接另一个 UART 的引脚
    通过调用函数 uart_set_pin() 我们可以输入宏 UART_PIN_NO_CHANGE 而不是 GPIO 引脚编号,并且不会更改当前分配的引脚. 如果不使用某个引脚,则应输入相同的宏.
  2. 驱动程序安装 - 为 UART 驱动程序分配 ESP32 的资源
    完成驱动程序配置后,我们可以通过调用 uart_driver_install() 来安装 UART 驱动. 并分配给 UART 所需的若干资源. 资源的类型/大小被指定为函数参数并需要考虑:
  • 发送缓冲区的大小
  • 接收缓冲区的大小
  • 事件队列句柄和大小
  • 用于分配中断的标志
  1. 运行 UART 通信 - 发送/接收数据
    串行通信的过程受 UART 硬件 FSM 的控制. 要发送的数据应放入 Tx FIFO 缓冲区, FSM 将序列化并发送出去. 完成类似的过程,但是以相反的顺序,接收数据. 传入的串行流由 FSM 处理并移至 Rx FIFO 缓冲区. 因此, API 的通信功能的任务仅限于向/从相应缓冲区写入和读取数据. 这反映在一些函数名称中,例如: uart_write_bytes() 用于传输数据,或 uart_read_bytes() 用于读取传入数据.

  2. 使用中断 - 触发特定通信事件的中断
    报告了 UART 的特定状态或检测到的错误有 19 个中断. ESP32 技术参考手册(PDF)中介绍了可用中断的完整列表. 要启用特定中断,请调用 uart_enable_intr_mask() ,以禁用调用 uart_disable_intr_mask() . 所有中断的掩码都以 UART_INTR_MASK 的形式提供. 使用 uart_isr_register() 完成向服务中断注册处理程序,使用 uart_isr_free() 释放处理程序. 要在调用处理程序后清除中断状态位,请使用 uart_clear_intr_status().

  3. 删除驱动程序 - 如果不再需要 UART 通信,则释放 ESP32 的资源
    如果与 uart_driver_install() 建立通信一段特定时间,然后不需要,则可以通过调用 uart_driver_delete() 来删除驱动程序以释放分配的资源.

2. LEDC

LED 控制(LEDC)模块主要用于控制 LED 的强度,尽管它也可用于生成 PWM 信号以用于其他目的。它有 16 个通道可以产生独立的波形,可以用来驱动例如: RGB LED设备。

所有 LEDC 通道中有一半提供高速操作模式。该模式提供硬件实现,自动和无干扰的 PWM 占空比改变。另一半通道在低速模式下运行,其中变化的时刻取决于应用软件。每组通道也能够使用不同的时钟源,但 API 中未实现此功能。

PWM 控制器还能够逐渐自动增加或减少占空比,允许在没有任何处理器干扰的情况下衰减。

功能概述

让 LEDC 在高速或低速模式下在特定通道上工作分三步完成:

  1. 配置定时器以确定 PWM 信号的频率和数字(占空比范围分辨率)。
    通过调用函数 ledc_timer_config() 来完成定时器的设置。应为此函数提供包含以下配置设置的数据结构 ledc_timer_config_t
  • 定时器号 ledc_timer_t 和速度模式 ledc_mode_t

  • PWM 信号的频率和 PWM 占空比值的分辨率会发生变化。

    频率和占空比分辨率是相互依赖的。PWM 频率越高,可提供更低的占空比分辨率,反之亦然。如果您计划将此 API 用于其他改变 LED 强度的目的,这种关系可能会变得很重要。

  1. 通过将通道与定时器和 GPIO 相关联来配置通道,以输出 PWM 信号。
    设置定时器后,下一步是配置所选通道 ( ledc_channel_t 中的一个)。这是通过调用函数 ledc_channel_config() 来完成的。

    以类似的方式,与定时器配置类似,应为通道设置功能提供特定结构 ledc_channel_config_t,其中包含通道的配置参数。

    此时,通道应开始工作,并开始生成由定时器设置和所选 GPIO 上的占空比确定的频率 PWM 信号,如 ledc_channel_config_t 中所配置。可以通过调用函数 ledc_stop() 随时暂停通道操作/信号生成。

  2. 更改 PWM 信号,驱动输出以改变 LED 的强度。这可以在软件的完全控制下或在硬件衰落功能的帮助下完成。有几种方法可以改变这个信号。

  • 通过软件更改PWM占空比( 先调用led_set_duty() ,然后调用 ledc_update_duty()
  • 通过硬件衰落改变PWM占空比(首先使用 ledc_fade_func_install()启用淡入淡出 ,然后调用 ledc_set_fade_with_time()配置参数 , 最后用 ledc_fade_start() 开始淡出)

3. I2C

I2C (内部集成电路)总线可用于与连接到与 ESP32 相同的总线的多个外部设备进行通信。ESP32 板上有两个 I2C 控制器,每个控制器可以设置为主模式或从模式。

功能概述

以下部分将指导您完成配置和操作 I2C 驱动程序的基本步骤:

  1. 配置驱动程序 - 选择驱动程序的参数,如主模式或从模式,设置特定的 GPIO 引脚作为 SDA 和 SCL,设置时钟速度等。
    建立 I2C 通信的第一步是配置驱动程序。这是通过设置 i2c_config_t 结构中包含的几个参数来完成的:
  • I2C 操作模式 - 从 i2c_opmode_t 中选择 slave 或 master

  • 通讯引脚配置:

    1. 分配给 SDA 和 SCL 信号的 GPIO 引脚编号
    2. 是否为各个引脚启用 ESP32 的内部上拉
  • I2C 时钟速度,如果此配置涉及主模

  • 如果此配置涉及从属模式:

  • 是否应启用 10 位地址模式

  • 从机地址
    然后,要初始化给定 I2C 端口的配置,请使用端口号和 i2c_config_t 结构作为函数调用参数调用函数 i2c_param_config()

    在此阶段,i2c_param_config() 还将“其他 I2C 配置参数”设置为常用的默认值。

  1. 安装驱动程序 - 在主站或从站模式下激活驱动程序,以便在 ESP32 上运行两个 I2C 控制器其中一个。
    初始化配置后,下一步是通过调用 i2c_driver_install() 来安装 I2C 驱动程序。此函数调用需要以下参数:
  • 端口号,可用的两个端口之一,从 i2c_port_t 中选择
    从 i2c_opmode_t 中选择的操作模式,从机或主机
  • 将分配用于在从机模式下发送和接收数据的缓冲区的大小
  • 用于分配中断的标志
  1. 进行通讯:

    1. 主机模式 - 作为主机运行通信
    2. 从机模式 - 从机响应来自主机的消息
  2. 中断处理 - 配置和 I2C 中断服务。
    调用函数 i2c_isr_register() 注册中断处理程序,调用 i2c_isr_free() 删除处理程序。ESP32技术参考手册(PDF)中提供了 I2C 控制器触发的中断描述。

  3. 超出默认值 - 调整 I2C 通信的时序,引脚配置和其他参数。
    在驱动程序配置期间(调用 i2c_param_config() 时),有一些 I2C 通信参数设置为某些默认的常用值。某些参数也已在 I2C 控制器的寄存器中配置。

  4. 错误处理 - 如何识别和处理驱动程序配置和通信错误。
    大多数驱动程序的函数在成功完成时返回 ESP_OK,或者在失败时返回特定的错误代码。始终检查返回的值并实现错误处理是一种好习惯。例如,驱动程序也打印出日志消息。检查输入配置的正确性,其中包含错误说明。有关详细信息,请参阅文件driver / i2c.c查找定义 _ERR_STR后缀。
    使用专用中断来捕获通信故障。例如,当 I2C 花费太长时间来接收数据时,会触发 I2C_TIME_OUT_INT 中断。要在通信失败时重置内部硬件缓冲区,可以使用 i2c_reset_tx_fifo() 和 i2c_reset_rx_fifo()

  5. 删除驱动程序 - 在通信结束时释放 I2C 驱动程序所使用的资源。
    如果使用 i2c_driver_install() 建立 I2C 通信一段时间之后不再需要 I2C 通信,则可以通过调用 i2c_driver_delete() 来移除驱动程序以释放分配的资源。
    I2C 驱动程序标识是从 i2c_port_t 中选择的两个端口号之一。在驱动程序配置期间通过 i2c_mode_t 选择 “master” 或 “slave” 指定端口的操作模式。

4. I2S

ESP32 包含两个 I2S 外设. 这些外设可配置为通过 I2S 驱动程序输入和输出样本数据.

I2S 标准总线定义了三种信号:时钟信号 BCK、声道选择信号 WS 和串行数据信号 SD.一个基本的 I2S 数据总线有一个主机和一个从机.主机和从机的角色在通信过程中保持不变.ESP32 的 I2S 模块包含独立的发送和接收声道,能够保证优良的通信性能.

I2S 外设支持 DMA,这意味着它可以传输使用样本数据流,而无需 CPU 读取或写入每个样本.

I2S 输出也可以直接路由到数字/模拟转换器输出通道(GPIO 25 和 GPIO 26),直接产生模拟输出,而不是通过外部 I2S 编解码器.

  • 发表于 2020-09-11 16:39
  • 阅读 ( 121 )

0 条评论

请先 登录 后评论
淡若清风
淡若清风

35 篇文章

作家榜 »

  1. 淡若清风 35 文章
  2. 杨杨 2 文章
  3. seaky 0 文章
  4. 15139236712 0 文章
  5. selectcc 0 文章
  6. 温志亮 0 文章
  7. jamesfan007 0 文章
  8. Gavin 0 文章