SPI Master
SPI Master
概述
ESP32 有四个 SPI 外设,称为 SPI0,SPI1,HSPI 和 VSPI. SPI0 是专用于 flash 缓存, ESP32 将连接的 SPI flash 设备映射到存储器. SPI1 和 SPI0 使用相同的硬件线,SPI1 用于外部 flash 芯片. HSPI 和 VSPI 可以任意使用. SPI1,HSPI 和 VSPI 都有三条片选线,作为 SPI 主机允许它们最多驱动三个 SPI 设备.
spi_master 驱动
即使在多线程环境中,spi_master 驱动程序也可以轻松与 SPI 从设备进行通信. 它完全透明地处理 DMA 传输以读取和写入数据,并自动处理同一主机上不同 SPI 从站之间的多路复用.
术语
spi_master 驱动程序使用以下术语:
- 主机:ESP32 内部的 SPI 外设启动 SPI 传输. SPI,HSPI 或 VSPI 之一. (目前,驱动程序实际上只支持 HSPI 或 VSPI;它将在未来的某个地方支持所有 3个外设.)
- 总线:SPI总线,与连接到一个主机的所有 SPI 设备共用.通常,总线由 miso,mosi,sclk 和可选的 quadwp 和 quadhd 信号组成. SPI 从设备并联连接到这些信号.
- miso - 也称为 q,这是将串行流输入到 ESP32中
- mosi - 也称为 d,这是来自 ESP32 的串行流的输出
- sclk - 时钟信号.每个数据位在该信号的正或负边沿输出或输出
- quadwp - 写保护信号.仅用于 4 位(qio/qout)事务.
- quadhd - 保持信号.仅用于 4 位(qio/qout)事务.
- 设备:SPI 从设备.每个 SPI 从设备都有自己的片选(CS)线,当发生到/从 SPI 从设备的传输时,该线被激活.
- 事务:一个 CS 活动的实例,来自和/或发生的设备的数据传输,以及 CS 再次变为非活动状态.事务是原子的,因为它们永远不会被另一个事务中断.
SPI transactions
SPI 总线上的事务由五个阶段组成,其中任何阶段都可以跳过:
- 命令阶段. 在此阶段,命令(0-16 位)被输出.
- 地址阶段. 在此阶段,地址(0-64 位)被输出.
- 写阶段. 主设备将数据发送到从设备.
- 虚拟阶段. 该阶段是可配置的,用于满足时序要求.
- 阅读阶段. 从站将数据发送给主站.
在全双工模式下,读写阶段被组合,SPI 主机同时读写数据.总事务长度由 command_bits + address_bits + trans_conf.length
决定,而 trans_conf.rx_length
仅确定接收到缓冲区的数据长度.
在半双工模式下,主机具有独立的写和读阶段.写入阶段和读取阶段的长度分别由 trans_conf.length
和 trans_conf.rx_length
决定.
命令和地址阶段是可选的,因为不是每个 SPI 设备都需要发送命令和/或地址.这反映在设备配置中:当 command_bits
或 address_bits
字段设置为零时,不执行命令或地址阶段.
读写阶段的情况类似:并非每个事务都需要写入数据以及要读取的数据.当 rx_buffer
为 NULL(并且未设置 SPI_USE_RXDATA
)时,将跳过读取阶段.当 tx_buffer
为 NULL(并且未设置 SPI_USE_TXDATA
)时,将跳过写入阶段.
Interrupt transactions
中断事务将阻塞事务例程,直到事务完成为止,从而使CPU可以运行其他任务。
当事务在传输中时,中断事务使用中断驱动的逻辑。程序将被阻塞,允许 C