做工业嵌入式这一行,SPI电平隔离是个绕不开的坎。我自己在调一块基于 STM32F107VCT6 的采集板时,远端挂的是高压侧的电机驱动状态传感器,放大器和MCU之间隔了好几十厘米的排线,一开始没做隔离,结果一上电就把一块板子的 SPI IO 口打坏了。后来换了 MAX14431BAEE+ 这个四通道数字隔离器,把主控和远端从设备之间所有 SPI 信号全部隔开,通信链路才算彻底稳定下来。这篇就把我为什么隔离、怎么选隔离器、怎么接线、怎么写代码、怎么排查问题整个过程完整盘一遍,适合正在做工业采集、驱动板、BMS、分布式IO这类项目的朋友参考。
1. 拆需求:工业现场的 SPI 链路到底为什么要隔离
1.1 地环路才是 SPI 通信真正的隐形杀手
大多数 SPI 通信一上电就偶尔出错、甚至烧IO,原因不是信号不好调,而是两个设备之间存在着严重的地电位差。主控板用隔离电源供电,远端从设备板用另一个电网回路供电,两个“地”之间可能因为变压器漏电流、大功率设备启停、接地电阻不同,产生几伏甚至几十伏的电位差。这个电位差一旦加在 SPI 的 SCLK、MOSI、MISO、CS 这些信号线上,就会形成实实在在的电流,从高电位地流向低电位地,直接打穿 MCU 和从设备内部 ESD 结构。
隔离的本质,就是把两个系统地之间的直流回路彻底切断,让信号只通过磁场或者电场跨过隔离栅传递,而不让电流在地之间流动。打个比方,普通直连是两个水箱底部用管道连通,只要水位有差,水就会来回流;隔离器则是用齿轮在水箱之间传扭矩,两边转速一致,但水分子永远不会互相混合。
1.2 除了地电位,还要防共模干扰和浪涌
工业现场不会只有地电位差一种问题。变频器、伺服驱动、继电器通断都会在电源线上叠加浪涌,这些干扰进入电路板后,一部分会耦合到 SPI 信号线上,导致电平被抬高或拉低,从设备收到莫名其妙的指令码。SPI 又没有像 CAN、RS485 那种差分抗干扰和协议校验机制,大多数人是把 SPI 直接引到板外传感器上的,这时候不做隔离,就等于把MCU的IO口裸露在整个工业电磁环境里。
我实测过一台3kW伺服驱动器旁边放采集板,未隔离时 SPI 采样经常出现整帧乱码,用示波器看 MISO 线上毛刺能到5V以上。用了隔离器之后,隔离器两侧的 GND 不再共地,高频共模干扰只能通过寄生电容耦合,能量小得多,同样的干扰环境下通信基本不再出错。再加上隔离器本身的 CMTI 指标,能够承受快速变化的共模电压而不误翻转,这一点是光耦和普通电平转换芯片都很难做好的。
1.3 标准四线 SPI 隔离需要隔离哪几个信号
开始动手之前,先把要隔离的信号数清楚。标准 SPI 四线制:SCLK 时钟线,从主控到从设备;MOSI 主出从入,方向也是主控到从设备;MISO 主入从出,方向是从设备回到主控;CS 片选线,低电平有效,同样从主控到从设备。这样算下来,三个方向从主到从,一个方向从从到主。MAX14431BAEE+ 正好是 3+1 通道的数字隔离器,三个前向通道分给 SCLK、MOSI、CS,一个反向通道留给 MISO,可以说是为 SPI 量身定的通道数。
如果从设备还有中断请求引脚、复位引脚,那4个通道就不够用了。我建议这种情况下不要硬挤通道,直接加一片两通道或四通道隔离器,把中断和复位也安全地隔过去,否则引脚悬空或者只能短接,后面调试会更痛苦。隔离信号的数量在方案阶段就要定死,宁可多留通道,不要后面烦。
2. 硬件选型:MAX14431BAEE+ 和 STM32F107VCT6 的适配逻辑
2.1 为什么没选光耦或普通电平转换
很多老工程师习惯用光耦做隔离,我早期也试过,但六个通道的光耦电路做下来,板子面积大得离谱,而且光耦的电流传输比会随时间和温度漂移,低速还好,SPI 速率稍微提上来,输出波形就圆了,边沿怎么也调不干净。数字隔离器就不一样,内部直接把输入信号调制后通过电容或变压器耦合,边沿陡,延时可预测,一致性也远好于光耦。普通电平转换只能解决3.3V和5V之间的电平匹配问题,完全解决不了地电位差,所以在这个场景里不能当隔离用。
MAX14431BAEE+ 单颗芯片完成四路隔离,PCB 面积大幅减小,走线也干净。它两边都支持低压供电,我这边主控是3.3V,远端从设备也用3.3V,直接把对应 VCC 接好就行,不用额外做电平转换。如果你的从设备是5V系统,就要额外考虑逻辑电平兼容,避免隔离器输出3.3V到5V从设备被识别成不确定电平。选型时这些细节都要先确认,不然板子回来再飞线很痛苦。
2.2 MAX14431BAEE+ 的通道方向和 SPI 信号怎么配
MAX14431BAEE+ 这种3+1结构,明确把三个前向通道和三个从主到从信号对应起来。实际接线的时候,我建议先画一张引脚对应表,把 STM32F107VCT6 的 SPI1_SCK、SPI1_MOSI、SPI1_NSS 引脚分别写到隔离器输入脚,再把隔离器对应的输出脚连接到远端从设备的时钟、数据输入和片选脚。MISO 方向相反,从设备的数据输出脚要先到隔离器的反向输入脚,再从隔离器的输出脚回到 STM32 的 SPI1_MISO。
千万别在脑子里省事,直接用板子上的丝印顺序去猜。我经历过一次,就是反向通道接反了,结果 MCU 收到的数据全是0xFF,排查了大半天发现是隔离器的输入输出左右颠倒了。这种低级错误完全可以通过画对应表避免,一张表格几分钟,省下来一下午。
2.3 STM32F107VCT6 的 SPI 外设资源够不够用
很多人在选主控时会纠结要不要上 F4、H7,其实做隔离 SPI 这种场景,STM32F107VCT6 完全够用。它是 Cortex-M3 核,主频72MHz,SPI 外设本身能跑到十几兆的水平,远高于一般数字隔离器能够安全传输的速率。更关键的是 F107 属于互联型芯片,自带以太网 MAC、两路 CAN 和 USB OTG,工业设备需要把隔离采集的数据往上层网关转发时,这些接口一个都不用外挂,非常省事。
我做的板子就是一路隔离 SPI 负责采集电机驱动状态,另一路 SPI 接本地 Flash 保存参数,CAN 口把状态上报给总控,整个系统没有额外增加任何逻辑器件。当然用 F103 也跑得动,但 F107 的外设冗余让我后面扩展功能时不用重新画板,这是选型时的隐性价值。
2.4 隔离电源到底怎么解决
数字隔离器只隔离信号线,电源并不能凭空穿过隔离栅。你的隔离芯片次级侧(从设备侧)必须有一个独立的电源轨。如果隔离器不带集成DC-DC,就需要外置隔离电源模块。我在这块板上用的是1W隔离DC-DC模块,输入侧用主控的3.3V,输出侧隔离到另一个3.3V域,专门给 MAX14431BAEE+ 次级侧和远端从设备供电。后端加了 LDO 和足够的去耦电容,实测输出纹波在几十毫伏内,SPI 通信稳定性明显比直接吃隔离模块的开关噪声好。
如果芯片本身集成 DC-DC,虽然省事,但要注意次级侧负载能力有限,不要连太多从设备,否则上电瞬间电流超出隔离器能力,通信电压会被拉低。无论哪种方案,PCB 上的初级地和次级地在隔离器下方都不能有平面层连通,否则隔离就名存实亡了。
3. 硬件实操:隔离 SPI 的接线、供电与 PCB 布线
3.1 一张连接关系图,先把每根线的位置定死
我画图时习惯把链路拆成三段:主控区、隔离区、从设备区。主控区就是 STM32F107VCT6 的 SPI1 引脚和 MAX14431BAEE+ 的初级侧输入脚;隔离区是隔离器芯片本身;从设备区是隔离器次级侧输出脚到远端 SPI 从设备。中间不要有任何第三方器件串在信号路径里,尤其是不要加电平转换芯片,除非两个电平差异太大,否则只会引入额外延迟。
以 STM32F107 的 SPI1 为例,PA5 是 SCK,PA6 是 MISO,PA7 是 MOSI,我自己习惯用 PA4 做软件 CS。对应的连接方向:PA5 接隔离器前向输入1,PA7 接前向输入2,PA4 接前向输入3,隔离器三路输出分别接从设备 SCK、MOSI、CS;从设备 MISO 接入隔离器反向通道输入,反向通道输出再接回 PA6。这个配置简单到不需要特别复杂的 PCB,但方向感一定要清楚。
3.2 隔离器两侧的去耦和滤波不能省
数字隔离器内部有高速调制和解调电路,对电源噪声很敏感。每侧电源引脚都要放一个0.1μF陶瓷电容,尽量靠近芯片电源脚,再在稍远位置放一个10μF钽电容或陶瓷电容,用于吸收低频纹波。去耦电容的地必须分别接两侧各自的 GND,不要共用,更不要在电容上把两个地串在一起,否则等于是把地环路通过电容又接回去了。
如果现场干扰非常强,我还会在次级侧 VCC 输出再加一颗几百欧的磁珠,进一步滤掉高频分量。磁珠的直流电阻很小,压降可以接受。这样做的好处是,隔离器次级侧从设备在吸收大电流时,电源也不会出现明显瞬态跌落,SPI 时钟边沿抖动会好看很多。
3.3 PCB 布线时隔离带附近要留足安全距离
隔离是否有效,一半看芯片,一半看板子。MAX14431BAEE+ 的初级地和次级地之间,在 PCB 上必须保持电气隔离,芯片下方的铜皮要挖空,隔离带正下方不能走过孔或信号线。两侧地平面可以分别铺铜,但中间至少留出 1~2mm 的净空,具体按隔离器件手册的爬电距离要求来。隔离距离不够,爬电或空气放电会把隔离栅击穿,芯片保护得再好也没用。
SPI 信号线在隔离器输入侧要尽量短,从 STM32 引脚到 MAX14431BAEE+ 输入脚控制在 10mm 左右最稳。输出侧去往从设备如果走排线,建议信号线之间用地线隔开,比如排线顺序做成 GND, SCK, GND, MOSI, GND, MISO, GND, CS,这样串扰会小很多。如果直接用 PCB 到从设备,只要走线不平行太长距离,基本问题不大。
3.4 接口处加 ESD 和 TVS 保护
隔离器保护了 MCU,但隔离器次级侧的引脚仍然会直接面对外部电缆和从设备,依然需要过压保护。我通常在进入数据接口的位置放一组低电容 TVS 阵列,对地钳位,把静电和浪涌限制在隔离器承受范围内。工业现场设备插拔频繁,静电放电这个坑不提前填,后面批量生产时会有不少售后。
TVS 的选型注意两点:一是钳位电压要高于信号高电平,但低于器件绝对最大额定值,比如3.3V系统可以选5V左右的TVS;二是结电容要低,否则高速 SPI 边沿会被拉缓。我用过电容小于5pF 的 TVS 阵列,SPI 时钟波形基本没有明显变化。这个细节很多人忽略,等到画完板测试时再去改就麻烦了。
3.5 硬件焊接后的第一件事:先量隔离器供电和静态电流
板子焊好不要急着写代码,先用万用表确认两侧 VCC 都正常,初级地和次级地之间电阻应为无穷大。上电后量每路输入引脚的电平状态,再用手头信号源或 IO 翻转几下,用示波器看隔离器输出是否跟随输入。第一次上电如果发现输出一直保持低或高,先不要怀疑芯片坏了,检查输入侧有没有被下拉电阻束缚,或输出侧负载过重。
我曾经遇到过一块板,隔离器输出一直正常,但一接从设备 MISO 就被拉低,后来发现是从设备上电时序不对,隔离器已经开始输出但从设备还在复位。这种问题需要在初期联调时多留一点排查时间,不能把精力全花在写代码上。
4. 软件配套:STM32CubeMX 配置和 HAL 读写代码
4.1 CubeMX 里 SPI 的速率、极性、相位怎么设
软件侧我用的是 STM32CubeMX 生成初始化代码,再在工程里写业务逻辑。SPI1 选择 Full-Duplex Master,片选用软件控制,这样隔离器带来的 CS 延迟更容易通过代码补偿。时钟极性 CPOL 和相位 CPHA 必须与远端从设备要求一致,大多数从设备默认是 Mode 0(CPOL=0,CPHA=0)或者 Mode 3(CPOL=1,CPHA=1),极性和相位反了,数据就会整体移花接木,但波形还“看起来”正常。
SPI 速率设置上,我建议先按从设备最高时钟的 1/10 来保守配置。STM32F107 的 SPI 时钟源自 APB,经过分频后产生实际波特率。CubeMX 里可以直接选速率档,比如压到 500kHz 或 1MHz,等链路调稳了再逐步往上提。不要一上来就追求最高速率,隔离器的传播延迟加上从设备的响应时间,会让高速 SPI 的第一笔和第二笔数据采样点正好卡在边沿上,数据对但不稳定,调试起来特别折磨人。
4.2 为什么 MISO 采样容易翻车,速率怎么降才合理
数字隔离器在信号路径上会引入几十到几百纳秒的传播延迟,SPI 主控在发送 SCLK 后的某个时刻采样 MISO。如果 MISO 上的数据经过从设备输出延迟、隔离器反向延迟之后,正好在 SCLK 采样点附近翻转,那这一次读到的可能是上一拍的数据,表现就是接收数组整体错位,或者隔三差五多一个字节。
解决思路很直白:把 SPI 时钟周期拉长,让数据稳定时间远大于采样窗口偏移。我自己的经验是,先查隔离器数据手册确认最大传播延迟,再按“SCLK 周期至少大于 2 倍最大延迟”的公式算一个初始时钟。假设手册给的最大传播延迟是100ns,那理论周期至少200ns,时钟就是5MHz,但实际还要加上从设备 MISO 的建立时间,所以我会再除以5到10,最后落到500kHz。宁可慢一点,先保证通信正确,再慢慢往上升。
4.3 HAL 库全双工读写代码,CS 时序放在哪里最稳
软件 CS 的时序关键在:先拉低 CS,再启动 SPI 传输,传输完成后拉高 CS。不要贪图方便在 SPI 传输结束后用定时器延时拉高,那样会让从设备误判成一次更长的事务,尤其是一些带状态机的 SPI 从设备,CS 释放时间不满足要求会直接丢数据。
#define SPI_CS_PORT GPIOA #define SPI_CS_PIN GPIO_PIN_4 #define SPI_CS_LOW() HAL_GPIO_WritePin(SPI_CS_PORT, SPI_CS_PIN, GPIO_PIN_RESET) #define SPI_CS_HIGH() HAL_GPIO_WritePin(SPI_CS_PORT, SPI_CS_PIN, GPIO_PIN_SET) uint8_t sp1_tx_buf[16]; uint8_t sp1_rx_buf[16]; uint8_t SPI1_ReadWrite(uint8_t *tx, uint8_t *rx, uint16_t len) { uint8_t result; SPI_CS_LOW(); result = HAL_SPI_TransmitReceive(&hspi1, tx, rx, len, 100); SPI_CS_HIGH(); return result; }我的实际调用方式是,先构造要发送的命令帧,再调用SPI1_ReadWrite,返回后在sp1_rx_buf里解析数据。这里把 CS 拉高的动作放在HAL_SPI_TransmitReceive返回之后,而且没有额外延时。大多数从设备的 CS 释放时间不小于几百纳秒,HAL 函数返回后隔离器传播延迟已经替我们“缓冲”了一段,实测基本都能满足。如果你用的从设备手册要求 CS 高电平维持时间特别长,那就老老实实在 CS 高电平后加一点HAL_Delay(1)或短暂翻转延时,但不能在传输中拉高。
4.4 用 DMA 还是轮询,什么时候值得上中断
SPI 数据量小、频率低时,轮询是最简单可靠的做法。HAL_SPI_TransmitReceive 在超时时间内完成,CPU 占用也不高。如果从设备要连续上传几百字节的数据,比如把 BMS 的电压、电流、温度寄存器全读一遍,轮询会占用主循环大量时间,这时可以考虑 DMA 模式。但 DMA 模式下 CS 的正确操作比较讲究,需要在 DMA 传输完成回调里拉高 CS,否则 CS 时序会不对。
我的板子目前是 16 字节以内的小帧轮询,超过 64 字节的场景我才会切 DMA。中断方式适合双任务并行,但 SPI 中断服务里处理数据需要特别小心,不能在里面打印日志或者做复杂解析,否则实时性反而下降。很多问题不是硬件不行,是软件把中断处理做太重,我这几年看过的低级坑里,这个能排前三。
4.5 上电时序和初始化顺序对隔离链路的影响
软件初始化的顺序对隔离链路稳定性影响也很大。我习惯先把 STM32F107 的 GPIO 和 SPI 外设初始化好,再给远端从设备“供电”或“释放复位”,如果远端从设备有自己的主控或复位电路,需要等待它稳定后再发起第一笔 SPI 事务。很多从设备在上电 100ms 内不接受片选信号,这时如果主控因为任务调度立刻写寄存器,写进去的数据会被从设备忽略,但看起来又好像操作成功了。
为了避免这种“假成功”,我在发第一笔事务前会先读从设备的 ID 寄存器或者状态寄存器,连续读三次,只要三次结果一致,再继续后续操作。如果三次不一致,就延时重试,直到稳定为止。这个思路简单但非常有效,尤其是带上隔离电源后,两侧电源上电时间会有先后,这一小段等待能省很多麻烦。
5. 联调排错:SPI 隔离链路常见问题实录
5.1 全 0xFF 或全 0x00:先检查 MISO 通道方向
联调时最常见的问题就是 MISO 一直读到 0xFF,或者永远 0x00。你先不要怀疑时序,先拿示波器量隔离器反向通道的输入输出。如果从设备 MISO 有波形,但 MCU 引脚没有,十有八九是反向通道方向接反,或者隔离器对应的输出脚虚焊。如果 MCU 引脚有波形但读回来全是 FF,那大概率是 SPI 的 CPOL/CPHA 不匹配,从设备在时钟边沿没有把数据送出来,主控采样点落在数据变化点上。
用示波器能一眼看出端倪:正常 SPI 数据线上的数据是在 SCLK 某个边沿前后稳定的矩形波,如果数据线和 SCLK 变化完全同步,而主控读出来的又不对,就基本锁定是采样相位问题。优先把 CubeMX 里的 CPHA 取反试试,很多从设备用的是 Mode 0,但一脚踩进 Mode 1 的坑也不是没见过。
5.2 偶发错位:优先降速而不是疯狂调滤波
如果通信 95% 正常,但偶尔读回来的数据整帧错位,先别急着改板子,把 SPI 时钟降一半试试。很多情况下就是隔离器传播延迟加从设备输出延迟,让某一位的采样点落在临界区。数据错位是“时域问题”,堆软件滤波算法解决不了,只有把时钟周期拉长,让数据翻转和采样点拉开距离。
我有一次遇到隔十几帧就错一个字节,最后把 SPI 时钟从 2MHz 降到 500kHz,立即好了。后来看手册,隔离器最大传播延迟比想象中大不少,2MHz 本来就超出安全范围。之后我在项目里定了一条规矩:隔离 SPI 的速率不能按主控能力算,要按“隔离器延迟 + 从设备建立时间”来算,这条规矩救了很多次场。
5.3 CS 误触发导致的“幽灵写操作”
软件 CS 的引脚如果和 SPI 信号线在排线上挨得太近,远端从设备可能被串扰拧到,产生一次非预期的片选下降沿,从设备就会把这当成一次传输,执行非法操作。在电机控制板这种强干扰环境下特别明显,表现为从设备寄存器被莫名改写。
解决方式有几种:CS 线在排线上用 GND 隔开;软件上给片选拉低后加一小段稳定时间再发数据;或者干脆用硬件 NSS,故意让 CS 和 SCLK 保持严格同步。不过硬件 NSS 和隔离器组合使用要格外小心,NSS 的输出延迟会导致从设备还没看到 CS,SCLK 就已经来了,所以我个人更推荐在隔离链路里用软件 CS。
5.4 通电瞬间通信失败,后面又正常
如果每次上电第一次通信失败,重启后正常,十有八九是隔离电源模块输出还没稳定,远端从设备没准备好,但主控 SPI 已经开始发数据了。最简单的方法是主控上电后延时 100~200ms 再初始化 SPI 事务,如果对启动时间有要求,就做一个“设备就绪检测”流程,比如先发一个温和的读状态命令,等到响应正确再进入正常流程。
隔离器本身没有上电顺序要求,但要确保隔离器两侧供电都稳定后再传数据。之前我遇到过次级侧 DC-DC 模块输出开启慢,隔离器已经跑起来但次级侧 VCC 还是爬坡状态,这时候输出信号幅值不足,从设备自然锁不住数据。后来我在电源模块输出加了大一点的储能电容,问题就没了。
5.5 发热和“不明原因烧隔离器”
隔离器发热多半是因为输出侧过流或者引脚灌入了超出范围的电压。SPI 信号线上如果直接接长电缆,且电缆受感性负载影响产生反冲,可能把隔离器输出引脚钳位到倒灌状态。排查时用示波器看输出引脚,有没有超过 VCC+0.3V 的过冲。过冲明显就在信号端加串联阻尼电阻,22Ω或者33Ω都行,阻值不要太大,否则边沿会变缓。
还有一次烧隔离器是因为次级侧 DC-DC 输出纹波太大,长期让芯片在低压上下波动,后来换了一款稳定度更好的模块,问题再没出现。电源是数字隔离器的生命线,很多“神秘故障”最后都指向电源质量,这个经验值得各位特别记住。
5.6 排查顺序建议和速查表
我把常见问题整理成一张表,联调时按这个顺序过:
| 现象 | 优先排查点 | 操作建议 |
|---|---|---|
| 完全不通 | 隔离器供电、方向、虚焊 | 量两侧VCC,检查输入输出对应关系 |
| 全0xFF / 0x00 | MISO通道方向、CPOL/CPHA | 示波器量MISO,切换SPI模式 |
| 偶发错位 | 时钟过快、采样点临界 | 降速一半,查验传播延迟 |
| CS误触发 | 串扰、CS时序 | 排线加GND,软件CS加稳定时间 |
| 上电首帧失败 | 隔离电源未稳、从设备未就绪 | 上电延时,增加就绪检测 |
| 芯片发热 | 过冲、电源纹波 | 串联电阻,检查DC-DC输出 |
这样的表格让我在项目交接时非常省心,后来带人调试也是先让他们照着表排查,而不是看到波形就瞎调参数。调隔离 SPI 链路,思路比工具重要。
6. 应用扩展与实测心得
6.1 这套隔离方案能用到哪些实际设备上
STM32F107VCT6 加 MAX14431BAEE+ 的组合,最适合做“工业设备内部的小型传感器/驱动状态采集链路”。比如电机驱动器里面的温度、母线电压、编码器状态数据采集;BMS 里每个电池模组和主控之间的 SPI 通信;PLC 远程 IO 板上 MCU 和底层 DI/DO 通道芯片之间的数据交换。这些场景的共同点是:设备内部已经存在比较大的电压差,或者信号需要穿过强干扰区域,但数据量不大,SPI 刚好够用。
我的采集板最后就装进了电机驱动器机箱里。主控通过隔离 SPI 读驱动板上的电压和温度传感器,同时用 CAN 口把数据传到总控单元。整套系统工作了大半年,没有再出现之前的通信打损问题。这也说明隔离并不是给 PCB 加一层神秘光环,而是切切实实解决了工业现场的物理约束。
6.2 多从设备扩展:通道数不够怎么破
如果远端不止一个从设备,隔离方案还可以扩展。最简单的方式是每多一个从设备就多隔离一路 CS,但 MAX14431BAEE+ 只有四个通道,这时可以把多个从设备的 CS 都用隔离器或者译码器来管理。我自己的习惯是:在隔离器次级侧放一个带锁存的 IO 扩展芯片或串行译码器,主控通过隔离 SPI 先写扩展寄存器来选择从设备,再发起数据读写。这样不会增加太多隔离通道,代码只多一点状态管理。
如果从设备本身就支持菊花链,那更省事,一条 CS 串一串从设备,SCLK 和 MOSI 共用,MISO 链式返回。菊花链对时序要求更高,要注意从设备内部移位寄存器的位宽,否则多读少读一个字节都会让整个链乱掉。在工业现场,稳定优先,我一般只在芯片手册明确支持菊花链时才用。
6.3 验证隔离效果,不能只跑一遍读写
很多人以为隔离后通信正常就完事,其实还要做几项验证。一是用示波器双通道同时测隔离器输入和输出波形,看延迟、上升沿、下降沿是否在预期范围。二是在隔离器初级地和次级地之间施加快速变化的共模电压,观察 MISO 是否误翻转,这个测试能直接反映 CMTI 指标是否够用。三是连续跑几千帧压力测试,故意在主循环里穿插其他任务,确保实时响应不会导致 CS 时序被拉长。
我还会在测试时把远端从设备的复位引脚周期性拉低,模拟工程现场上电掉电场景,验证主控能不能自动恢复通信。工业环境下,没人会天天重启设备,但设备自己因为干扰复位是很常见的事。你的代码必须能感知从设备复位,重新初始化并恢复读取,否则设备稳定运行几天后可能悄悄失去通信。
6.4 最后再分享一个踩坑最多的小技巧
如果要一句话总结我做隔离 SPI 的经验,那就是:先定通道方向,再定时钟速率,最后才写代码。方向错了,代码写再好都是白搭;速率太快,波形再好也会偶发错位。很多设计文档把时间全花在选主控、算功耗、堆接口上,却没有认真算过隔离器传播延迟对 SPI 时序的影响,等项目做砸了才发现问题在毫秒级都看不到的时间参数上。
我个人现在的做法是,每个 SPI 从设备在旁边放一张参数卡,写清楚通信速率上限、需要的 CS 低到高间隔时间、复位恢复时间,每次画板或者搬代码都先看这张卡。这种笨办法让我的隔离 SPI 项目基本都能一次通过联调,也让我不用再半夜爬起来去猜哪根线接反了。工业嵌入式这东西,稳比快重要,隔离做得到位,后面能省下的精力远超一开始省下的那点调试验证时间。