S2-05 ESP-IDF开发 : SPI

SPI

SPI 是由摩托罗拉(Motorola)公司开发的全双工同步串行总线,是微处理控制单元(MCU)和外围设备之间进行通信的同步串行端口。主要应用在EEPROM、Flash、实时时钟(RTC)、数模转换器(ADC)、网络控制器、MCU、数字信号处理器(DSP)以及数字信号解码器之间。SPI 系统可直接与各个厂家生产的多种标准外围器件直接接口,一般使用4 条线:串行时钟线SCK、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOSI 和低电平有效的从机选择线SSEL。

SPI 的优势和缺点

SPI的优势:
  1. 全双工,高速率传输 ,比如比I2C 传输速率更高
  2. 推免输出接口,推挽输出接口能够减少走线分叉
  3. 信号完成性强,通信协议灵活
  4. 消息帧可任意调节
  5. 功耗低,电路简单 ,不需要上拉电阻,功耗可以更低
  6. 软件配置简单
SPI的缺点:
  1. 单一主设备号通常只能支持一个主设备号
  2. 传输距离短,一般只适合板内信号传输
  3. 缺少硬件检查协议,没有硬件级别的错误检查协议
  4. 无法内部寻址,多从设备时需要额外的片选信号线

SPI信号线介绍

SPI总线包括4条信号逻辑线,定义如下
MISO: Master inout slave output 主机输入,从机输出(数据来自从机)
MOSI: Master output slave input 主机输出,从机输出(数据来自主机)
SCLK: serial Clock 串行时钟信号,由主机产生发送给从机
CS: 片选信号,由主机发送,以控制与那个从机通信,通常时低电平为有效信号
在这里插入图片描述

SPI 接线方式

spi接线方式分别由二种分别是常规的独立从机配置和菊花链配置

1. 常规的独立从机配置

常规的独立从机配置,每个从机都需要一条单独的CS线,当主机要更特定的从机通信时,将相应的CS信号线拉低,并保持其他CS信号线为高,同时因为从机的MISO脚,再同一条信号上,因此要求没有被选择的从机的MISO引脚要配置为高组态输出
在这里插入图片描述

常规独立主从接线法是指 SPI 总线上每个从设备都被主设备独立控制,每个从设备都有一个独立的 CS 信号,用于选择需要通信的从设备。其优势包括:

  • 灵活性高:每个从设备可以独立控制,不受其他从设备的影响,可以根据需要选择通信对象。
  • 易于调试:每个从设备之间相互隔离,可以方便地进行单独调试和故障排除。
  • 速度快:由于没有菊花链中的额外延迟,可以实现更快的数据传输速度。
2. 菊花链配置

我们一般以信号线以串行的方式从一个设备依次传到下一个设备,直到数据到达目标设备的数据传输方式称为菊花链。
菊花链缺点:如果从机出现单点故障时,那么低于该设备优先级的从机就掉线了,距离主机越远的从机获得服务的优先级就越低。所以需要设置总线检测器,并安排好从机的优先级。如果某个从机超时应及时处理,放置单点故障造成整个链路的崩溃。菊花链充分的使用了SPI移位寄存器的功能,每个从机在下一个时钟周期,将输入数据复制到输出。
在这里插入图片描述

菊花链接线法是指每个从设备的输出都连接到下一个从设备的输入,形成一条串行链。在菊花链中,只有一个 SS 信号控制整个链路的通信,具有以下优势:

  • 引脚占用少:使用菊花链连接方式时,每个设备只需要使用一个信号线就可以完成数据传输,节省了系统中的引脚资源。
  • 成本低:相对于常规独立主从接线法来说,菊花链的 PCB 布线更简单,也更容易集成和实现。

菊花链的缺点是当链路中任何一个从设备故障或者通信失败时,整个链路都无法正常工作,因此需要注意菊花链的稳定性和可靠性。

SPI配置模式

