通用步骤

[English]

本文档总结了 ESP-IDF 中 SPI 外设的通用实现流程,涵盖关键的外设配置、初始化及常用操作,为不同示例提供统一的实现参考。

掌握该文档内容有助于快速理解 SPI 外设的核心使用流程,便于在不同应用中复用公共代码。

配置/初始化 SPI 总线

在使用 SPI 外设前,需要先完成总线配置,用于:

  • 绑定引脚:指定 SPI 总线的信号线对应的 GPIO 引脚,包括时钟线 (SCLK)、主输出/从输入 (MOSI)、主输入/从输出 (MISO) 和片选线 (CS)。

  • 分配硬件资源:在主机模式下,初始化总线会分配 DMA、寄存器和中断资源,以支持高效的数据传输;从机模式下, SPI 控制器会准备状态寄存器和缓冲区以接收/发送数据。

spi_bus_config_t 是 ESP-IDF 提供的 SPI 总线配置结构体,用于在初始化 SPI 总线时统一设置各项属性。具体结构体成员可参考 SPI 驱动程序

对于 SPI 主机模式,在构建 spi_bus_config_t 结构体后,还需要调用 spi_bus_initialize(),将配置应用到 SPI 控制器并分配硬件资源,才能正常进行数据传输。API 功能描述和参数说明可参考 SPI 主机驱动。 对于 SPI 从机模式,通常只需构建 spi_bus_config_t 结构体完成总线配置,SPI 控制器在初始化从机接口时会使用这些参数。

配置/初始化 SPI 接口

在完成 SPI 总线配置后,需要针对主机或从机的具体接口进行配置,定义逻辑通信参数,使控制器能够正确识别和处理设备间的数据传输。

对于 SPI 主机模式,接口配置用于定义与总线上每个从机设备通信的参数,包括时钟速度、SPI 模式(时钟极性和相位)、片选控制和事务队列长度。

  • 定义设备句柄:类型为 spi_device_handle_t, 用于标识和管理 SPI 总线上注册的从设备,并在主机模式下通过该句柄发起事务或配置设备参数。

  • 配置接口参数spi_device_interface_config_t 是 ESP-IDF 提供的 SPI 设备接口配置结构体,用于统一设置设备通信属性。具体结构体成员可参考 SPI 主机驱动程序

  • 初始化接口:调用 spi_bus_add_device() 将设备配置应用到已初始化的 SPI 总线上,使主机能够与设备进行数据传输。具体说明和传参可参考 SPI 主机驱动程序

对于 SPI 从机模式,接口配置用于设置从机参数,使 SPI 从机能够识别主机发起的传输、管理事务队列并正确处理收发数据。

  • 配置从机接口参数spi_slave_interface_config_t 是 ESP-IDF 提供的 SPI 从机接口配置结构体,用于统一设置从机通信属性。具体结构体成员可参考 SPI 驱动程序

  • 初始化接口:调用 spi_slave_initialize() 应用从机接口配置,使 SPI 控制器分配必要硬件资源(寄存器、缓冲区、DMA 通道等),确保从机能够接收并响应主机的通信。具体说明和传参可参考 SPI 驱动程序

SPI 事务信息

SPI 事务是对一次完整 SPI 数据传输的抽象描述,包括发送缓冲区、接收缓冲区、传输长度以及相关控制信息。事务定义了主机或从机一次通信的所有参数,并由 SPI 驱动按照该结构完成数据收发。

  1. 定义事务结构体 spi_slave_transaction_t。具体结构体成员可参考 SPI 从机驱动

  • SPI 事务结构体描述的是传输参数,本身不随每次循环而变化,只需在任务或函数初始化阶段定义一次即可。

  • 事务结构体通常定义为数组,便于在需要同时管理多个事务(例如同时发送多个缓冲区或实现队列传输)时进行批量处理和循环访问。即使只使用单个事务,也可以用长度为 1 的数组保持统一的代码风格。

  • 定义时可以将结构体置零以确保所有字段具有确定的初始值,避免未初始化字段导致的意外行为或数据错误。

  1. 在循环中通过设置事务结构体中的成员定义相关事务参数,为后续的数据传输做准备:

  • 每次发送或接收数据前,应根据实际需求设置或更新事务参数。

  • 需要保证设置的发送和接收缓冲区在传输开始前已分配且有效,避免在事务执行期间修改缓冲区内容造成数据冲突或传输异常。

  • 结构体成员 length 的单位为比特,定义时需根据字节数乘以 8。

  1. 执行事务:

  • 对于 SPI 主机模式,可通过调用 spi_device_transmit() 发起一次 SPI 事务并等待完成。该 API 为阻塞调用,会等待事务完成后才返回,适合需要同步发送和接收数据的场景。进一步介绍及参数说明可参考 SPI 主机驱动

  • 对于 SPI 从机模式,可通过调用 spi_slave_transmit() 发起一次 SPI 事务并等待完成。该 API 同样为阻塞调用,直到主机完成一次事务才返回,用于同步收发数据。进一步介绍及参数说明可参考 SPI 从机驱动

备注

若需要实现异步或连续传输,可以使用 _queue_trans() 系列 API 并配合回调或轮询获取结果,提高传输效率。

暂停/重启从机

暂停从机可以确保在不使用 SPI 总线时节省能耗,同时避免接收无效数据。

  1. 调用 spi_slave_disable() 暂停 SPI 从机接口,使外设进入低功耗状态。

  2. 调用 spi_slave_enable() 重新启动 SPI 从机接口,使其继续接收下一次事务。