SPI通信电路深度解析:从协议原理到ZLinear数据采集卡的实战设计

http://www.z-linear.com

前言

大家好,我是ZLinear的硬件工程师。

在数据采集系统中,SPI(Serial Peripheral Interface)串行外设接口可以说是应用最广泛的通信协议之一。从ADC采集、DAC输出、Flash存储到FRAM参数存储,再到与W5100S以太网芯片的通信,SPI几乎贯穿了整个采集卡的核心数据通路。

但很多工程师在设计SPI电路时往往会遇到以下问题:SCK频率跑不上去导致采样率受限、多从设备片选冲突、信号完整性差导致误码、SPI模式选择错误导致通信失败......这些问题看似基础,却常常成为项目推进的"拦路虎"。

今天,我们就结合 ZLinear DABL_G511 数据采集卡 及其衍生系列(DABL7606、DABL7689、DABM-D223)的硬件和代码设计,来深度拆解SPI串行通信电路------从协议原理到实战设计,带你彻底搞懂SPI。


一、SPI协议快速回顾

1.1 四线制与全双工

SPI是一种同步全双工的串行通信协议,由Motorola公司推出。一个典型的SPI主从连接需要4根信号线:

信号 方向(主->从) 功能说明
SCKSCLK 主→从 串行时钟,由主机产生
MOSI 主→从 主机输出,从机输入数据线
MISO 从→主 主机输入,从机输出数据线
CS / SS / NSS 主→从 片选信号,低电平有效,选中从机

SPI的全双工特性意味着在每个时钟周期内,主机可以通过MOSI发送一位数据,同时从机通过MISO返回一位数据。这与I2C的半双工模式有本质区别。

1.2 时钟极性与相位

SPI有4种工作模式(Mode 0~3),由 CPOL(时钟极性)CPHA(时钟相位) 组合决定:

SPI模式 CPOL CPHA 说明
Mode 0 0 0 SCK空闲为低电平,第1个边沿(上升沿)采样数据
Mode 1 0 1 SCK空闲为低电平,第2个边沿(下降沿)采样数据
Mode 2 1 0 SCK空闲为高电平,第1个边沿(下降沿)采样数据
Mode 3 1 1 SCK空闲为高电平,第2个边沿(上升沿)采样数据

选型注意事项 :不同从机对SPI模式的要求不同。例如,AD7689 ADC要求SPI Mode 0或Mode 3,而W5100S支持Mode 0和Mode 3。在DABL_G511的代码分析中,我们采用Mode 3作为默认模式。

1.3 多从器件的连接方式

SPI总线可以挂载多个从机,但每个从机需要独立的CS信号。所有从机的SCK、MOSI、MISO可共享总线(MISO需要从机输出高阻支持),MCU通过分别拉低不同的CS引脚来选择目标从机。

复制代码
复制代码
         ┌──────────┐
         │   MCU    │
         │ (Master) │
         └────┬─────┘
       MOSI──┼──────────────────→ MOSI (所有从机共享)
       MISO──┼──────────────────→ MISO (所有从机共享)
       SCK───┼──────────────────→ SCK  (所有从机共享)
              │
              ├─ CS1 ─────→ 从机1 CS引脚
              ├─ CS2 ─────→ 从机2 CS引脚
              └─ CS3 ─────→ 从机3 CS引脚

二、SPI通信电路的硬件设计要点

2.1 信号完整性

SPI是一种同步串行总线,但速度较高时(比如STM32F407的SPI1可达42Mbps),信号反射、串扰、地弹等问题必须重视。

  • 匹配阻抗:在SCK、MOSI走线上串联22Ω~33Ω的阻尼电阻,抑制过冲和振铃。
  • 最短路径:SPI走线必须按时钟线最短、数据线次之的原则,避免过长线缆引入反射。
  • 地平面连续:SPI信号下方必须有连续的地平面,减少回路电感。
  • 远离干扰源:远离晶振、DC-DC电感等高频强干扰区域。