SPI总线通信中的时钟相位和极性是指Master设备在传输数据时生成的SCLK时钟信号的特性。其主要作用是提供同步时钟信号,以确保Master和Slave设备之间数据传输的精确性和可靠性。

  • 时钟极性(CPOL):CPOL定义了时钟的空闲状态,即当SCLK处于空闲状态时,是高电平还是低电平。可以设置为0或1,用于匹配Slave设备的SCK极性。
  • 时钟相位(CPHA):CPHA定义了时钟沿的位置,即数据采样和传输的时机。可以设置为0或1,用于匹配Slave设备的数据采样时间。

具体来说,时钟相位和极性可分为四种情况:

  1. CPOL=0,CPHA=0:第一帧位数据是在SCK拉低的时候写入,在上升沿读出;
  2. CPOL=0,CPHA=1:第一帧数据在上升沿写入,下降沿读出;
  3. CPOL=1,CPHA=0:第一帧数据在SCK拉高的时候写入,下降沿读出
  4. CPOL=1,CPHA=1:第一帧数据在下降沿写入,上升沿读出
    在这里插入图片描述

这些理解即可,不用死记硬背,数据文档中都有

SPI 总线通讯协议

SPI 是一种通信通信的总线协议,数据线根据不同的配置,在时钟的上升沿(电平从低到高)或下降沿(从高到低)进行采样spi通信的时序如下1.主机先将对应从机的CS信号拉低,通知从机开始建立连接,数据接收端检测到时钟的边沿信号后,就立即开始读取数据线上的信号

SPI是全双工的,主机在发送数据的同时也在接收数据,主机可以通过查询的方式,来判断从机是否由数据需要发送,如果由主机会继续发送数据。来获取从机想要的发送的数据。之后从机只需要丢掉这些无效数据 (Dummy Data) 就可以了。
在这里插入图片描述

协议变体

然而,在实际应用中,很少出现同时发送和接受的情况,一般都是Master先发送命令或是地址,然后Slave发送数据。下图是SPI读写Flash存储器的时序。具体图中如Instruction等,就是操作Flash存储器所需要的形式。简单来说,实现对Flash存储器的通信,需要发送指令码、地址码、模式码、Dummy周期、数据码五个阶段,Flash厂商的芯片手册中有指令集描述每条指令所需要的通信格式。
在这里插入图片描述

因此对于SPI协议,出现了许多适应性的变体。

1. 三线 SPI

三线SPI仅有CS、SCLK以及IO口三条线,也就是将MOSI和MISO两线并成一条半双工数据线,所以三线SPI也可称为半双工SPI协议。其Interface如下:
在这里插入图片描述

2. Dual SPI

SPI 被创建之后,虽然传输速率有了很大的提升,但是还是无法满足贪婪人类的欲望,但是时钟频率又不能无限提升,所以就额外增加线路传输数据,如果多一根线的话,每次就能传2个bit的数据。所以Dual SPI就是将SPI的MOSI和MISO都改成双向IO口。
在这里插入图片描述
在这里插入图片描述

3. Quad SPI

在Dual SPI基础上,再增加两个IO口,就能实现每次4bit数据的传输,即 SPI 改。
在这里插入图片描述在这里插入图片描述

4. SDR 与 DDR 模式

上面给出的时序都是SDR模式(Single Data Rate),每个时钟周期只有1bit的数据。在此基础上,如果每个时钟沿都进行数据输出,就能在一个时钟周期内实现2bit数据的传输,也就称之为DDR(Double Data Rate)。
在这里插入图片描述
Fdatabase%2F785%3A1&pos_id=img-MIdTp8Lx-1705804518389)

5. Octal SPI

这是对SPI的一次魔改,目前理解就认为Quad SPI等只是在SPi基础上增加位宽而已,所以也还有一种八倍SPI (Octal SPI)。但这些变体过于变态,个人认为已经不能称之为串口通信了!

Octal SPI是SPI(Serial Peripheral Interface)的一种扩展标准,也叫做“8线串行接口”或者“8位SPI”。与传统的SPI接口相比,Octal SPI接口采用八个数据线进行并行数据传输,可以实现更高的数据传输速率和带宽。

