前阵子给一台老设备做控制器改造,变频器一启动,PIC18F87K22 从 SPI 总线上读回来的传感器数据就开始跳,偶发乱码。示波器一夹,地线上能看见幅度不小的尖峰,SPI 信号叠着毛刺,MISO 上甚至偶尔出现半个周期的电平抖动。问题不复杂,但很典型:工业现场的高速数字链路不能和功率回路共享地。后来把 SPI 链路改成隔离方案,MAX14431BAEE+ 数字隔离器负责把主机侧和现场侧彻底分开,再配合软件上的一些时序校准,问题才算真正解决。
这篇文章不是芯片数据手册的复读,而是从实际改造出发,讲讲 MAX14431BAEE+ 这类数字隔离器与 PIC18F87K22 搭配做 SPI 隔离通信时,从选型、硬件、软件到调试的完整链路。内容适合正在做工业控制器、嵌入式数据采集、传感器接口隔离的工程师。如果你也在琢磨"隔离 SPI"到底怎么落地,这篇文章里踩过的坑和最终采用的方案,可以直接参考。
1. 为什么工业现场要先把 SPI 链路隔离:地环路与共模干扰的账
1.1 那台"一启动就乱码"的设备
那次改造的对象是一台包装机控制器,核心板上用 PIC18F87K22 做主控,SPI 总线上挂了 ADC、DAC 和几个数字电位器。主控板和电机驱动在同一个机柜,驱动功率不大,但变频器一加速,SPI 通信就开始出错。最初怀疑是程序问题,查了很久,最后用示波器看波形才发现,干扰根本不是从程序里来的。
测量时把探头的地夹接在 PCB 的数字地上,另一个探头同时测量电机驱动器外壳与控制器数字地之间的电位差。变频器运行后,这个电位差明显抬升,还叠加了几十纳秒到几微秒的尖峰。SPI 频率当时不算高,大概 1MHz 左右,但信号线上的毛刺和地电位抖动直接造成采样错误。这个故障的根因就是地环路:功率回路电流经过公共地阻抗,把噪声耦合进了信号回路。
1.2 共地 SPI 的三个死穴
SPI 是同步串行接口,SCLK、MOSI、MISO 三条线必须参照同一个地电位。只要发送端和接收端之间的地电位有波动,接收端采样到的数据就会失真。最典型的问题有三个:
第一是地弹。功率器件开关瞬间,大电流流过 PCB 地平面或机壳地,产生瞬态压降。这个压降叠加在信号线和地线上,对高速 SPI 来说就是噪声。
第二是地环路。如果主控板和现场板各自接保护地,两个地之间又通过线缆连接,就会形成环路。环路面积越大,越容易感应电磁干扰,尤其是在电机、变频器、接触器这种强干扰源附近。
第三是共模电压和浪涌。工业现场里,两块板之间可能隔着几十米线缆。雷击浪涌、感性负载关断产生的瞬态电压,会沿着信号线和地线进入控制器,轻则数据错乱,重则烧掉芯片。
SPI 隔离解决的核心问题,就是把主机侧和从机侧的地彻底切开。两侧之间没有直流通路,地环路自然消失,共模干扰也只能通过隔离器内部的寄生电容耦合,能量大大削弱。
1.3 为什么光耦不是好选择
早期很多设计用光耦隔离 SPI。光耦不是不行,但在 SPI 这种要求通道间一致性比较好的场景里,问题很明显。
光耦的速度一般比较慢。常见的光耦比如 PC817,传输延迟在微秒级别,做 100kHz 的 SPI 都吃力,更不用说几 MHz。高速光耦也有,但价格和功耗都上去了。
更麻烦的是光耦的 CTR(电流传输比)会随时间和温度漂移。LED 发光效率衰减、光敏三极管增益变化,都会让输出的上升沿和下降沿变得不对称。SPI 是同步时序,如果 MOSI 和 MISO 两条通道的延迟差异变大,接收端采样点就会出问题,而且这种问题很难复现,属于"偶尔错一两个字节"的类型。
MAX14431BAEE+ 这类数字隔离器不一样。它内部用的是变压器或电容耦合技术,传输延迟是 ns 级别的,通道间的时序一致性比光耦好得多。所以只要隔离器选型正确,SPI 通信的时序预算就更容易做。
1.4 隔离等级怎么选
数字隔离器有个关键参数叫隔离耐压,常见的有 2.5kVrms、3.75kVrms、5kVrms 等。工业控制板卡之间做隔离,一般建议选 3.75kVrms 以上的型号,留足余量。隔离器不是保险丝,真正遇到几万伏的浪涌时它也会击穿,但正确的耐压等级可以保证在正常工业环境下长期可靠运行。
MAX14431BAEE+ 的具体耐压等级要以数据手册为准,选型时注意看两个指标:一个是额定隔离耐压,另一个是爬电距离。PCB 上隔离器两侧的焊盘间距、走线间距,都要满足对应安规要求。不要只看芯片体积小就觉得方便,爬电距离不够,绝缘等级再高也白搭。
2. MAX14431BAEE+ 与 PIC18F87K22 的搭配逻辑:从器件参数到系统拆解
2.1 MAX14431BAEE+ 在链路中的定位
MAX14431BAEE+ 是 Maxim 推出的数字隔离器,通道数量够覆盖 SPI 的基本信号组合。SPI 最常用的信号是 SCLK、MOSI、MISO,再加一个片选 CS,刚好需要四路信号。有些设计里 CS 由主机 GPIO 直接控制,不需要隔离,那三路也够用。但实际情况中,从机板往往有独立的电源和地,CS 如果不隔离,地环路和共模干扰依然存在。所以更多时候,四条信号线最好都过隔离器。
数字隔离器不是电平转换器。它两侧都有独立的电源引脚,输入侧由主控侧电源供电,输出侧由从机侧电源供电。两侧的地是完全分开的。信号通过隔离器内部的耦合介质传递,但不建立直流电气连接。
有些人把隔离器当成普通缓冲器来接,结果两侧共用一个地,等于没隔离。这是一个很容易犯的错误,后面硬件部分再详细说。
2.2 PIC18F87K22 选它的原因
PIC18F87K22 是 Microchip 的 8 位单片机,性能不算顶尖,但它的 I/O 资源丰富,内部集成多个串行通信模块,尤其是 MSSP(Master Synchronous Serial Port)模块,可以直接配置成 SPI 主机或从机模式。对工业现场来说,8 位机有时候反而比 32 位机更稳,启动快、外设简单、功耗可控,而且单片机的抗干扰设计和引脚布置在硬件上更容易做隔离。
在隔离 SPI 的场景里,我比较看重两点:一是 MSSP 模块的时钟极性、相位都可以配置,能够匹配不同 SPI 从机的要求;二是有多个独立串行模块,可以一路 SPI 接隔离后的现场总线,另一路 SPI 接本地调试接口,互不干扰。
具体到 MAX14431BAEE+ 和 PIC18F87K22 的搭配,电平和速度的匹配是首要问题。PIC18F87K22 的 I/O 电平有 3.3V 和 5V 两种兼容选项,MAX14431BAEE+ 的电源电压范围要看具体型号。设计时最重要的是确保两侧电压域一致,比如主机侧 3.3V,隔离器主机侧也供电 3.3V,输出给从机的一侧如果从机是 5V 器件,则隔离器从机侧供电 5V。信号电平只要满足高低电平阈值,就能正常通信。
2.3 隔离器放在主机侧还是从机侧
这个问题的答案取决于隔离的边界在哪里。如果主控板是"安全侧",现场板是"危险侧",那隔离器就应该放在主控板输出到现场板的关键路径上。两种常见的接法:
第一种,隔离器靠近主机 MCU。这种做法适合主控板和现场板通过长线缆连接,隔离器把线缆上的干扰挡在 MCU 之外。缺点是隔离器到 MCU 之间的一段 PCB 走线仍然处于隔离边界的主机侧,如果这段走线被干扰,问题依然可能进入 MCU。
第二种,隔离器靠近从机接口。适合从机板自己有独立电源和地的情况,让从机侧的干扰通过隔离器隔离,主机侧完全干净。
实际项目中,我习惯把隔离器放在靠近主机侧的位置,因为这样隔离器两侧的地可以在 PCB 上得到更清晰的规划。但如果你要隔离的是两块独立供电的板子,那隔离器可以作为两块板之间的桥接芯片,哪边先接都可以,关键是两侧的电源和地必须严格按照隔离边界走线。
2.4 为什么四通道比三通道更省心
常见 SPI 隔离方案中,很多人用一个三通道隔离器,省掉 CS 通道,把 CS 信号改成普通 GPIO 控制。但如果从机要求 CS 必须由隔离后的信号控制,三通道就不够用了。CS 信号如果不隔离,它和 SCLK/MOSI/MISO 之间可能存在电位差,从机片选逻辑可能错乱,甚至导致从机内部逻辑闩锁。
MAX14431BAEE+ 这类四通道隔离器能够覆盖完整 SPI 总线,既不用额外处理 CS 的隔离,也不会出现三通道方案中"CS 漏隔离"的隐患。这在实际调试中会省掉很多麻烦,特别是从机芯片对片选时序要求严格的时候。
3. 硬件电路与 PCB 布局:隔离做没做对,一半看原理图一半看板子
3.1 电源与地域划分:隔离的核心在这里
数字隔离器两侧必须有独立的电源域。MAX14431BAEE+ 的 VCC_A 和 VCC_B 分别对应主机侧和从机侧电源,地的引脚分别是 GND_A 和 GND_B。原理图设计时,这两组引脚千万不能接在同一个地网络上。
我见过不少翻车案例,原理图里芯片封装画对了,但 PCB 布线时软件自动把同名网络连在一起,或者工程师在原理图中忘记给隔离器两侧分别设置电源符号。最后板子打样回来,隔离器形同虚设,SPI 照样被干扰。
建议从原理图阶段就分成两个电源网络,比如 VCC3V3_ISO_A 和 VCC3V3_ISO_B,地网络也分成 GND_A 和 GND_B。这样在 PCB 布局时,软件会严格执行隔离网络分离,不容易出错。
隔离电源也要选择合适的方案。最简单的是买现成的隔离 DCDC 模块,比如常见的 3.3V 转 3.3V 或 3.3V 转 5V 的模块,功率不用太大,SPI 隔离器两侧的电流需求都不高。但电源模块本身的纹波要控制好,建议在输出端加 10uF 电解电容和 0.1uF 陶瓷电容并联,尽量靠近隔离器电源引脚放置。
3.2 信号连接与上拉电阻的位置
SPI 信号经过隔离器后,时序和电平都发生了变化。在硬件设计时要注意几个细节:
片选 CS 信号如果是主机 GPIO 直接控制,经过隔离器后会有传播延迟。如果从机对 CS 的有效时间要求很严格,主机在拉低 CS 后必须延时一段时间再发时钟。这个延时要根据隔离器的传播延迟来定,不能完全照搬普通 SPI 的时序。
MISO 信号线上如果有上拉电阻,位置应该放在接收端一侧。比如从机输出 MISO,经过隔离器回到主机 MCU,这个上拉电阻放在 MCU 这一侧更合理。如果放在从机侧,一旦从机掉电,隔离器输出端可能处于不确定状态,导致 MCU 读到错误电平。
MOSI、SCLK 线上是否接串联电阻,要看驱动能力。有些隔离器输出驱动能力较强,长线缆连接时需要串 22 到 33 欧姆电阻,减少反射。这个在短距离 PCB 走线时可以不加,但涉及排线连接时最好加上,牺牲一点边沿速度换稳定性。
3.3 PCB 布局:隔离带下方不要铺铜
这是最容易忽视的细节。数字隔离器的工作原理是依靠内部的磁耦合或电容耦合,PCB 上隔离器两侧的隔离距离由芯片内部的绝缘层决定,但芯片两边的引脚和走线之间如果存在导体连接,就会形成绕开隔离器的寄生通道。
PCB 布局时,在隔离器正下方和两侧留出 "隔离带" 区域,这个区域禁止铺铜,也不能走信号线。目的是保证两侧地的隔离阻抗足够高,防止高频噪声通过 PCB 铜箔直接耦合过去。
另外,隔离器两侧的地平面也要分开。隔离器左侧的地网络只在左侧出现,右侧的地网络只在右侧出现,两者通过隔离器本身的绝缘边界分隔。如果有一块大面积铜箔横跨隔离带,即使原理图上两个地网络标号不同,实际高频信号也会耦合过去。
还有走线间距。工业应用中,隔离器两侧信号线之间的距离要尽量拉大,尤其是有高压危险的场合。这个距离不仅仅是安规要求,也影响着共模瞬变抑制能力。现场接线端子到隔离器之间的走线,应避免和隔离器另一侧的走线平行放置过长的距离。
3.4 接口防护:隔离之后还是需要 TVS
隔离器解决了地环路和共模干扰问题,但并不能完全替代所有接口防护。如果从机侧直接面对外部线缆,还是要在连接器处加 TVS 管或压敏电阻,防止静电和浪涌进入隔离器输出端口。
TVS 管要选钳位电压合适的型号,同时注意结电容。有些 TVS 结电容很大,放在高速 SPI 信号线上会严重衰减边沿,导致时序余量恶化。SPI 频率小于 5MHz 时影响不大,但如果跑 10MHz 以上的链路,结电容小于 5pF 的 TVS 更合适。
串联电阻和 TVS 配合使用也能起到限流作用,比如在串行信号线上串 10 到 22 欧姆电阻。电阻本身能衰减一部分高频噪声,也能限制 TVS 导通时的电流,算是一举两得。
4. PIC18F87K22 的 SPI 驱动配置:寄存器、代码与实际收发流程
4.1 MSSP1 的初始化
PIC18F87K22 的 MSSP 模块可以用作 SPI 主机,也可以用作从机。硬件连接上,主机侧 MCU 输出的 SCLK、MOSI、CS 经过隔离器后接到从机,从机的 MISO 再经过隔离器回到 MCU。所以 PIC18F87K22 仍然扮演普通 SPI 主机的角色,软件上最大的变化是需要在时钟和片选沿之间留出足够的等待时间。
先看初始化代码。以下以 MSSP1 为例,配置为 SPI 主机模式,时钟极性和相位采用 SPI Mode 0,即空闲时钟为低电平,在上升沿输出数据、下降沿采样数据。
void SPI_Master_Init(void) { SSP1STAT = 0x00; // SMP=0, CKE=0,对应 Mode 0 基本配置 SSP1CON1 = 0x22; // CKP=0,SSPEN=1,SPI Master 模式,Fosc/64 }SSP1STAT 寄存器里的 SMP 位和 CKE 位决定采样时刻和时钟沿的关系。对于大多数 SPI 从机,Mode 0 是最常用的。但如果你遇到的从机要求 Mode 1、Mode 2 或 Mode 3,就需要调整 CKP 位和 CKE 位的组合。调整方式以数据手册为准,不要想当然照搬网上代码。
时钟频率这里选的是 Fosc/64。假设单片机主频为 16MHz,这个配置下 SPI 时钟就是 250kHz。对大多数工业传感器和 ADC 来说,这个速率足够用,而且隔离器带来的延迟在这个频率下基本可以忽略。
如果需要在不同速率之间切换,可以修改 SSPM 位。MSSP 支持多种分频系数,比如 Fosc/4、Fosc/16、Fosc/64 等。隔离 SPI 场景下,我建议初始调试阶段故意把速率压低,先保证链路通,再逐步提速。
4.2 手动片选与读写函数
PIC18F87K22 主机模式发送数据前,要先拉低 CS,然后往发送缓冲寄存器写入数据,等待接收完成,再读取接收缓冲寄存器,最后拉高 CS。由于隔离器引入了传播延迟,CS 拉低之后最好加几个空指令等待,确保从机内部逻辑稳定。
#define SPI_CS LATCbits.LATC2 #define SPI_CS_TRIS TRISCbits.TRISC2 unsigned char SPI_ExchangeByte(unsigned char data) { unsigned char received = 0; SPI_CS = 0; // 拉低片选 __delay_us(2); // 等待隔离器传播稳定 SSP1BUF = data; // 写入发送数据 while (!SSP1STATbits.BF) // 等待接收完成 { // 轮询期间可以做超时保护 } received = SSP1BUF; // 读取收到的数据 SPI_CS = 1; // 拉高片选 return received; }代码里特别加了__delay_us(2),这是隔离链路和普通 SPI 最大的差别。CS 信号经过隔离器后,从机侧收到 CS 下降沿的时间会晚,如果主机立刻发送时钟,从机可能还没准备好。类似地,在字节传输结束后,CS 拉高之前也需要一定等待时间,让从机完成内部锁存。
轮询SSP1STATbits.BF是一种最直接的方式。如果 SPI 频率较高,BF 标志置位很快,但要注意防止进入死循环。工程上更稳妥的做法是加一个超时计数器:如果循环执行超过一定次数,主动退出并返回错误标志。这尤其重要,因为工业现场偶发干扰可能导致硬件状态卡死。
4.3 时钟极性与相位:最容易搞错的地方
SPI 的苏格拉底式难点就是时钟极性 CPOL 和时钟相位 CPHA。不同从机芯片要求不同,一旦配错,现象非常隐蔽:数据读出来经常是反的,或者偶发错位,用示波器看波形又觉得"大体像样"。
用 MAX14431BAEE+ 隔离器后,波形会经过一个额外的延迟,这不会改变 SPI 模式本身,但会让采样窗口发生偏移。假如你原来在普通链路上用的 Mode 0 工作正常,加上隔离器后从机侧接收到的 MOSI 数据变化沿会比 SCLK 边沿晚几个纳秒到几十纳秒。如果从机要求的建立时间很短,问题不大;如果从机采样点离数据变化沿很近,就会随机出错。
这时候不要急着改模式,先把示波器接到隔离器输出端,检查实际波形和从机要求的时序是否一致。如果相差不大,可以降低 SPI 时钟频率,给数据建立时间留出更多余量。如果必须保持高速,再考虑调整 CKE 位,让数据变化沿和采样沿之间的距离重新对齐。
4.4 中断方式与轮询方式的取舍
轮询方式代码简单,但会占用 CPU 资源,而且如果从机长时间不回应,容易卡死主流程。在工业应用里,我一般建议用 SPI 接收中断配合超时定时器。
PIC18F87K22 的 MSSP 模块在接收到一个字节时会产生 SPI 中断。中断服务程序里读取接收缓冲,将数据放入环形缓冲区,主程序再从环形缓冲区里取数解析。这样 SPI 通信不阻塞主循环,即使从机偶发异常导致某个字节丢失,主程序也不会卡在等待标志位上。
void __interrupt() ISR(void) { if (PIR1bits.SSP1IF) { unsigned char data = SSP1BUF; // 将 data 写入环形缓冲区 PIR1bits.SSP1IF = 0; } }注意中断服务程序里读取 SSP1BUF 后要手动清除中断标志。如果同一时刻发生其他中断,要注意现场保护。PIC18F87K22 的中断优先级和现场保存逻辑比较复杂,初次使用时要仔细阅读数据手册。
5. 上电实测中的时序校准与异常处理:隔离链路不比普通线
5.1 先从波形开始
把板子通上电,先用示波器测量隔离器两侧的波形。注意探头的地夹要就近接在各自侧的地上,不要跨接两侧地,否则等于人为制造地环路,波形全是噪声。
测量点至少要包括四个:主机 MCU 引脚处的 SCLK、MAX14431BAEE+ 输入侧的 SCLK、输出侧的 SCLK、从机 MISO 回到 MCU 侧的波形。通过对比输入和输出,可以看到隔离器引入的延迟量和通道间的偏斜。
实际测量时,最直观的现象是输出侧的 SCLK 比输入侧晚到了几十纳秒。这本身没问题,问题在于 MOSI 和 MISO 这两条数据路径和 SCLK 路径的延迟是否一致。如果数据路径的延迟比时钟路径大很多,从机就会采错。
5.2 时序估算:做一个简单的数据手册算术题
隔离器的传播延迟和通道间偏斜是两个必须考虑的参数。假设 MAX14431BAEE+ 的典型传播延迟是 20ns,通道间偏斜是 5ns,再加上 PCB 走线长短差异带来的 2ns 偏差,那么从主机发出一个数据位到从机正确采样,实际需要留出的建立时间余量就要大于 27ns。
举个具体例子。如果 SPI 时钟是 10MHz,周期为 100ns。SCLK 和数据同时经过隔离器,数据通道比时钟通道慢 7ns 的话,从机采样的建立时间只剩 100ns 的一半减去 7ns,大概 43ns。如果从机要求的建立时间是 30ns,余量只有 13ns,勉强能工作,但温度变化、电源波动就可能压垮这个余量。
所以对于 10MHz 的 SPI 隔离链路,一定要仔细查数据手册的时序参数,最好把偏斜也考虑进去。如果在 1MHz 下工作,时钟周期是 1000ns,同样的延迟只占很小比例,就非常稳。
5.3 常见问题排查表
实践中我整理过一份排查表,适合隔离 SPI 链路不通或者数据错乱时逐项检查。
| 现象 | 可能原因 | 处理办法 |
|---|---|---|
| 完全无通信 | 隔离器两侧电源或地接错 | 检查电源和地网络,确认隔离器两侧独立 |
| 数据错位或周期性错位 | SPI 模式配置错误 | 对照从机数据手册,用示波器验证时钟和数据沿关系 |
| 偶发单个字节错误 | 时钟频率过高,建立时间不足 | 降低 SPI 频率,增加位与位之间的余量 |
| MISO 信号悬浮 | 上拉电阻位置不对,或从机掉电 | 在 MCU 侧加合适上拉电阻 |
| 传输速率不稳定 | 隔离电源纹波偏大 | 加大电源滤波电容,或更换低纹波隔离电源模块 |
| CS 拉低后立刻通信失败 | CS 延迟不够 | 增加 CS 拉低后到发送时钟的延时 |
这个表不是标准答案,但覆盖了隔离 SPI 调试中最常见的几个方向。遇到问题时先用示波器确认是电平问题还是时序问题,再查软件逻辑,比盲目改代码有效得多。
5.4 隔离电源不稳带来的"假故障"
有一个坑特别隐蔽,就是隔离器两侧电源不稳导致的通信异常。MAX14431BAEE+ 的输出驱动能力和输入阈值都依赖于电源电压。如果从机侧的隔离电源模块功率不够,或者纹波过大,隔离器输出波形会变形,但示波器看过去又不像直接短路那么严重。
最典型的现象是:常温下测试一切正常,机柜一运行,温度升高,隔离电源模块输出下降,SPI 偶发错字节。排查时先量隔离器两侧电源电压,看看在通信过程中有没有明显跌落。再检查隔离电源模块的带载能力,数字隔离器虽然功耗不高,但瞬态开关动作还是会有电流尖峰。
如果发现电源纹波大,最简单的解决办法是在隔离器电源引脚附近并联一个 10uF 钽电容和 0.1uF 陶瓷电容组合。如果还不够,就要换隔离电源模块了。
6. 隔离方案还能应用到哪些场景:从 MCU 到 DSP 启动、FPGA 和 Linux 系统
6.1 高速 DSP 的 SPI 启动链路隔离
SPI 隔离不只是 8 位单片机的专利。很多 DSP 支持通过 SPI 接口从外部 Flash 启动,比如 TI 的 C6678 等器件。这类场景里,DSP 的启动 ROM 在复位后会对 SPI 从机(通常是 SPI NOR Flash)发起固定时序的读操作,容不得 SPI 从机应答速度太慢。
如果因为隔离需求在这条启动链路上加了数字隔离器,必须确认隔离器上电后的默认输出状态不要影响 Flash 的片选和 SPI 应答。有些隔离器在上电瞬间输出高电平,可能让从机误以为 CS 无效,导致启动失败。选型号时要关注隔离器的上电时序和默认输出电平,最好在数据手册里找到 Power-Up 章节确认。
6.2 FPGA 与处理器之间的隔离桥接
FPGA 和处理器之间通过 SPI 交换数据也很常见。这里隔离器两端通常都是数字逻辑,不存在电平兼容问题,但要注意时钟频率。FPGA 端常常会把 SPI 时钟拉到几十 MHz,这时普通数字隔离器的延迟会在时序上产生明显影响。
我的建议是,FPGA 端的 SPI 控制器可以做成参数化设计,支持在数据采样之前插入一个可配置的延迟周期。这样即使隔离器引入了固定延迟,也可以通过调整 FPGA 内部逻辑来补偿。相比修改 PCB 布线,软逻辑上的时序调整更加方便。
6.3 SPI Flash 与嵌入式 Linux 下 SPI 隔离
嵌入式 Linux 系统里,SPI 总线通常挂载 SPI NOR Flash、SPI 温度传感器等设备。设备树里配置 spi-master、spidev、flash 节点时,物理层上加了隔离器并不会改变软件接口,所以一般不需要改设备树。
但要注意,Linux 下 SPI 传输的速度通常由 master 驱动决定。如果原设计跑 20MHz,加隔离器后延迟变大,就要在设备树里把 spi-max-frequency 调低。否则系统启动时识别 Flash 的时序可能不稳定,出现无法挂载根文件系统的情况。
另外,如果隔离器两侧电源上电顺序不一致,可能导致 Linux 启动过程中对 SPI 设备的探测失败。解决办法是确保隔离器两侧电源同时上电,或者在主控侧加一个电源监控电路,等两侧电源都稳定后再给主控复位。
6.4 什么时候不要做隔离
最后泼点冷水。隔离 SPI 不是万能的,也不是所有 SPI 链路都需要隔离。如果主控板和从机板在同一块 PCB 上,地平面完整,功率干扰不大,强行加隔离器反而引入传播延迟、增加成本、占用板卡面积。
我在设计初期会做一个判断:信号线是否跨接两个不同电源域?两块板之间的地电位是否存在明显差异?现场是否有强干扰源?如果三个问题的答案都是否,那不需要隔离。如果一个答案是是,那隔离器就是值得的投资。
最后:隔离 SPI 最大的坑其实在时序余量
如果把这次改造重新走一遍,我最深的体会是:隔离 SPI 没有多难,难的是把时序预算想清楚。器件选型、原理图、PCB 布局、软件配置,每一步都在为"建立时间和保持时间"这两个数字服务。换成 MAX14431BAEE+ 这类的数字隔离器之后,别再拿它当普通导线看待,它引入的延迟是实实在在的。
调试时建议先用示波器把隔离器两侧的波形都抓一遍,搞清楚实际延迟是多少,然后把 SPI 频率从低到高慢慢调。只要时序余量充足,隔离链路就和普通 SPI 一样稳定。至于我当初那台包装机控制器,隔离后的 SPI 链路在变频器紧挨着控制器的情况下跑了一年没再出过错。