跳至正文

Verilog功能模块–SPI主机和从机(01)–SPI简介

前言

在嵌入式系统和数字电路设计中,高效可靠的通信协议至关重要。SPI(Serial Peripheral Interface)作为一种广泛应用的同步串行接口,以其简单高效的特性成为芯片间通信的首选方案之一。本文将深入解析SPI协议的核心原理,为后续实现Verilog SPI主从机模块奠定基础。

一、什么是SPI?

参考:串行外设接口 – 维基百科,自由的百科全书

SPI(Serial Peripheral Interface,串行外设接口)是一种由Motorola(现NXP半导体)开发的全双工同步串行通信协议。它采用主从架构,使用简单的四线制接口实现高速数据传输。

SPI是一种事实标准,也就是说这种规范没有对应的技术标准(注意,SPI是规范,而不是标准。)。因此各个厂家生产的SPI器件配置可能不一样,不一定有互操作性。

二、SPI的发展历史

2.1 发展历史

时期 关键事件/技术 核心创新/特性 性能/应用场景
1980年代
(起源:Motorola时代)
MC68HC11系列微控制器 (1985) • 首次集成SPI接口
• 四线制设计(SCLK, MOSI, MISO, SS)
• 主从架构
• 无固定协议层(数据格式灵活)
• 替代并行总线
• 简化外设连接(EEPROM、ADC等)
速度:1-5 MHz
1990年代
(标准化与普及)
行业采纳
(Intel/TI/Microchip)
• 成为Flash、传感器、RTC标准接口
• 取代部分I2C场景(速度更高)
• **De facto标准1**(厂商遵循Motorola规范)
JEDEC JESD206 (1998) 定义SPI Flash
• 广泛应用在嵌入式存储与传感领域
2000-2010年
(性能飞跃与变种)
Dual-SPI (2003) • MOSI/MISO双向传输
半双工,带宽翻倍
• 适配高分辨率ADC/TFT屏幕需求
Quad-SPI (QSPI) (2006) 4条数据线并行传输(IO0-IO3)
• 支持XIP(外部Flash直接运行代码)
带宽达400 MB/s
• 大容量NOR Flash应用
SPI Mode扩展 • Mode 0-3(CPOL/CPHA组合)覆盖更多时序 • 兼容多样设备(传感器、存储器等)
2010年至今
(现代演进与IoT爆发)
Octal-SPI (2016) 8数据线传输
• 支持DDR(双沿触发)
时钟频率 >200 MHz
吞吐量 >400 MB/s(如Macronix MX66)
• 用于ADAS、AI边缘设备
JEDEC xSPI (JESD251) • 标准化QSPI/OCTAL-SPI • 高带宽存储接口规范
IoT优化 <1 μA待机电流(如Bosch BME280传感器)
• WLCSP封装SPI Flash
• 可穿戴设备/低功耗传感器
• 汽车电子(NXP S32V)
• AI权重加载(i.MX RT系列)

注意:

  1. De facto标准,这里的De facto是拉丁文短语,意思是 “事实上的”“实际的”。它指的是现实中存在并被广泛接受的状态或事物,即使它没有经过官方、法律或正式标准的程序来确立。De facto标准是描述这种非正式但实际通行标准的标准术语

2.2 关键补充说明

  1. 性能对比:原始SPI:1-5 MHz → QSPI:400 MB/s → Octal-SPI:>400 MB/s(DDR模式)
  2. 协议演进:单线标准SPI → 双线Dual-SPI四线Quad-SPI八线Octal-SPI
  3. 行业驱动:1980s:简化硬件设计 → 2000s:高分辨率显示/存储需求 → 2010s+:AI/IoT/汽车电子

2.3 关键技术演进图谱

基础SPI (1980s, 摩托罗拉推出)  
  │
  ├── Dual-SPI (2003) → 带宽×2 (双数据线)  
  │
  ├── Quad-SPI (2006) → 带宽×4 (四数据线, 主流Flash接口)  
  │
  └── Octal-SPI (2016) → 带宽×8 + DDR模式 (八数据线, 双倍数据速率)  
      │
      └── xSPI标准 (JESD251, 2018) → 协议统一化 (JEDEC标准化, 支持Octal/Quad-SPI + DDR)

三、SPI的优缺点与应用场景

3.1 SPI优缺点对比