Octal SPI接口具有以下特点:

  • 高速传输:Octal SPI接口采用8位并行传输,每个对应的数据线上都可以传输数据,最高速度可达到800Mbps,在高速通信场景下具有较大的优势。
  • 大带宽:由于Octal SPI接口可以同时传输8个数据位,因此在保证速度的情况下,它可以实现更大的带宽,可以满足一些大数据传输的需求。
  • 低功耗:Octal SPI接口可以使用节能模式,在传输数据时关闭一些不必要的电路部分,以降低功耗,这在移动设备等移动终端产品中非常有用。
  • 可靠性强:由于Octal SPI接口采用了并行传输,相比传统的SPI接口,其抗干扰能力更强,传输过程中数据不容易出错,可以提高传输的可靠性。
  • 兼容性良好:Octal SPI接口采用了SPI接口的标准协议,与现有的SPI接口兼容。因此,现有的SPI应用程序可以很容易地进行移植和使用。

Octal SPI接口在一些高速、大带宽和低功耗的应用场合下非常有用,比如移动终端产品、音频和视频处理器、图像传感器、存储芯片等。但同时也需要注意,Octal SPI接口需要更多的信号线和复杂的硬件电路支持,设计难度较大,成本也相应增加。

ESP32 的 SPI

ESP32-S3 集成了 4 个 SPI 外设。

  • SPI0,供 ESP32-S3 和加密 DMA (EDMA) 访问封装内或封装外 flash/PSRAM
  • SPI1,供 CPU 访问封装内或封装外 flash/PSRAM
  • SPI2,通用 SPI 控制器,具有单独的 DMA 通道
  • SPI3,通用 SPI 控制器,和部分外设共用一个 DMA 通道

SPI0 和 SPI1 特性:

  • 支持单线、双线、四线、八线 SPI 模式
  • 八线 SPI 模式支持单倍数据速率 (SDR) 和双倍数据速率 (DDR)
  • 时钟频率可配置,八线 SPI SDR/DDR 模式下最高可达 120 MHz
  • 数据传输以字节为单位

SPI2 特性:

  • 支持主机或从机模式
  • 具有单独的 DMA 通道
  • 支持单线、双线、四线、八线 SPI 模式
  • 时钟极性 (CPOL) 和相位 (CPHA) 可配置
  • 时钟频率可配置
  • 数据传输以字节为单位
  • 读写数据位序可配置:最高有效位 (MSB) 优先,或最低有效位 (LSB) 优先
  • 主机模式
    • 支持双线全双工通信,时钟频率最高可达 80 MHz
    • 八线 SPI 全双工模式仅支持单倍数据速率 (SDR)
    • 支持单线、双线、四线和八线半双工通信,时钟频率最高可达 80 MHz
    • 八线 SPI 半双工模式支持单倍数据速率(最高 80 MHz)和双倍数据速率(最高 40 MHz)
    • 支持 Moto6800/I8080/并行 RGB 接口 8 位 LCD 驱动
    • 具有六个 SPI_CS 管脚,可与六个独立 SPI 从机相连
    • CS 建立和保持时间可配置
  • 从机模式
    • 支持双线全双工通信,时钟频率最高可达 60 MHz
    • 支持单线、双线和四线半双工通信,时钟频率最高可达 60 MHz
    • 八线 SPI 全双工和半双工模式仅支持单倍数据速率 (SDR)

SPI3 特性:

  • 支持主机或从机模式
  • 与 ADC 和 DAC 外设共用一个 DMA 通道
  • 支持单线、双线、四线、八线 SPI 模式
  • 八线 SPI 模式仅支持单倍数据速率 (SDR)
  • 时钟极性 (CPOL) 和相位 (CPHA) 可配置
  • 时钟频率可配置
  • 数据传输以字节为单位
  • 读写数据位序可配置:最高有效位 (MSB) 优先,或最低有效位 (LSB) 优先
  • 主机模式
    • 支持双线全双工通信,时钟频率最高可达 80 MHz
    • 支持单线、双线和四线半双工通信,时钟频率最高可达 80 MHz
    • 支持 1 位 LCD 驱动
    • 具有三个 SPI_CS 管脚,可与三个独立 SPI 从机相连
    • CS 建立和保持时间可配置
  • 从机模式
    • 支持双线全双工通信,时钟频率最高可达 60 MHz
    • 支持单线、双线和四线半双工通信,时钟频率最高可达 60 MHz

