通用步骤
本文档总结了 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 事务信息
SPI 事务是对一次完整 SPI 数据传输的抽象描述,包括发送缓冲区、接收缓冲区、传输长度以及相关控制信息。事务定义了主机或从机一次通信的所有参数,并由 SPI 驱动按照该结构完成数据收发。
定义事务结构体
spi_slave_transaction_t
。具体结构体成员可参考 SPI 从机驱动。
SPI 事务结构体描述的是传输参数,本身不随每次循环而变化,只需在任务或函数初始化阶段定义一次即可。
事务结构体通常定义为数组,便于在需要同时管理多个事务(例如同时发送多个缓冲区或实现队列传输)时进行批量处理和循环访问。即使只使用单个事务,也可以用长度为 1 的数组保持统一的代码风格。
定义时可以将结构体置零以确保所有字段具有确定的初始值,避免未初始化字段导致的意外行为或数据错误。
在循环中通过设置事务结构体中的成员定义相关事务参数,为后续的数据传输做准备:
每次发送或接收数据前,应根据实际需求设置或更新事务参数。
需要保证设置的发送和接收缓冲区在传输开始前已分配且有效,避免在事务执行期间修改缓冲区内容造成数据冲突或传输异常。
结构体成员
length
的单位为比特,定义时需根据字节数乘以 8。
执行事务:
备注
若需要实现异步或连续传输,可以使用 _queue_trans()
系列 API 并配合回调或轮询获取结果,提高传输效率。
暂停/重启从机
暂停从机可以确保在不使用 SPI 总线时节省能耗,同时避免接收无效数据。
调用
spi_slave_disable()
暂停 SPI 从机接口,使外设进入低功耗状态。调用
spi_slave_enable()
重新启动 SPI 从机接口,使其继续接收下一次事务。