ESP32 学习笔记(九)SPI - SPI Slave

SPI Slave

概述

SPI0 专用于闪存缓存,ESP32 用于将连接的 SPI 闪存设备映射到存储器中。 SPI1 连接到相同的硬件线.ESP32有四个SPI外围设备,称为SPI0,SPI1,HSPI和VSPI。 SPI0用于写入闪存芯片。 HSPI和VSPI可以免费使用,通过spi_slave驱动程序,这些可以用作SPI从设备,由连接的SPI主设备驱动。

spi_slave 驱动

spi_slave驱动程序允许将HSPI和/或VSPI外设用作全双工SPI从器件。 它可以利用DMA来发送/接收任意长度的事务。

术语

spi_slave 驱动程序使用以下术语:

  • 主机:ESP32内部的SPI外设启动SPI传输。 SPI,HSPI或VSPI之一。 (目前,驱动程序实际上只支持HSPI或VSPI;它将在未来的某个地方支持所有3个外设。)
  • 总线:SPI总线,与连接到一个主机的所有SPI设备共用。通常,总线由味噌,mosi,sclk和可选的quadwp和quadhd信号组成。 SPI从设备并联连接到这些信号。
    • miso - 也称为q,这是将串行流输入到ESP32中
    • mosi - 也称为d,这是来自ESP32的串行流的输出
    • sclk - 时钟信号。每个数据位在该信号的正或负边沿输出或输出
    • cs - 芯片选择。 有效芯片选择描述与从属设备之间的单个事务。
  • 事务:一个CS活动的实例,来自和/或发生的设备的数据传输,以及CS再次变为非活动状态。事务是原子的,因为它们永远不会被另一个事务中断。

SPI transactions

全双工SPI事务从主机拉低CS开始。 发生这种情况后,主机开始在CLK线上发出时钟脉冲:每个时钟脉冲使数据位在MOSI线上从主机移位到从机,反之亦然在MISO线上。 在交易结束时,主机再次使CS成为高电平。

使用 spi_slave 驱动

通过调用spi_slave_initialize将SPI外设初始化为从器件。 确保在bus_config结构中设置正确的IO引脚。 注意将不需要的信号设置为-1。 如果事务将大于32字节,则必须给出DMA通道(1或2),否则dma_chan参数可能为0。
要设置事务,请使用您需要的任何事务参数填充一个或多个spi_transaction_t结构。 通过调用spi_slave_queue_trans对所有事务进行排队,稍后使用spi_slave_get_trans_result查询结果,或者通过将它们提供给spi_slave_transmit来同时处理所有请求。 后两个函数将阻塞,直到主服务器启动并完成一个事务,导致排队的数据被发送和接收。
可选:要卸载SPI从驱动程序,请调用spi_slave_free。

传输数据和主/从机长度不匹配

通常,要传输到设备或从设备传输的数据将从事务结构的rx_buffertx_buffer成员指示的一块存储器中读取或写入。 SPI驱动程序可能决定使用DMA进行传输,因此应使用pvPortMallocCaps(size,MALLOC_CAP_DMA)在具有DMA功能的内存中分配这些缓冲区。

写入缓冲区的数据量受到事务结构的length成员的限制:驱动程序永远不会读取/写入比那里指示的数据更多的数据。长度不能定义SPI事务的实际长度;这是由主机驱动时钟和CS线路决定的。传递后,可以从spi_slave_transaction_t结构的trans_len成员读取传输的实际长度。在传输长度大于缓冲区长度的情况下,仅发送和接收传输的开始,并且将trans_len设置为长度而不是实际长度。如果需要trans_len,建议设置长度超过预期的最大长度。如果传输长度短于缓冲区长度,则只交换长度达到缓冲区长度的数据。

警告:由于 ESP32 的设计特性,如果主机发送的字节数或从驱动器中传输队列的长度(以字节为单位)不大于8且可分为4,则 SPI 硬件可以无法将最后一个写入七个字节到接收缓冲区。

应用示例

主/从机通信:peripherals/spi_slave.

API Reference

Header File

猜你喜欢

转载自blog.csdn.net/qq_27114397/article/details/81625466
SPI