2.2 上拉与电平匹配

大多数SPI从机在MISO输出上是推挽输出,不需要上拉;但有些从机(如Flash存储器)的MISO可能是开漏输出,需要外部上拉。

电平匹配方面,如果MCU是3.3V系统,但从机是5V容忍,需要检查从机输入逻辑电平阈值。STM32F407的I/O多数是5V容忍的(但建议查看数据手册),若从机输出仍为5V,最好加入电平转换芯片或分压电阻。

2.3 多从机的MISO总线冲突

多个从机共享MISO线时,最重要的是每个从机的MISO输出必须是三态(高阻) 的------当片选无效时,从机必须释放MISO线,否则多个输出会打架。现代SPI器件都满足这一要求,但设计时仍需检查数据手册。


三、产品实战:ZLinear DABL_G511的SPI总线架构

3.1 总体SPI分配

翻开 DABL_G511 的硬件设计文档,我们可以看到其主控STM32F407VET6的SPI资源被充分利用:

SPI外设 连接目标 速率/模式 功能
SPI1 AD7606/AD7689(ADC) 21Mbps(Mode 3) 8通道同步或复用ADC数据读取
SPI2 Flash(N25Q128A)+ FRAM(MB85RS16) 低速(8位模式) 大容量存储与关键参数存储
SPI3 扩展接口(预留) 未使用 可用于外部扩展
SPI(复用) W5100S(以太网芯片) 70MHz max(Mode 3) 网络通信(硬件TCP/IP协议栈)

关于SPI1的设计选择 :DABL_G511定位为通用型/隔离型采集卡,其ADC采用8通道同步采样 模式(AD7606),每个通道都有独立的采样保持电路,通过SPI1读取16/24位转换结果。SPI1的时钟频率在代码中设置为 21MHz(来自《DABL7689核心代码解析》),对于16位数据来说,21MHz下读取8个通道仅需约6μs,能够轻松应对40kSPS的全通道同步采集。

3.2 SPI1:ADC数据的高速通道

从DABL_G511的操作系统代码(以及DABL7606/7689代码分析)可以看到,ADC数据的读取采用了 DMA + SPI 的架构,实现零CPU开销的高速搬运:

复制代码
复制代码
// ADC转换完成中断(EXTI2下降沿触发)中启动SPI DMA读取
void EXTI2_IRQHandler(void)
{
    // ... 中断处理 ...
    HAL_SPI_Receive_DMA(&hspi1, (uint8_t*)ad7606Data, 8);  // 8通道数据
}

这种设计的关键在于:ADC转换完毕后,硬件自动触发中断,中断中直接启动SPI DMA传输,MCU不需要轮询等待,数据传输由DMA在后台完成。这是工业级采集卡实现"不丢帧"的核心保障之一。

SPI1的硬件连接要点

  • 片选(NSS)控制:使用GPIO软件控制CS引脚(PA4),而非硬件NSS,以便灵活管理多从设备。
  • SCK频率:21MHz,略超AD7689的最大SCK 20MHz,但在实际测试中稳定可靠。
  • CS拉低与第一SCK之间留有足够延时,确保从机准备就绪。

3.3 SPI2:存储器读写

SPI2用于连接板载的 N25Q128A Flash (16MB)和 MB85RS16 FRAM(16Kbit)。这两个存储器共用SPI2总线,但CS引脚不同。

Flash用于大容量历史数据记录,其SPI时钟频率通常设为21MHz(从代码分析可见,DABL7606的SPI2在8位模式下工作)。写操作需遵循Flash擦除-写入的管理方式。

FRAM 用于存储校准参数、设备配置等关键数据,其特点是读写速度极快(纳秒级)、几乎无限次写入寿命(10¹²次)。因此,每次修改参数时可以直接改写FRAM的任意字节,无需像Flash那样先擦除一大块。

多从机处注意事项:Flash和FRAM的MISO均是三态输出,CS无效时自动高阻,所以可以共用MISO线。

