ESP32 SPI外设介绍

ESP32共有4组SPI:SPI0,SPI1,HSPI和VSPI。其中SPI0固定用于从片外Nor Flash读取用户程序代码,SPI1与SPI0使用相同的引脚,负责向片外Flash中写入数据。HSPI和VSPI是可以供用户随意使用。

SPI Transactions定义

一次完整的SPI通信过程包括5个阶段

  1. 发送命令(0~16比特)(可选)
  2. 发送地址(0~64比特)(可选)
  3. 写数据
  4. 空等待(可选,通常用来匹配某个固定的时序)
  5. 读数据

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驱动的特点:

  1. 多线程
  2. DMA方式传输数据
  3. 多路复用(支持一个master同时外挂多个slave)
  • 使用流程
  1. 初始化SPI总线:spi_bus_initialize,在bus_config结构体中指定SPI外设信号需要连接的引脚,如果有些信号不需要,就填-1
  2. 向总线注册SPI从设备:spi_bus_add_device,在dev_config结构体中指定好时序参数(这一步结束后将得到该设备的操作句柄)
  3. 与从设备之间的IO操作有两种方式
    1. 把transaction丢进队列中spi_device_queue_trans,然后通过spi_device_get_trans_result来获取传输的结果
    2. 使用spi_device_transmit完成transaction并等待结束,返回结果
  4. 卸载从设备spi_bus_remove_device
  5. 释放总线spi_bus_free