下表给出了与 SPI 主驱动器相关的术语:

属于 定义
Host(主机) ESP32-S3 内部的 SPI 控制器外设,通过总线启动 SPI 传输,并充当 SPI 主机。
Device(设备) SPI 从设备。SPI 总线可以连接到一个或多个设备。每个设备共享 MOSI、MISO 和 SCLK 信号,但仅当主机断言设备的单独 CS 线时才在总线上处于活动状态。
Bus(总线) 连接到一个主机的所有设备共用的信号总线。通常,总线包括以下线路:MISO、MOSI、SCLK、一条或多条 CS 线路,以及可选的 QUADWP 和 QUADHD。所以设备连接到相同的线路,除了每个设备都有自己的 CS 线路。如果以菊花链方式连接,多个设备也可以共享一条 CS 线。
MOSI Master Out,Slave In,从主机到设备的数据传输。也是八进制/OPI 模式下的 data0 信号。
MISO Master In,Slave Out,从设备到主机的数据传输。也是八进制/OPI 模式下的 data1 信号。
SCLK 串行时钟。主机生成的时钟信号,使数据位传输保持同步。
CS 片选信号,允许主机选择连接到总线的单个设备以发送或接收数据。
QUADWP 写入模式信号。用于 4 位 (qio/qout) 通讯。也适用于 Octal/OPI 模式下的 data2 信号。
QUADHD 读取模式信号。用于 4 位 (qio/qout) 通讯。也适用于 Octal/OPI 模式下的 data3 信号。
DATA4 八进制/OPI 模式下的 Data4 信号。
DATA5 八进制/OPI 模式下的 Data5 信号。
DATA6 八进制/OPI 模式下的 Data6 信号。
DATA7 八进制/OPI 模式下的 Data7 信号。
Assertion(片选) 激活 CS 线连接的设备,当片选信号被拉低(也就是置为“0”)时,表示该设备被选中,可以与主控器进行数据传输。
De-Assertion(反选) 将 CS 线连接的设备设置为非活动状态,当片选信号被拉高(也就是置为“1”)时,表示该设备不被选中,不能与主控器进行数据传输。
Transaction(事务) 是指一组在特定的时间段内完成的SPI数据传输操作。在一个Transaction中,通常包含了一次对某个从设备(Slave)的读写操作,并且这次读写操作完成之后,从设备与主控器之间的数据传输也就结束了。
Launch edge(传输沿) 在Master端在时钟线(SCLK)上发送一次特定信号来启动一个数据传输周期的边缘。Master在该边缘上发送启动信号,Slave通过接收到启动信号开始执行数据传输过程。
Latch edge(接收沿) 在Slave端采样数据的边缘。在SPI通信中,数据在SCLK信号上跟随Master从高位到低位或从低位到高位移位,而数据的采样则是在每个SCLK的下降沿或上升沿进行的。Latch Edge就是指Slave在这个边缘上对数据进行采样,然后将采样到的数据传递给Master端。

设备特性

SPI 主驱动程序管理主机与设备的通信。该驱动程序支持以下功能:

  • 多线程环境
  • 读取和写入数据时对 DMA 透传
  • 来自同一信号总线上不同设备的数据的自动时分复用

注意:
SPI 主驱动器具有多个设备连接到单个总线的概念(共享单个 ESP32-S3 SPI 外设)。只要每个设备仅由一个任务访问,驱动程序就是线程安全的。但是,如果多个任务尝试访问同一个 SPI 设备,则驱动程序不是线程安全的。在这种情况下,建议:

  • 构建一个独立任务访问 SPI 设备,其他需要使用 SPI 设备的都通过任务通讯方式操作。
  • 使用为共享设备添加互斥锁 xSemaphoreCreateMutex

SPI事务

SPI 总线事务由五个阶段组成,可在下表中找到。这些阶段中的任何一个都可以跳过。

<
阶段 标题 描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值