3.4 W5100S:硬件网络协议栈的SPI接口

W5100S是WIZnet公司的硬件TCP/IP协议栈芯片,通过SPI与MCU交互。根据W5100S的数据手册和实战笔记,其SPI帧格式与普通SPI外设有所不同:

W5100S SPI帧格式

复制代码
复制代码
[控制字节] [地址高8位] [地址低8位] [数据...]
 控制字节:0x0F = 读操作,0xF0 = 写操作

SPI模式 :W5100S支持 Mode 0 和 Mode 3,DABL_G511中配置为 Mode 3(CPOL=1, CPHA=1)。

多字节突发传输:W5100S与W5100相比,最大的改进是支持连续N字节的突发读写,极大提高了网络数据吞吐量。在《W5100S实战入门》笔记中也强调了:"W5100S相比前代W5100的最大改进就是支持多字节突发传输,这个功能必须用起来。"

电路设计注意:W5100S的SCK最高支持70MHz,但在DABL_G511中考虑到布线长度,实际设置为21MHz左右,配合良好的PCB布局,完全满足百兆以太网的吞吐需求。

3.5 代码中的SPI配置(以SPI1为例)

摘自DABL7689核心代码解析:

复制代码
复制代码
// SPI1初始化(AD7689 ADC通信)
SPI_InitStruct.BaudRatePrescaler = LL_SPI_BAUDRATEPRESCALER_DIV2;  // 42MHz/2=21MHz
SPI_InitStruct.CLKPhase = LL_SPI_PHASE_2EDGE;                       // CPHA=1
SPI_InitStruct.CLKPolarity = LL_SPI_POLARITY_HIGH;                  // CPOL=1
SPI_InitStruct.BitOrder = LL_SPI_MSB_FIRST;                         // 高位先发
SPI_InitStruct.DataWidth = LL_SPI_DATAWIDTH_16BIT;                  // 16位数据
LL_SPI_Init(SPI1, &SPI_InitStruct);
LL_SPI_SetStandard(SPI1, LL_SPI_PROTOCOL_MOTOROLA);

重点解读

  • 21MHz 是在42MHz总线时钟下二分频得到,虽然略超AD7689典型20MHz限值,但在实际项目中经过验证稳定可靠。
  • MSB First 是SPI的惯例。
  • 16位数据宽度 对应ADC每通道转换结果的位宽。
  • Mode 3(CPOL=1, CPHA=1)与AD7689要求的模式一致。

四、SPI设计的"三大纪律八项注意"

4.1 三大纪律

  1. CS片选必须严格管理:拉低CS前确保总线空闲;传输结束后等待足够时间再拉高CS,防止从机仍在输出数据时CS变化。
  2. 时钟极性极性必须与从机匹配:仔细阅读每个从机的数据手册,确认CPOL和CPHA的要求。同一个MCU上挂载多个从机时,可能需要为不同从机在传输前动态调整SPI寄存器配置(如果从机模式不同)。
  3. 上拉/下拉电阻不要忽略:对于某些从机,在CS无效时需要MISO固定电平(如内部无上拉),否则可能产生浮空输入导致漏电或误触发。

4.2 八项注意

  1. 差分/隔离SPI:如果SPI走线需要远距离传输(如外接隔离ADC),必须使用差分转接芯片或隔离器(如ISO7242),并在隔离两侧各加去耦电容。
  2. DMA优先:尽量使用DMA进行SPI数据传输,使MCU能并行处理其他任务。
  3. 双缓冲/环形缓冲:在高速采集时,SPI DMA接收缓冲区应使用双缓冲(乒乓机制),避免缓冲区被填满前CPU来不及处理。
  4. SCK频率不能盲目求高:过高的频率可能导致信号完整性下降、误码率升高,尤其当PCB布线较长或从机驱动能力不足时。
  5. 检查从机的时序要求:比如从机在CS有效后需要等待若干时钟才准备好、或传输结束后需要保持CS有效一段时间。不要忽略这些细节。
  6. MISO冲突检查:确保所有共享MISO的从机在不被选中时输出高阻。
  7. 调试时使用逻辑分析仪:在开发初期,用逻辑分析仪抓取SCK、MOSI、MISO和CS波形,是定位SPI通信问题的最高效手段。
  8. 利用硬件的NSS脉冲模式:STM32的SPI外设支持NSS脉冲模式(NSSP),可在每个帧传输结束后自动产生脉冲,简化CS控制。但在多个从机场景下,仍然建议用GPIO软件控制CS。

