http://www.z-linear.com前言大家好我是ZLinear的硬件工程师。在数据采集系统中SPISerial 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根信号线信号方向主-从功能说明SCK或SCLK主→从串行时钟由主机产生MOSI主→从主机输出从机输入数据线MISO从→主主机输入从机输出数据线CS / SS / NSS主→从片选信号低电平有效选中从机SPI的全双工特性意味着在每个时钟周期内主机可以通过MOSI发送一位数据同时从机通过MISO返回一位数据。这与I2C的半双工模式有本质区别。1.2 时钟极性与相位SPI有4种工作模式Mode 0~3由CPOL时钟极性和CPHA时钟相位组合决定SPI模式CPOLCPHA说明Mode 000SCK空闲为低电平第1个边沿上升沿采样数据Mode 101SCK空闲为低电平第2个边沿下降沿采样数据Mode 210SCK空闲为高电平第1个边沿下降沿采样数据Mode 311SCK空闲为高电平第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外设连接目标速率/模式功能SPI1AD7606/AD7689ADC21MbpsMode 38通道同步或复用ADC数据读取SPI2FlashN25Q128A FRAMMB85RS16低速8位模式大容量存储与关键参数存储SPI3扩展接口预留未使用可用于外部扩展SPI复用W5100S以太网芯片70MHz maxMode 3网络通信硬件TCP/IP协议栈关于SPI1的设计选择DABL_G511定位为通用型/隔离型采集卡其ADC采用8通道同步采样模式AD7606每个通道都有独立的采样保持电路通过SPI1读取16/24位转换结果。SPI1的时钟频率在代码中设置为21MHz来自《DABL7689核心代码解析》对于16位数据来说21MHz下读取8个通道仅需约6μs能够轻松应对40kSPS的全通道同步采集。3.2 SPI1ADC数据的高速通道从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 Flash16MB和MB85RS16 FRAM16Kbit。这两个存储器共用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 3DABL_G511中配置为Mode 3CPOL1, CPHA1。多字节突发传输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/221MHz SPI_InitStruct.CLKPhase LL_SPI_PHASE_2EDGE; // CPHA1 SPI_InitStruct.CLKPolarity LL_SPI_POLARITY_HIGH; // CPOL1 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 3CPOL1, CPHA1与AD7689要求的模式一致。四、SPI设计的“三大纪律八项注意”4.1 三大纪律CS片选必须严格管理拉低CS前确保总线空闲传输结束后等待足够时间再拉高CS防止从机仍在输出数据时CS变化。时钟极性极性必须与从机匹配仔细阅读每个从机的数据手册确认CPOL和CPHA的要求。同一个MCU上挂载多个从机时可能需要为不同从机在传输前动态调整SPI寄存器配置如果从机模式不同。上拉/下拉电阻不要忽略对于某些从机在CS无效时需要MISO固定电平如内部无上拉否则可能产生浮空输入导致漏电或误触发。4.2 八项注意差分/隔离SPI如果SPI走线需要远距离传输如外接隔离ADC必须使用差分转接芯片或隔离器如ISO7242并在隔离两侧各加去耦电容。DMA优先尽量使用DMA进行SPI数据传输使MCU能并行处理其他任务。双缓冲/环形缓冲在高速采集时SPI DMA接收缓冲区应使用双缓冲乒乓机制避免缓冲区被填满前CPU来不及处理。SCK频率不能盲目求高过高的频率可能导致信号完整性下降、误码率升高尤其当PCB布线较长或从机驱动能力不足时。检查从机的时序要求比如从机在CS有效后需要等待若干时钟才准备好、或传输结束后需要保持CS有效一段时间。不要忽略这些细节。MISO冲突检查确保所有共享MISO的从机在不被选中时输出高阻。调试时使用逻辑分析仪在开发初期用逻辑分析仪抓取SCK、MOSI、MISO和CS波形是定位SPI通信问题的最高效手段。利用硬件的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总线架构我们可以看到外设分派清晰SPI1为ADC专用高速通道SPI2为存储专用以太网芯片单独占有一条可复用的SPI。硬件与软件紧密配合DMA中断机制让数据搬运近乎零CPU开销多字节突发传输提升网络吞吐。每个细节都经过验证SCK频率、CS时序、模式选择都在实际产品中得到了充分的测试与优化。SPI设计并不复杂但真正做好需要对协议、从机时序、信号完整性、MCU外设特性都有深入的理解。希望今天基于ZLinear产品的解析能帮助你在自己的项目中避开常见的“坑”设计出稳健、高速的SPI通信系统。最后希望大家在调试SPI时牢记一句话“用逻辑分析仪看波形比猜代码快一百倍。”我是 ZLinear 开源电子一个专注于工业数据采集卡研发、生产与销售的专业团队。我们致力于从芯片级到系统级拆解硬核技术分享一线工程经验。如果这篇内容对你有帮助欢迎点赞、收藏、关注三连支持我们下期继续拆解工业数据采集的硬核干货http://www.z-linear.com