ESP32 SPI外设介绍
ESP32共有4组SPI:SPI0,SPI1,HSPI和VSPI。其中SPI0固定用于从片外Nor Flash读取用户程序代码,SPI1与SPI0使用相同的引脚,负责向片外Flash中写入数据。HSPI和VSPI是可以供用户随意使用。
SPI Transactions定义
一次完整的SPI通信过程包括5个阶段
- 发送命令(0~16比特)(可选)
- 发送地址(0~64比特)(可选)
- 写数据
- 空等待(可选,通常用来匹配某个固定的时序)
- 读数据
GPIO Matrix与IOMUX的差别
ESP32几乎所有外设的信号都有自己专用的IO引脚,称为IOMUX;同时ESP32也支持将这些外设信号通过GPIO互联矩阵引到非IOMUX的引脚上。
- 使用GPIO互联矩阵的时候,信号频率不能超过40MHz
- 使用IOMUX的时候,信号频率可以达到80MHz
引脚名字 | HSPI | VSPI |
---|---|---|
CS0 | 15 | 5 |
SCLK | 14 | 18 |
MISO | 12 | 19 |
MOSI | 13 | 23 |
QUADWP | 2 | 22 |
QUADHD | 4 | 21 |
spi_master驱动
spi_master驱动的特点:
- 多线程
- DMA方式传输数据
- 多路复用(支持一个master同时外挂多个slave)
- 使用流程
- 初始化SPI总线:
spi_bus_initialize
,在bus_config结构体中指定SPI外设信号需要连接的引脚,如果有些信号不需要,就填-1- 向总线注册SPI从设备:
spi_bus_add_device
,在dev_config结构体中指定好时序参数(这一步结束后将得到该设备的操作句柄)- 与从设备之间的IO操作有两种方式
- 把transaction丢进队列中
spi_device_queue_trans
,然后通过spi_device_get_trans_result
来获取传输的结果- 使用
spi_device_transmit
完成transaction并等待结束,返回结果- 卸载从设备
spi_bus_remove_device
- 释放总线
spi_bus_free