分类 特性 具体说明 备注/影响
优点 全双工通信 支持数据同时发送(MOSI)与接收(MISO) 提升数据传输效率
无寻址机制 通过硬件片选信号(CS/SS)直接选择从机 简化连接逻辑,但需占用更多GPIO引脚
灵活的数据帧 数据长度可配置(通常4-16位,部分控制器支持32位) 适应不同外设需求(如ADC、EEPROM)
高速传输 时钟频率可达 10-100 MHz(依赖硬件性能) 远超I2C(通常≤3.4MHz)、UART
硬件实现简单 核心逻辑仅需移位寄存器+时钟控制器 降低IC设计复杂度,易集成于MCU
缺点 4线制通信 需SCLK/MOSI/MISO/SS四根信号线 比I2C(2线)、UART(2线)
占用更多PCB空间
仅支持单主模式 同一总线上只允许一个主机控制通信 多主机场景需额外设计总线仲裁机制
无错误校验 协议层无CRC、奇偶校验等机制 数据可靠性依赖应用层校验
无流控与应答机制 从机无法主动暂停传输或确认数据接收 主机无法感知从机状态(如缓冲区满),
可能丢失数据
短距离通信限制 有效传输距离通常 <30cm(10MHz)(高速模式下更短) 长距离需加驱动芯片,否则易受干扰

3.2 SPI应用场景

应用领域 典型器件 特点
存储器件 Flash, EEPROM, FRAM 高速编程/读取
传感器 加速度计, 陀螺仪, 温度传感器 实时数据采集
显示控制器 OLED, LCD, TFT屏 高刷新率数据传输
通信模块 WiFi, 蓝牙, 以太网控制器 配置寄存器与数据交换
数据转换器 ADC, DAC 低延迟采样数据传输
实时时钟 RTC模块 低功耗时间信息传输

四、SPI的工作原理

4.1 SPI信号组成与输出数据的移位寄存器模型

信号线名称 英文全称 功能描述
SCLK Serial Clock 主机产生的同步时钟信号,用于控制数据传输时序
MOSI Master Out Slave In 主机输出、从机输入的数据线
MISO Master In Slave Out 从机输出、主机输入的数据线
SS/CS Slave Select/Chip Select 低电平有效的从机选择信号,每个从机需独立的片选线

注:

  • **主机(Master)**:控制通信时序,产生时钟信号
  • **从机(Slave)**:响应主机指令,无时钟生成能力
  • 多从机实现:通过独立的SS信号选择目标从机

SPI输出数据的移位寄存器模型

主机的MOSI引脚由连接主机的移位寄存器最高位,从机的MISO引脚连接从机的移位寄存器最高位。

一般来说,在SS/CS的下降沿,主机和从机的移位寄存器更新/锁存待发送数据。然后在每个SCLK有效移位边沿,主机和从机的移位寄存器进行一次移位,如此在一个SPI周期内输出数据。

4.2 SPI架构

SPI采用主从机制,SPI发送和接收都由主机发起,从机响应,其它说明如下:

4.2.1 一主一从架构

4.2.2 一主多从架构(独立片选)

SCLK、MOSI、MISO多从机共用,具体和哪一个从机通信,由片选信号SS_N控制。

SPI规范并没有定义SPI从机的最大数量,理论上可以多达几十个,每增加一个从机需要主机增加一个GPIO引脚作为片选控制。

此架构下,主机同时只能和其中一个从机通信,所以,此架构可认为是一主一从架构的分时通信版本。从机数越多每个从机能分到的通信时间就越短,实际应用需要重点考虑通信速度问题。

4.2.3 一主多从架构(菊花链)

SPI菊花链(Daisy-Chaining)是一种通过移位寄存器原理串联多个SPI从设备的拓扑结构,仅占用主机1个片选引脚即可控制任意数量从机,大幅节省GPIO资源。

此SPI菊花链架构等价于所有从机的移位寄存器模型相互串联

每个从机内部相当于一个移位寄存器。主机发送的数据流依次通过所有从机,每个从机在SCLK时钟边沿执行:

  1. 读取MOSI输入的数据位
  2. 将上一周期锁存的数据位推到MISO输出

所以,对于一个3从机的SPI菊花链,主机在第一个SCLK周期发送1bit,从机3在第3个周期才能收到。而从机1在第一个周期发送1bit,主机在第3个周期才能收到。如果认为单从机的通信延迟为0,那么N个从机的SPI菊花链,通信延迟就是N-1。

五、SPI的工作模式与时序解析

5.1 SPI工作模式

SPI工作模式由时钟极性(CPOL)时钟相位(CPHA) 组合确定:

模式 CPOL CPHA 时钟空闲状态 数据采样边沿 数据变化边沿
0 0 0 低电平 上升沿 下降沿
1 0 1 低电平 下降沿 上升沿
2 1 0 高电平 下降沿 上升沿
3 1 1 高电平 上升沿 下降沿

关键概念解析

  • CPOL=0:时钟空闲状态为低电平
  • CPOL=1:时钟空闲状态为高电平
  • CPHA=0:在第一个时钟边沿采样数据
  • CPHA=1:在第二个时钟边沿采样数据

5.2 SPI数据传输过程

不同模式的SPI数据传输波形图如下:

  1. 起始条件:主机拉低CS信号,表示通信开始

  2. 数据更新

    特别注意第一个SHIFT,表示首次数据更新,

    对于CPHA=1的模式,采样在第二个时钟边沿,那么更新可以在第一个时钟边沿;

    对于CPHA=0的模式,采样在第一个时钟边沿,那么更新就需要在CS的下降沿。

    一种更通用的策略是,始终在CS下降沿更新数据,此时当CPHA=1时,在第一个SCLK边沿不更新数据

  3. 数据采样:模式0和模式3,在SCLK上升沿采样;模式1和模式2,在SCLK下降沿采样

  4. 数据顺序:MSB(最高位)先传输

  5. 结束条件:主机拉高SS信号,结束本次通信

5.3 SPI时序参数

因为SPI模式0和模式3是最常见的,而模式1和模式2相对少见,所以,这里以模式0和模式3为例,解释一下SPI中通用的几个时序参数。

SPI模式0的传输时序如下图所示。以最常见的单个SPI通信周期传输8bit为例。

时序参数:

  1. TCC:表示CS下降沿到SCLK第一个边沿的时间。通常CS的下降沿是最高位数据更新的时刻,而对于模式0,第一个SCLK的边沿是上升沿,也是第一次采样数据的时刻,所以,此参数是给主从机更新MSB即最高位数据留出时间。一般手册中都是规定TCC的最小值。
  2. TSCLK:表示SCLK的周期。一般手册会给出SCLK的最高支持频率即fSCLK的最大值,这对应TSCLK的最小值。
  3. TCCH:表示最后一个SCLK边沿到CS上升沿的时间。最后一个SCLK边沿可能是LSB即最低位数据的采样时刻(模式0不是这样,模式3是这样),而采样时刻后数据必须在一定时间内保持稳定也就是满足寄存器的保持时间要求,CS拉高后,芯片不使能,数据引脚(MOSI和MISO)都会在一定时间内变为高阻态(Z),所以,此参数是给主从机采样LSB留出时间。一般手册中都是规定TCCH的最小值。
  4. TCWH:表示CS高电平的持续时间。CS低电平使能数据传输,而CS高电平时,数据接口相关寄存器可能需要复位,或者芯片其它部分需要在CS高电平器件进行工作,所以,手册中都会规定CS高电平的最短持续时间即TCWH的最小值。

其它参数:

  1. SCLK的高电平时间和低电平时间,这些其实包含在参数SCLK周期中,建议总是采用50%占空比,这样当满足TSCLK时,会自动满足这两个参数要求。

  2. TDOHD:输出旧数据保持时间,数据更新边沿到旧数据仍然有效的时间**,数据更新并不是瞬时完成的,需要一段时间,这段时间可分为三个部分,第一部分旧数据不变,第二部分数据正在变化,第三部分新数据有效,此参数就是表示第一部分旧数据在更新边沿后仍保持不变的时间,一般手册给的是最小值。

  3. TDOPD:输出新数据有效延时,数据更新边沿到新数据有效的延迟时间,一般手册会给出此时间的最大值,读取时刻必须是新数据有效之后。通常这个时间不会超过半个SCLK周期,如果此时间超过半个SCLK周期了,那么还采用上升沿读,下降沿写这种策略就可能读到旧数据,这时就需要延后读,如前一个下降沿写,后一个下降沿读(旧数据有一段保持时间TDOHD)这样留出足够的时间给新数据更新完成,才能确保读取正确。

  4. tDIST:输入数据建立时间,数据需要保持稳定直到读取边沿的时间,只关注最小值,这个值通常很小,取决于读取侧器件的性能,但一般<10ns。

  5. tDIHD:输入数据保持时间,读取边沿后数据还需要保持稳定的时间,只关注最小值,这个值通常很小,取决于读取侧器件的性能,但一般<10ns。

下图所示为SPI模式3的读写时序。与模式0不同的是,模式3更新MSB有两种情况:

  1. 在CS下降沿更新,这是我更推荐的方式,此时第一个SCLK边沿不更新数据。
  2. 在SCLK第一个边沿更新,不推荐,时序更紧张。

