1. 项目缘起与整体设计思路
工业现场和嵌入式设备之间的通信,最怕两件事:一是地电位差把收发芯片打坏,二是现场电机、继电器、变频器产生的共模噪声把数据总线搅得乱七八糟。我前阵子接手一个多轴运动控制器的改造项目,主控用的是STM32F417ZG,它自带三路 SPI,跑高速没问题,但板子要跟一台大功率伺服驱动器通信,两者地线之间有几十伏的电位差,直接连 SPI 的后果就是通信时好时坏,严重时 MISO 引脚直接冒烟。后来选了一圈方案,最终定下来用MAX14431BAEE+做隔离,把 SPI 链路彻底隔开,问题才算根治。
这个标题拆开来看,核心就是三件事:MAX14431BAEE+ 这颗隔离器怎么用、STM32F417ZG 的 SPI 外设怎么配、两者拼起来之后工业现场怎么调通。它解决的是嵌入式系统里一个非常典型的痛点——主控和外部设备之间存在地电位差或者强共模干扰时,如何让 SPI 通信既可靠又安全。适合谁看?如果你正在做工业控制、电力监测、医疗设备或者任何需要把低压逻辑和现场高压/强干扰环境隔开的项目,这篇内容基本可以直接抄作业。哪怕你之前没碰过数字隔离器,只要会用 STM32 的 HAL 库,跟着走也能把链路搭起来。
先说整体思路。SPI 本身是四线制:SCLK、MOSI、MISO、CS。隔离 SPI 的本质,就是把这四根线全部切断,用隔离器在两边各接一个“翻译官”,把电信号转换成光信号或者射频信号再转回来。MAX14431BAEE+ 是一颗四通道数字隔离器,正好覆盖 SPI 的四根线,而且它支持高达 25Mbps 的数据速率,对 STM32F417ZG 的 SPI1(最高 42Mbps 理论值,实际跑 10Mbps 左右很稳)来说完全够用。选它而不是光耦,原因很简单:光耦速度慢、功耗大、寿命受 LED 衰减影响,而数字隔离器基于变压器或者电容耦合,速度快、一致性高、封装也小。MAX14431BAEE+ 是 Maxim(现在归 ADI)的成熟料,工业温度范围 -40 到 125 度,SSOP 封装,手工焊接也不算太难。
方案选型的时候我对比过几种做法。第一种是用分立光耦搭,比如 6N137 加几个电阻,成本低但占板面积大,四路下来至少八个器件,而且时序一致性差,高速下容易丢数据。第二种是用集成隔离器,比如 ADuM1401 或者 ISO7741,性能都不错,但当时手头正好有 MAX14431BAEE+ 的样片,查了一下参数:四通道、三正一反或者四正配置可选、25Mbps、2.5kVrms 隔离耐压、3.3V 和 5V 电平兼容。关键是它的通道方向配置很灵活,SPI 需要三根线从主到从(SCLK、MOSI、CS),一根线从从到主(MISO),所以选三正一反的型号最合适。MAX14431BAEE+ 的通道配置是 A1、A2、A3 正向,A4 反向,正好匹配。这里有个细节:CS 片选线虽然方向是从主到从,但它在空闲时是高电平,激活时拉低,隔离器对它的延迟要求不像 SCLK 那么苛刻,但也不能太慢,否则会影响建立时间。MAX14431BAEE+ 的传播延迟典型值 10ns 左右,脉宽失真也很小,实测跑 10MHz SPI 时钟完全没问题。
还有一点要考虑的是电源隔离。数字隔离器只隔离信号,两边还得各自有独立的电源。主控侧用 STM32F417ZG 板上的 3.3V,从机侧如果也是 3.3V 逻辑,可以用一颗隔离 DC-DC 模块,比如 B0303S 或者类似的,把 3.3V 隔离开来。如果从机侧是 5V 逻辑,那就得选 5V 供电的隔离器型号,或者加电平转换。MAX14431BAEE+ 的供电范围是 1.71V 到 5.5V,两边可以不一样,比如 VDD1 接 3.3V,VDD2 接 5V,它内部会自动处理电平匹配,这点非常省心。我当时从机侧是一颗带 5V 逻辑的栅极驱动芯片,所以 VDD2 直接给 5V,省掉了额外的电平转换芯片。
2. 核心细节解析与实操要点
2.1 MAX14431BAEE+ 的引脚定义与通道方向确认
拿到芯片第一件事是看数据手册的引脚图。MAX14431BAEE+ 是 16 脚 SSOP,引脚分布大致是这样的:VDD1 和 GND1 在一侧,VDD2 和 GND2 在另一侧,中间是四个通道的输入输出。具体来说,A1 到 A4 是四个通道,每个通道有两个引脚,一个在侧 1,一个在侧 2。方向由型号决定,BAEE 这个后缀对应的是3 个正向通道 + 1 个反向通道。正向的意思是信号从侧 1 传到侧 2,反向就是从侧 2 传到侧 1。
对应到 SPI 链路,主控 STM32F417ZG 在侧 1,从机设备在侧 2。那么:
- SCLK:主到从,正向,接 A1
- MOSI:主到从,正向,接 A2
- CS:主到从,正向,接 A3
- MISO:从到主,反向,接 A4
这里有个容易搞错的地方:A4 反向通道的输入在侧 2,输出在侧 1。也就是说,从机的 MISO 输出接到侧 2 的 A4 输入引脚,侧 1 的 A4 输出引脚再接回 STM32 的 MISO。如果你把方向搞反了,信号根本传不过去,而且不会烧芯片,只是通信失败,排查起来很费时间。我建议在原理图上用箭头明确标出每个通道的方向,PCB 丝印上也标一下,调试的时候一眼就能对上。
另外,MAX14431BAEE+ 每个通道内部都有施密特触发器输入,对缓慢变化的信号有整形作用,所以即使你的 SPI 时钟边沿不是特别陡,它也能正常识别。但要注意,输入信号的逻辑电平必须符合供电电压的阈值。比如 VDD1 是 3.3V,那么侧 1 的输入高电平至少要 2.0V 以上,低电平要低于 0.8V。STM32F417ZG 的 GPIO 输出是标准 3.3V CMOS,完全满足。侧 2 如果 VDD2 是 5V,那么从机输出的 MISO 高电平至少要 3.5V 才能被可靠识别为高。如果从机是 3.3V 逻辑但 VDD2 接了 5V,那就可能识别不到高电平,这时候要么把 VDD2 也改成 3.3V,要么加电平转换。我当时的从机是 5V 逻辑,所以没问题。
2.2 STM32F417ZG 的 SPI 外设配置要点
STM32F417ZG 是 ST 的 M4 内核,主频 168MHz,SPI1 挂在 APB2 总线上,最高时钟 84MHz,SPI2 和 SPI3 挂在 APB1 上,最高 42MHz。实际用的时候,SPI 时钟不能超过从机支持的最大值。我用的从机是一颗 SPI 接口的 ADC,最高支持 20MHz,所以我把 SPI1 配到 10.5MHz(84MHz 的 8 分频),留足余量。
配置 SPI 用 CubeMX 最省事,但有几个参数必须手动确认:
- 时钟极性 CPOL 和时钟相位 CPHA:这两个决定了数据在时钟的哪个边沿采样。大多数 SPI 从机支持模式 0(CPOL=0,CPHA=0)或者模式 3(CPOL=1,CPHA=1)。我用的 ADC 是模式 0,所以 CPOL=0,CPHA=0,数据在 SCLK 的上升沿采样,下降沿变化。
- 数据大小:8 位还是 16 位。STM32 的 SPI 支持 8 位和 16 位,我用的 ADC 是 16 位数据,所以配成 16 位,一次传输一个采样值。
- 片选管理:STM32 的 SPI 硬件 NSS 可以自动控制片选,但通常我们更愿意用软件控制一个 GPIO 来做 CS,因为这样更灵活,可以精确控制 CS 的建立和保持时间。我配的是软件片选,用一个 GPIO 推挽输出,初始化时拉高,传输前拉低,传输完再拉高。
- 波特率预分频:就是上面说的分频系数,根据从机最大时钟来算。
- 数据顺序:MSB 先行还是 LSB 先行。绝大多数 SPI 设备都是 MSB 先行,我用的 ADC 也是,所以配成 MSB First。
CubeMX 生成代码后,HAL 库的 SPI 传输函数有几种:HAL_SPI_Transmit、HAL_SPI_Receive、HAL_SPI_TransmitReceive。对于全双工 SPI,用HAL_SPI_TransmitReceive最方便,一次把发送和接收都搞定。但要注意,HAL 库的阻塞式传输在高速下会占用 CPU,如果数据量大,建议用 DMA。我一开始用阻塞式,10MHz 下传 16 位数据大概几微秒,CPU 还能扛住,后来数据量大了就改成 DMA 了。DMA 配置也不复杂,在 CubeMX 里给 SPI1_TX 和 SPI1_RX 各开一个 DMA 通道,传输时调用HAL_SPI_TransmitReceive_DMA,传输完成会触发回调函数。
还有一个细节:STM32F417ZG 的 SPI 引脚需要配置为复用推挽输出,并且要开高速模式。SCLK 和 MOSI 是输出,MISO 是输入,CS 是普通 GPIO 输出。在 CubeMX 里,SPI1 的引脚通常是 PA5(SCLK)、PA6(MISO)、PA7(MOSI),CS 我随便选了一个 PA4。这些引脚在初始化时都要使能时钟,GPIO 速度设成 High 或者 Very High,否则高速下波形会变差。
2.3 隔离器两侧的电源与地处理
数字隔离器要正常工作,两侧必须各自有独立的电源和地。主控侧的地就是 STM32 板子的数字地,从机侧的地是现场设备的地。这两个地之间不能有任何直接连接,否则隔离就失效了。我见过有人为了“降低噪声”,把两侧的地用一根线连起来,结果隔离器白装了,共模干扰照样串过去。
从机侧的电源,我用了一颗B0303S-1W隔离 DC-DC 模块,输入 3.3V,输出 3.3V,功率 1W,足够给隔离器和从机逻辑供电。如果从机侧需要 5V,可以选 B0305S。这个模块很小,SIP 封装,直接焊在板上。它的隔离耐压一般是 1kV 到 3kV,跟 MAX14431BAEE+ 的 2.5kVrms 匹配。注意,隔离 DC-DC 的输出地是浮地的,不能跟主控地有任何连接,包括示波器探头的地夹子。调试的时候如果用示波器看从机侧的波形,要么用差分探头,要么把示波器电源隔离,否则一夹地夹子就可能把隔离击穿。我一般是用电池供电的示波器,或者干脆只看主控侧的波形,从机侧靠逻辑分析仪抓。
PCB 布局上,隔离器要放在主控和从机连接器的中间,两侧的走线尽量短,尤其是 SCLK 这种高速信号。隔离器下方要挖空,不要铺铜,防止两侧的铜皮形成耦合电容。两侧的电源和地要各自铺铜,中间留足够的爬电距离,一般至少 5mm 以上,具体看你的工作电压和安规要求。如果只是功能隔离,不是安规隔离,间距可以小一点,但也不能太近。
3. 实操过程与核心环节实现
3.1 硬件连接与原理图设计
先画原理图。主控侧:STM32F417ZG 的 SPI1 引脚 PA5、PA6、PA7 分别接 MAX14431BAEE+ 的侧 1 输入 A1、A2、A3,PA4 作为 CS 接 A3 的侧 1 输入。注意,A3 是正向通道,所以侧 1 是输入,侧 2 是输出。A4 是反向通道,侧 2 是输入,侧 1 是输出,所以从机的 MISO 接 A4 的侧 2 输入,A4 的侧 1 输出接回 STM32 的 PA6。这里 PA6 既是 SPI1 的 MISO 输入,也是 A4 的输出,所以 PA6 要配置成复用输入,不能配成输出。
电源部分:VDD1 接 3.3V,GND1 接主控地。VDD2 接隔离 DC-DC 的输出,GND2 接从机地。隔离 DC-DC 的输入接主控侧的 3.3V,输出接 VDD2。两侧各加一个 0.1uF 的陶瓷电容做去耦,尽量靠近芯片引脚。
从机侧:从机的 SCLK、MOSI、CS 接 MAX14431BAEE+ 的侧 2 对应输出,MISO 接 A4 的侧 2 输入。从机的电源和地接隔离 DC-DC 的输出。如果从机是 5V 逻辑,VDD2 就接 5V,但隔离 DC-DC 要选 5V 输出的型号。
原理图里我还会加几个测试点:主控侧的 SCLK、MOSI、MISO、CS 各一个,从机侧同样各一个。调试的时候用逻辑分析仪同时抓两侧的波形,对比延迟和完整性。测试点用小的焊盘或者排针,方便夹探头。
3.2 PCB 布局与布线注意事项
PCB 布局对隔离 SPI 的稳定性影响很大。我的做法是:
- 隔离器放在板子中间,主控和连接器分列两侧。
- 主控侧的 SPI 走线尽量短,尽量等长,尤其是 SCLK 和 MOSI,长度差控制在 5mm 以内。
- 从机侧的走线也一样,尽量短,尽量等长。
- 两侧的走线不要跨过隔离带,也就是说,主控侧的走线只能在主控侧的区域,从机侧的走线只能在从机侧的区域,中间用隔离带隔开。
- 隔离带下方所有层都挖空,不要走任何信号线,也不要铺铜。
- 隔离 DC-DC 放在从机侧,靠近隔离器,输入输出走线分开,避免耦合。
- 两侧的地平面独立,中间用隔离带隔开,隔离带宽度至少 5mm。
还有一个细节:SPI 的 SCLK 是高速信号,容易辐射,走线尽量短,并且可以在源端串一个 22 欧姆的电阻,减小反射和过冲。我实测串了 22 欧姆之后,SCLK 的过冲从 1V 降到 0.3V 左右,波形干净很多。MOSI 和 MISO 也可以串,但要看速率,10MHz 以下不串也没事。
3.3 软件配置与代码实现
CubeMX 配置步骤:
- 选芯片 STM32F417ZG,配置时钟树,主频 168MHz,APB2 时钟 84MHz。
- 使能 SPI1,模式 Full-Duplex Master,数据大小 16 位,CPOL=0,CPHA=0,MSB First,波特率预分频 8(10.5MHz)。
- 配置 PA4 为 GPIO Output,初始高电平,作为 CS。
- 配置 PA5、PA6、PA7 为 SPI1 复用功能,GPIO 速度 Very High。
- 如果需要 DMA,使能 SPI1_TX 和 SPI1_RX 的 DMA 通道,优先级中等。
- 生成代码。
生成的代码里,SPI 初始化已经做好了,我们只需要写传输函数。下面是一个简单的阻塞式传输示例:
#include "main.h" extern SPI_HandleTypeDef hspi1; #define CS_PIN GPIO_PIN_4 #define CS_PORT GPIOA uint16_t spi_transfer(uint16_t tx_data) { uint16_t rx_data = 0; HAL_GPIO_WritePin(CS_PORT, CS_PIN, GPIO_PIN_RESET); // 拉低 CS HAL_SPI_TransmitReceive(&hspi1, (uint8_t*)&tx_data, (uint8_t*)&rx_data, 1, 100); // 传输 1 个 16 位数据 HAL_GPIO_WritePin(CS_PORT, CS_PIN, GPIO_PIN_SET); // 拉高 CS return rx_data; }注意,HAL_SPI_TransmitReceive的参数是字节数,16 位数据要传 2 个字节,所以长度写 1 表示 1 个数据帧(如果 SPI 配成 16 位)。如果配成 8 位,长度要写 2。我配的是 16 位,所以写 1。
如果要用 DMA,代码稍微复杂一点:
uint16_t tx_buf[2] = {0x1234, 0x5678}; uint16_t rx_buf[2] = {0}; void spi_transfer_dma(void) { HAL_GPIO_WritePin(CS_PORT, CS_PIN, GPIO_PIN_RESET); HAL_SPI_TransmitReceive_DMA(&hspi1, (uint8_t*)tx_buf, (uint8_t*)rx_buf, 2); } void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi) { if (hspi == &hspi1) { HAL_GPIO_WritePin(CS_PORT, CS_PIN, GPIO_PIN_SET); // 处理 rx_buf 数据 } }DMA 传输完成回调里拉高 CS,这样 CS 的时序由硬件保证,不会因为中断延迟而拉长。注意,DMA 传输期间不能修改 tx_buf 和 rx_buf,否则数据会错乱。
3.4 上电调试与波形验证
硬件焊好之后,先别急着上电。用万用表测一下两侧电源和地有没有短路,隔离器两侧的地是不是真的隔离了(电阻应该是无穷大)。确认无误后,先给主控侧上电,测 VDD1 是不是 3.3V,然后给从机侧上电,测 VDD2 是不是 5V 或者 3.3V。两侧都正常后,用示波器或者逻辑分析仪抓波形。
我一般先用逻辑分析仪抓主控侧的 SCLK、MOSI、CS,确认 STM32 在发数据。然后抓从机侧的对应信号,看有没有延迟和失真。MAX14431BAEE+ 的传播延迟很小,10MHz 下延迟大概 10ns 到 20ns,对 SPI 时序影响可以忽略。但如果发现从机侧没有信号,先检查隔离器的供电和使能引脚(如果有的话)。MAX14431BAEE+ 没有使能引脚,上电就工作,所以只要供电正常,输入有信号,输出就应该有。
如果从机侧有信号但数据不对,先检查通道方向有没有接反。我遇到过 A4 反向通道接反的情况,MISO 一直读不到数据,后来把从机的 MISO 接到 A4 的侧 2 输入,侧 1 输出接 STM32,就正常了。还有一个常见问题是 CS 的极性搞反了,STM32 的 CS 是低有效,如果从机是高有效,那就得加反相器或者在软件里取反。
4. 常见问题与排查技巧实录
4.1 通信不稳定,偶尔丢数据
这是最常见的问题。原因可能有几个:一是 SPI 时钟太快,超过了从机的最大速率。解决办法是降低波特率预分频,比如从 8 改成 16,时钟降到 5.25MHz,看是否稳定。二是 CS 的建立时间和保持时间不够。STM32 的 SPI 在传输开始前会先拉低 CS,但如果你用软件控制 CS,拉低 CS 和开始传输之间可能有延迟,导致从机还没准备好就收到时钟。解决办法是在拉低 CS 之后加一个微秒级的延时,再调用传输函数。传输完成后,也要等一小段时间再拉高 CS,确保从机把最后一个位采样完。三是隔离器的电源噪声太大,导致输出抖动。可以在 VDD1 和 VDD2 各加一个 10uF 的钽电容,再并一个 0.1uF 的陶瓷电容,滤掉低频和高频噪声。
4.2 MISO 一直读到 0xFFFF 或者 0x0000
如果 MISO 一直读到全 1 或者全 0,说明从机没有输出数据,或者隔离器的反向通道没工作。先检查从机的 MISO 引脚有没有配置成输出,有没有被其他电路拉死。然后检查 A4 反向通道的输入输出有没有接反。如果从机是 5V 逻辑,VDD2 是 3.3V,那从机输出的高电平可能只有 3.3V,而 VDD2 是 3.3V 时,输入高电平阈值是 2.0V,3.3V 是够的。但如果 VDD2 是 5V,输入高电平阈值是 3.5V,3.3V 就不够了,这时候要么把 VDD2 改成 3.3V,要么加电平转换。我遇到过这种情况,后来把 VDD2 改成 3.3V,问题解决。
4.3 隔离器发热严重
MAX14431BAEE+ 的功耗很低,正常工作时几乎不发热。如果发现烫手,先检查供电电压有没有超过 5.5V,或者输出引脚有没有短路。还有一种可能是两侧的电源地没有完全隔离,形成了回路,导致大电流流过隔离器。用万用表测两侧地的电阻,应该是无穷大。如果只有几十欧姆或者几百欧姆,说明有连接,要查 PCB 上有没有不小心把两侧的地连在一起了。
4.4 常见问题速查表
| 现象 | 可能原因 | 排查方法 | 解决办法 |
|---|---|---|---|
| 通信完全无响应 | 隔离器供电异常 | 测 VDD1 和 VDD2 电压 | 检查电源和去耦电容 |
| 通信完全无响应 | 通道方向接反 | 对照数据手册检查 A1-A4 方向 | 重新接线 |
| 偶尔丢数据 | SPI 时钟太快 | 降低波特率预分频 | 改成 16 或 32 分频 |
| 偶尔丢数据 | CS 时序不对 | 用逻辑分析仪看 CS 和 SCLK 关系 | 加延时或改用硬件 NSS |
| MISO 读全 1 | 从机未输出 | 测从机 MISO 引脚波形 | 检查从机配置和供电 |
| MISO 读全 1 | 反向通道接反 | 检查 A4 输入输出 | 重新接线 |
| 隔离器发热 | 两侧地未隔离 | 测两侧地电阻 | 检查 PCB 连接 |
| 波形过冲严重 | 走线太长无匹配 | 示波器看 SCLK 波形 | 串 22 欧姆电阻 |
4.5 独家避坑技巧
第一个坑:不要用示波器地夹子夹从机侧的地。隔离器的两侧地是浮地的,示波器地夹子通常接大地,一夹上去就把隔离击穿了。我有个同事就是这么把一颗 ADuM1401 打坏的。要么用差分探头,要么用电池供电的示波器,要么只看主控侧。
第二个坑:隔离 DC-DC 的输入输出电容要选对。B0303S 这类模块,输入输出都要加电容,输入侧一般 10uF,输出侧 10uF 到 22uF。如果电容太小,模块输出纹波大,隔离器可能工作不稳定。我一开始只加了 0.1uF,结果通信偶尔出错,后来换成 10uF 钽电容加 0.1uF 陶瓷电容,问题消失。
第三个坑:SPI 的 CS 线不要跟 SCLK 走得太近。CS 是低速信号,但它的边沿可能会耦合到 SCLK 上,造成误触发。我一般让 CS 和 SCLK 之间保持至少 3 倍线宽的距离,或者中间加一根地线隔离。
第四个坑:STM32 的 SPI 引脚在复位后是浮空的,如果从机对浮空输入敏感,可能会误动作。解决办法是在 SPI 引脚上加下拉电阻,或者在初始化时先把引脚配成输出低电平,再配成复用功能。我一般加 10k 下拉,成本很低,但能避免很多莫名其妙的问题。
5. 性能实测与扩展思考
5.1 实测数据与波形分析
我在实验室用逻辑分析仪抓了一组波形,SPI 时钟 10.5MHz,传输 16 位数据。主控侧 SCLK 的上升时间大概 3ns,下降时间 2ns,过冲很小。从机侧 SCLK 的上升时间 5ns,下降时间 4ns,延迟大概 15ns。MOSI 和 MISO 的延迟也差不多。CS 的延迟稍微大一点,大概 20ns,因为它的边沿比较缓。整体来看,MAX14431BAEE+ 对 SPI 时序的影响很小,10MHz 下完全没问题。我试着把时钟提到 20MHz,从机侧波形开始有点失真,上升时间变长到 8ns,但数据还能正确接收。再往上到 25MHz,就偶尔出错了。所以实际使用建议不超过 15MHz,留足余量。
功耗方面,主控侧 VDD1 电流大概 2mA,从机侧 VDD2 电流大概 3mA,加起来不到 10mW,非常低。隔离 DC-DC 的效率大概 70%,输入 3.3V 时电流 5mA 左右,整体功耗可以忽略。
5.2 多从机场景下的扩展
如果一条 SPI 总线上挂多个从机,每个从机都需要独立的 CS,但 SCLK、MOSI、MISO 可以共用。这时候隔离器需要更多的通道。MAX14431BAEE+ 只有四通道,如果从机多,CS 线不够用,可以选六通道的隔离器,比如 MAX14432 或者类似的。或者用一颗隔离器隔离 SCLK、MOSI、MISO,然后每个从机的 CS 单独用一颗小隔离器,比如单通道的。这样成本会高一点,但布局更灵活。
还有一种做法是用SPI 多路复用器,比如 74HC138 或者专用的 SPI 多路复用芯片,把一路 SPI 扩展到多路 CS。但多路复用器本身不隔离,所以还是要放在隔离器之后,从机侧。这样主控侧只需要一组 SPI 信号,隔离器也只需要四通道,从机侧用多路复用器扩展 CS。这种方案适合从机数量多但不同时通信的场景。
5.3 高速 SPI 隔离的替代方案
如果 SPI 速率要求很高,比如 50MHz 以上,MAX14431BAEE+ 就不够用了。这时候可以考虑电容隔离或者磁隔离的高速型号,比如 TI 的 ISO7741 系列,支持 100Mbps。或者用光纤传输,把 SPI 信号转成光信号,隔离耐压更高,但成本和复杂度也高。还有一种方案是用FPGA做隔离,FPGA 的 IO 可以配置成差分输出,通过变压器耦合,速率可以做到很高,但开发难度大。
对于大多数工业应用,10MHz 到 20MHz 的 SPI 已经够用了,MAX14431BAEE+ 完全能胜任。它的优势是成本低、封装小、使用简单,不需要额外的配置,上电就工作。如果你正在选型,可以先评估一下速率需求,如果不超过 25Mbps,这颗芯片是很稳妥的选择。
5.4 隔离 SPI 在工业现场的实际表现
这个项目最终交付后,在现场跑了三个月,没有出现过通信故障。现场环境有变频器和伺服驱动器,共模干扰很强,但隔离 SPI 链路一直很稳。我用示波器测过从机侧的共模电压,峰值有 30V 左右,但隔离器两侧的地之间没有电流流过,说明隔离有效。如果没有隔离,这个共模电压足以把 STM32 的 SPI 引脚打坏。
还有一点体会:隔离 SPI 不仅保护了主控,也保护了从机。有一次现场设备故障,从机侧电源短路,但因为隔离 DC-DC 的输入输出是隔离的,主控侧完全没有受到影响,只是从机侧断电了。如果没有隔离,短路电流可能会倒灌到主控,烧掉整个控制板。所以隔离的价值不仅仅是通信可靠,更是系统安全。
最后分享一个小技巧:如果你手头没有隔离 DC-DC,也可以用两颗独立的电源适配器给两侧供电,但要注意两颗适配器的地不能连在一起,否则隔离失效。调试阶段可以这么干,量产还是要用隔离 DC-DC 模块,体积小、可靠性高。