五、常见问题与排查方法

问题现象 可能原因 排查步骤
SPI读取数据全为0xFF或0x00 片选未正确拉低、从机未供电、时钟极性/相位不匹配 用示波器检查CS、SCK、MOSI引脚电平
数据移位(错位) 字节/位顺序不匹配(LSB First vs MSB First)、数据宽度设置错误 检查CPOL/CPHA和BitOrder
偶发误码 信号完整性差(振铃、串扰)、SCK频率过高 降低SCK频率、加阻尼电阻、优化走线
多从机中一个可以通信,另一个不行 第二个从机的CS引脚未初始化、MIO输出冲突 检查GPIO配置,确认从机MISO是否三态
传输速率远低于预期 未使用DMA、使用软件模拟SPI、SPI时钟分频过大 改用DMA、提高SPI时钟分频值

六、总结

SPI串行通信电路,是工业数据采集卡中最核心的数据通路。从ADC的高速同步采集,到Flash的历史数据存储,再到W5100S的网络通信,SPI承担着数据收发的重担。

通过拆解 ZLinear DABL_G511 的SPI总线架构,我们可以看到:

  1. 外设分派清晰:SPI1为ADC专用高速通道;SPI2为存储专用;以太网芯片单独占有一条可复用的SPI。
  2. 硬件与软件紧密配合:DMA+中断机制让数据搬运近乎零CPU开销;多字节突发传输提升网络吞吐。
  3. 每个细节都经过验证:SCK频率、CS时序、模式选择,都在实际产品中得到了充分的测试与优化。

SPI设计并不复杂,但真正做好,需要对协议、从机时序、信号完整性、MCU外设特性都有深入的理解。希望今天基于ZLinear产品的解析,能帮助你在自己的项目中避开常见的"坑",设计出稳健、高速的SPI通信系统。

最后,希望大家在调试SPI时牢记一句话:"用逻辑分析仪看波形,比猜代码快一百倍。"


我是 ZLinear 开源电子,一个专注于工业数据采集卡研发、生产与销售的专业团队。我们致力于从芯片级到系统级拆解硬核技术,分享一线工程经验。如果这篇内容对你有帮助,欢迎点赞、收藏、关注三连支持!我们下期继续拆解工业数据采集的硬核干货~http://www.z-linear.com

相关推荐
一口一口吃成大V1 小时前
APB信号总线
单片机·嵌入式硬件
思茂信息2 小时前
CST对一种用于中型无人机 433MHz 通信的宽带共形贴片天线
开发语言·单片机·嵌入式硬件·平面·无人机·cst
崇山峻岭之间2 小时前
单片机触摸屏实验
单片机·嵌入式硬件
析木不会编程2 小时前
单片机|嵌入式硬件设计--电容选型
单片机·嵌入式硬件
iCxhust3 小时前
C# 程序,实现二进制文件十六进制查看器,支持按行定位
开发语言·单片机·嵌入式硬件·c#·微机原理·8086最小系统·8088单板机
大卡片3 小时前
IDE软件实现注意事项
单片机
m0_377108143 小时前
stm32-mpu6050
stm32·单片机·嵌入式硬件
析木不会编程3 小时前
单片机|嵌入式硬件设计--电阻选型
单片机·嵌入式硬件
sramdram3 小时前
燃气表国产32位MCU微控制器低功耗解决方案
单片机·嵌入式硬件·微控制器·32位mcu·mcu微控制器·32位mcu微控制器