注意模式3几个时序参数表示的时间段含义,与模式0是一致的。

六、三线SPI

上文将的一直是4线SPI,但因为SPI没有标准,很多厂家为了进一步减少连接,开发了3线SPI,对于不同的芯片,三线SPI的引脚构成可能是不同的,常见的有以下几种:

6.1 三线SPI——CS_N常低

一些芯片可以将CS_N引脚接GND,只用SCLK来控制数据传输,此结构仅支持一主一从,电路结构如下图所示。我们熟知的AD7606B/C中就支持这种三线SPI的硬件串行读取方式。

6.2 三线SPI——MOSI与MISO合并为DIO

一些芯片(如AD9249),将MOSI与MISO合并为一根线DIO,称为数据输入输出线,支持半双工的双向数据传输,电路结构如下图所示。一般来说工作过程是CS_N拉低,然后发送SCLK时钟,前几个时钟周期主机通过DIO发送数据,后几个时钟周期主机通过DIO接收数据。

因为保留了使能线CS_N,所以这种结构是可以和4线SPI或其他这种结构的三线SPI共用SCLK线和数据线的(主机需控制数据IO的方向)。

6.3 三线SPI——仅MOSI无MISO

一些芯片(如MAX5402),只需要数据输入,不需要数据输出,一般这种是功能很简单的芯片,仅需要接收主机的输出数据即可,即仅需单向通信,电路结构如下图所示。

七、Dual-SPI、Quad-SPI与Octal-SPI

基础的SPI是应用最广泛的,但速度并不算快,通常SCLK的最高频率不超过100MHz,难以适配一些高速场景。因此,后续一些公司基于基础SPI进行了数据带宽升级,发明了Dual-SPI、Quad-SPI与Octal-SPI,我们一起了解一下。

7.1 Dual-SPI(双线SPI)

技术特点:通过复用2条双向数据线(IO0/IO1),传输速率较标准SPI提升2倍,保持低引脚占用(仅需CS、SCLK、2条数据线)。

典型芯片是一些NOR FLASH,如GD25D40C,兆易创新,引脚图如下:

此芯片支持SPI/Dual模式切换,从封装上就可以看出,普通的SPI由CS#、SCLK、SI、SO构成,Dual SPI还是这四根线,只是SI、SO变为了IO1、IO2,由原本的全双工变为半双工,这样当只需要读或写,而不需要同时读写时,速度就变为了原来的两倍。

7.2 Quad-SPI(四线SPI)

技术特点:扩展至4条数据线(IO0-IO3),速率达标准SPI的4倍;

典型的还是NOR FLASH芯片,且部分芯片支持双倍数据速率(DDR)和内存映射(XIP)模式,可直接执行外部闪存代码,显著提升系统响应速度。

代表芯片:Winbond W25Q系列(如W25Q64),其SOIC-8封装如下图所示。

其中,IO0、IO1、IO2、IO3为复用引脚。

在QSPI工作模式下,芯片可进行半双工读写,速度为普通SPI的4倍;如果再使能DDR,即在时钟上升沿和下降沿都进行数据读写,速度就变为普通SPI的8倍。

7.3 Octal-SPI(八线SPI)

技术特点:通过8条数据线并行传输,带宽可达Quad-SPI的2倍;支持xSPI协议(如JEDEC JESD251),集成RWW(同时读写)功能,适用于超高速数据流。

典型的还是NOR FLASH芯片,如W35T02NW,Winbond,其封装(TFBGA)如下图所示。

可见,IO0~IO7是八条数据线。此芯片同样支持DDR,那么速度就可以是普通SPI的 8X2 = 16倍。

7.4 小结

Dual-SPI、Quad-SPI与Octal-SPI的应用目前绝大部分还是局限于FLASH和RAM等存储器件中,Dual-SPI和Quad-SPI较为流行,一般的FPGA和ARM都支持,而Octal-SPI则比较高端,仅部分高端芯片支持。

注意,Dual-SPI、Quad-SPI与Octal-SPI其实有些“名不副实“,SPI是串行外设接口的意思,而这些扩展的SPI因为数据线不止一根,按串/并通信的分类,应归类到并行接口了。

八、SPI的PCB布线设计关键点

对于SPI,在PCB布线时需要有哪些考虑呢?

  1. 根据SPI的时序,主机写数据是基于SCLK的,所以需要保证CS_N、SCLK与MOSI走线等长,这样主机所有控制的写入时序到达从机侧是保持不变的

    对于低速SPI(<10MHz),不需要考虑怎么PCB布线,连上就没问题;

    对于高速SPI(>50MHz),不等长就可能存在时序问题,并且等长是没有代价的,所以,一种必定正确的做法是总是保证CS_N、SCLK与MOSI等长

  2. 从时序来看,MISO是越短越好。假如主机设计在SCLK上升沿写数据,下降沿读数据,且MISO长度为0,这时从机也是SCLK上升沿写数据,那么主机在SCLK下降沿读数据就必然满足建立时间和保持时间的要求。

    但实际MISO不可能长度为0,所以,应该怎么做呢?答案是保证MISO与CS_N、SCLK、MOSI也等长。这对于SPI/Dual-SPI可切换的芯片是必须的,因为在Dual-SPI模式下,MISO和MOSI一同作为总线传输数据;但对于普通SPI,MISO等长与否没有什么实际意义,但还是应该等长,不用考虑那么多,等长至少美观一点且必定正确。

  3. 是否需要走线阻抗控制(50Ω)和源端串联电阻呢?这其实是高速信号消除信息反射时考虑的问题,本质上是评估信号上升/下降时间对应的等效波长与PCB上物理线长的关系。

    • 公式: 临界长度 L_critical ≈ (Tr / 6) / Tpd_per_length
    • Tr:信号的 10%-90% 上升时间(单位:秒)。这是最关键参数! 现代微控制器即使工作在低频,其IO驱动器的上升时间也可能非常快(低至1-2ns甚至更快)。
    • Tpd_per_length:信号在PCB走线上的传播延迟(单位:秒/米)。FR4板材中约为 5.0 – 5.6 ns/m (约等于 5.08 ns/m 或 1.55 – 1.77 in/ns)。
    • 高速SPI的L_critical = 1ns / 6 / 5ns/m = 1/30m = 3.3cm。

    所以说,上升沿太快时,走线就尽量短。当走线物理长度 > 临界长度L_critical时,就需要走线阻抗控制(50Ω)并添加源端串联电阻,各位同学可根据公式自行评估。

  4. 一般来说,SPI每个引脚都是推挽输出,是不需要上下拉电阻的。但有时为了保证从机侧确定的初始电平、SPI的稳定性或提升主机驱动能力,会有一些SPI从机器件有添加上下拉电阻的要求,具体参考SPI从机器件数据手册,没特别说明时,不需要任何上下拉电阻。

综上,SPI在PCB设计时,建议如下:

  1. 保持所有线等长;
  2. 根据上升沿和物理走线关系决定是否阻抗控制(50Ω)和添加源端串联电阻;
  3. 是否添加上下拉电阻,参考SPI从机数据手册。

九、总结与分享

SPI协议凭借其全双工高速传输硬件实现简单灵活的数据帧配置,成为嵌入式系统中最核心的芯片间通信方案之一。其主从架构通过专用片选(CS)信号直接选通从机,避免了复杂的寻址机制,显著提升实时性。然而,SPI也存在局限性:无内置错误校验(需应用层实现CRC)、多从机扩展需大量GPIO引脚,且传输距离受限(通常<30cm)。

深入理解SPI的四种工作模式(CPOL/CPHA组合)和时序参数(如建立/保持时间)是设计可靠接口的关键。尤其在高速场景(>50MHz)下,需严格遵循PCB等长布线规则,并评估信号完整性需求。

在本系列后续文章中,我们将基于这些原理,使用Verilog实现完整的SPI主控制器和从机接口模块。

本文参考资料:

  1. S12SPIV3 SPI Block Guide V03.06 INXP SPI规范 2001.pdf
  2. S12SPIV4 MC9S12XDP512 Device User Guide V2.05 NXP 2004.pdf
  3. SPI培训PPT NXP 2020.pdf

欢迎大家关注我的微信公众号:徐晓康的博客,回复以下6位数字获取网盘链接。

014569

建议复制过去不会码错字!


如果本文对你有所帮助,欢迎点赞、转发、收藏、评论让更多人看到,赞赏支持就更好了。

如果对文章内容有疑问,请务必清楚描述问题,留言评论或私信告知我,我看到会回复。


徐晓康的博客持续分享高质量硬件、FPGA与嵌入式知识,软件,工具等内容,欢迎大家关注。

0 0 投票数
文章评分
订阅评论
提醒
0 评论
内联反馈
查看所有评论
目录
0
希望看到您的想法,请您发表评论x