1. 电机一启动SPI就从设备乱码:隔离不是可选项
我第一次遇到这个问题,是在一套伺服驱动器参数采集板上。MCU用的就是R7FA2E1A92DFM,通过SPI去读安装在电机附近的编码器数据,板子和编码器之间用了一根一米多的屏蔽线。样机在实验室调了三天,一切正常,数据一帧不差。结果装到车间里,变频器一启动,采集回来的数据立刻开始跳,时不时冒出一个完全不可能的角度值。
示波器夹上去的瞬间,问题就清楚了:SCLK和MOSI上叠着一大片共模毛刺,MISO那边更惨,波形都快看不出方波的样子了。根本原因不是程序逻辑,而是两边设备的地电位在电机启停瞬间被拉得来回漂。SPI这种单端同步接口,天生对地电位差敏感,一旦主控端和从设备端的地不在同一电位,数据就是会莫名其妙地错。这就是为什么在工业和嵌入式应用里,SPI通信链路隔离不是选配件,而是必选项。
1.1 地环路是怎么把数据"抹平"的
SPI的原理说起来很简单:主设备产生时钟SCLK,在时钟沿上把MOSI上的数据发给从设备,同时从设备把自己的数据放到MISO上。四条线——SCLK、MOSI、MISO、片选CS——全部是单端信号,也就是说,接收端判断高低电平,参考的是自己那一侧的GND。
问题就出在这个"自己那一侧的GND"上。工业现场有大功率负载启停、变频器PWM斩波、继电器吸合,这些都会在接地回路里感应出瞬态电流。当主控板和远端设备之间有一条长长的线缆时,线缆的地线本身就是这个回路的一部分。远端设备的地电位并不等于主控板的地电位,两者之间可能有几伏甚至更高的瞬态压差。
我用个直白的方式算一笔账:3.3V逻辑的SPI,高电平阈值一般是0.7×VDD,也就是2.31V,低电平阈值一般是0.3×VDD,也就是0.99V。如果远端设备的地电位比主控板的地电位抬高了2V,那么主控板发出的3.3V高电平,到远端设备眼里就只剩1.3V,直接落到高低电平阈值之间的灰色地带。接收端采样到的是不是原来的数据全看运气,表现出来就是偶发错位、整帧乱码、寄存器读到异常值。
这种共模干扰往往是宽频带的,从几百赫兹到几十兆赫兹都可能有能量,单纯靠加电容滤波压不住,加大串联电阻也只会让信号边沿更差。最彻底的办法,就是切断两端之间的地回路,让两边的地电位可以各走各的。
1.2 为什么没人愿意用光耦做SPI隔离
很多老一辈工程师听到"隔离"两个字,条件反射就是光耦。光耦隔离低速IO、隔离继电器控制信号确实成熟稳定,便宜又皮实。但拿来做SPI隔离,体验相当难受。
首先是速度问题。普通光耦的传播延迟动辄几微秒,高速光耦也得几百纳秒。SPI跑到4MHz时一个时钟周期只有250ns,光耦的延迟比一个完整时钟周期还长,这根本没法用。其次是通道数量和方向。SPI最少四根线,其中SCLK、MOSI、CS是主到从方向,MISO是从到主方向,光耦本身是单向器件,一堆通道里还得专门区分输入和输出方向,搭出来的电路板面积和功耗都很难看。还有电流传输比的老化问题——光耦的CTR会随着使用时间和温度漂移,工业环境里这又是一个隐患。
数字隔离器是另一个思路。它用电容或电感耦合的方式跨过隔离栅传输数字信号,输入端和输出端之间没有电气连接,但信号依然能完整传过去。数字隔离器的传播延迟可以做到几十纳秒量级,数据速率做到上百Mbps,一片芯片集成多个通道,正反方向可以组合,体积和功耗比光耦方案小一个量级。MAX14431BAEE+这种四通道数字隔离器,就是冲着这种场景来的。
1.3 隔离器拿到手先懂这五个参数
隔离器不是随便挑一个型号焊上去就行,方向对了、耐压够了才能用。我每次选型基本只看五个参数,看懂了这几个数字,选型就不容易翻车。
第一个是通道数和方向组合。SPI有四根线,隔离器至少要四个通道。而且光方向对位就对了一半——SCLK、MOSI、CS是正向通道,MISO是反向通道,你必须确认你选的料号里包含反向通道。MAX14431BAEE+这种后缀里就带方向组合信息,不同后缀代表不同的通道方向和功能配置,选型时一定要对着数据手册的订购信息页核对。
第二个是传播延迟tPD。这是隔离器两端信号之间的时间差,单位一般用纳秒。tPD越大,SPI能跑的最高时钟就越低。做SPI隔离,我建议tPD选50ns以下的型号,这样几MHz的SPI时钟基本不受影响。
第三个是最大数据速率。数据速率和tPD是关联的,手册会给出一个标称值,比如几十Mbps甚至上百Mbps。SPI的时钟频率可以近似看成数据速率,实际使用时要留出至少两三倍的余量。
第四个是隔离耐压和爬电距离。这决定了隔离器能用在什么电压等级的现场。看手册里的Vrms耐压值和封装爬电距离,如果产品有UL、IEC等安规认证,还要核对对应的隔离等级。
第五个是每通道功耗。工业节点经常是窄板、密闭壳体、无风扇散热,功耗太高的隔离器会让板子局部发热。MAX14431BAEE+这类低功耗隔离器在这种场景下就有优势,具体静态和动态电流看手册就行。
2. 选型:MAX14431BAEE+ 和 R7FA2E1A92DFM 是怎么凑到一起的
隔离器选型顺序应该先于MCU选型吗?不一定。但确定用哪颗MCU、走什么接口、隔离多少路信号,这两件事是连在一起的。我当时手里已经有一批R7FA2E1A92DFM用在了几个采集节点上,软件框架是现成的,所以隔离方案就是围绕这颗MCU和它的SPI外设来搭的。
2.1 隔离端选型:四通道、方向、延迟三位一体
先说隔离器。SPI链路需要隔离的信号一共四路:SCLK、MOSI、MISO、CS。MAX14431BAEE+是四通道数字隔离器,一片正好覆盖一根完整SPI总线的四根线。这个"正好"很重要——如果选两通道或者三通道的型号,就得塞两片隔离器,通道数和PCB面积都浪费,还要额外处理通道之间的配对延迟问题。
通道方向是关键。SCLK从主控侧发出,MOSI从主控侧发出,CS从主控侧发出,这三路是主到从的正向通道;MISO是从设备返回主控的反向通道。MAX14431系列里不同后缀代表不同的通道方向组合,我选BAEE+这个料号之前,专门对着订购信息确认了有一路反向通道,这样MISO才能从隔离侧回到主控侧。如果买回来发现四路全正向,MISO就得从另外一片隔离器走,整个布局都要推倒重来。这个坑我在别的项目里踩过,印象很深。
延迟方面,MAX14431BAEE+这类数字隔离器的典型传播延迟在几十纳秒级别。我项目的SPI时钟定在4MHz,周期250ns,隔离器延迟占掉四分之一左右,剩下的余量足够保证正确采样。如果你要把SPI拉到20MHz以上,就要仔细核算tPD和建立保持时间的关系了,这部分我在第六节详细讲。
还要考虑隔离耐压。工业和嵌入式设备里,隔离侧对应的常常是电机驱动器、外部传感器、远端IO模块,耐压等级按行业通常选几千Vrms的型号。MAX14431BAEE+的隔离耐压参数足够覆盖这类场景,具体数值手册上有,这里不展开,选型时自己看确认一下就行。
2.2 MCU端选型:R7FA2E1A92DFM 的资源和定位
R7FA2E1A92DFM属于瑞萨RA2E1系列,Arm Cortex-M23内核,主频最高48MHz。这颗料在瑞萨产品线里定位入门级高性价比工业控制,片上集成度不错,自带RSPI(SPI)外设、SCI串口、ADC、定时器那些常用模块,非常适合做工业采集节点、隔离桥接板、传感器网关这类活。它最吸引我的点是FSP(Flexible Software Package)配置工具,图形化界面里勾选外设、分配引脚、设置参数,生成代码后直接调用驱动API,跟用STM32CubeMX那套思路很像,上手成本很低。
具体到SPI隔离这个场景,R7FA2E1A92DFM的RSPI外设支持主模式和从模式,时钟极性和相位可配置,片选信号支持硬件自动控制,也支持软件GPIO模拟。这些能力刚好满足隔离SPI的几种软件策略。我在这颗料上跑SPI主模式,时钟4MHz,8位数据宽度,硬件片选,整体CPU占用很低,通信非常稳定。
还有一个选它很重要的原因是生态。RA2E1系列有完整的e2 studio开发环境和FSP软件包,代码生成、调试、烧录一条链,遇到问题资料也好查。对于项目周期紧又不想在底层驱动上花太多时间的场景,这颗料能帮你把精力集中在系统侧的电路和逻辑设计上。
2.3 为什么没用"带隔离的SPI收发器"一揽子方案
有人可能会问:市面上也有集成隔离的SPI收发器或者隔离SPI从设备,为什么不用那种"一揽子"方案?我的回答是,方案是否合适要看从设备端是什么。
如果从设备本身是隔离型的ADC、隔离型的编码器接口,那主控到从设备之间确实可以不用额外加隔离器。但现实情况往往是:从设备是普通SPI接口的芯片,你需要在主控板和从设备板的物理边界上切一刀,把SPI总线整体隔离。这种场景下,独立的数字隔离器是最灵活的选择。MCU这边不用改SPI协议,从设备那边也不用换成特殊型号,隔离器插在中间,通道方向和电源配好,链路就通了。
另外,一揽子方案往往把隔离器和SPI协议逻辑集成在一起,灵活性反而下降。比如我这边希望CS用GPIO控制、SCLK是4MHz、MISO是反向通道,独立的四通道隔离器可以按需求自由接线,而集成方案不一定能对上。所以MAX14431BAEE+这种通用的数字隔离器才是更稳的中间层。
3. 隔离电源与地平面:隔离器只切信号不切电源,照样白搭
很多第一次做隔离的人会忽略一件事:隔离器本身确实把两侧信号隔离了,但两侧的电源和地如果不分开处理,隔离就形同虚设。数字隔离器的输入侧和输出侧是有隔离栅的,两边的VDD和GND必须完全独立,互不连通。如果主控侧和隔离侧共用一个电源、共用一个地,那你辛辛苦苦隔离开的信号路径,最后又从电源和地绕回去了。
3.1 隔离侧电源从哪里来
先讲电源。隔离器输入侧(接MCU这一侧)的电源,直接取主控板的3.3V就行,和MCU共地,这是主控域。隔离器输出侧(接远端从设备这一侧)的电源不能也从主控板直接拉,必须另外独立供电,并且这个电源必须是隔离的。
隔离侧电源的常见做法有三种:一是用独立的隔离DC-DC模块,输入接主控板的5V或3.3V,输出给隔离侧供电,原副边之间有隔离;二是从设备侧本身已经有独立电源,那就直接用从设备侧的电源给隔离器输出侧供电,保证隔离器输出侧和从设备共电源共地即可;三是在隔离器本身就集成隔离电源的型号里选,有些数字隔离器内部带isoPower方案,一颗芯片同时完成信号隔离和电源隔离,外围更省。
我这边的做法是第二种:远端从设备板本来就有一路独立的24V转3.3V电源,那就让隔离器输出侧的VDD直接接这路3.3V,输出侧的GND接从设备板的地。这样主控域和从设备域之间,信号经过隔离栅,电源和地完全没有交集,地环路彻底断开了。
3.2 地平面切割与回流路径
选了隔离电源之后,PCB上的地平面处理也要跟上。如果板子上有一个完整的GND平面,隔离器两侧都在同一个地上,那就等于把隔离器的隔离栅给短路了。正确做法是把PCB的地平面明确分成两个区域:主控侧GND区域和隔离侧GND区域,中间留出隔离带,隔离器焊接时跨在隔离带上,芯片内部的隔离栅正好切在物理边界上。隔离带下方所有层都不能铺铜,保证两侧的GND没有任何回流路径。
有个细节容易漏:隔离器输出侧的旁路电容地端,必须接到隔离侧GND,不能图省事就近接到主控侧地。同样,输入侧的旁路电容地端必须接主控侧GND。跨在隔离带两边的走线只有SPI信号经过隔离器芯片本身,另外就是隔离电源模块的原副边界,其他任何信号都不允许横跨两个地平面。
3.3 电平匹配与去耦位置
电平匹配也要提前算好。如果主控板是3.3V供电,而从设备侧或者隔离器输出侧是5V供电,那隔离器两侧的电源电压不同,逻辑电平也跟着不同。MAX14431BAEE+的数据手册里会给推荐的供电电压范围,只要两边的VDD都在允许范围内,逻辑电平匹配就是自动的,不需要额外的电平转换电路。但如果某一侧的供电电压超出了手册推荐范围,就得加电平转换或分压处理了。
去耦电容的位置也有讲究。隔离器的每个电源引脚旁边都需要0.1uF高频去耦电容,且电容必须尽量靠近对应引脚,走线要短,最好直接打过孔到对应侧的地。我在检查PCB时经常看到去耦电容放在板的边缘,离隔离器一根长走线过去,这种布局在高频下基本白搭,电容的寄生电感会毁掉去耦效果。
4. 硬件连线和PCB布局:四根SPI线的"隔离版"接法
隔离器的原理图和PCB布局看起来不复杂,但每一根SPI信号的通道方向、片选处理、走线约束都值得较真。这一节我把实际项目里的接法和布局经验一步步列出来,照着做基本不会出错。
4.1 通道方向映射:哪根进哪根出
先画清楚连接拓扑。主控侧是R7FA2E1A92DFM的RSPI外设引脚,输出SCLK、MOSI、CS三根线,输入MISO一根线。隔离器的输入侧接主控侧,输出侧接从设备侧。
对应关系这样排:
- SCLK(主控)→ 隔离器正向通道1 → SCLK(从设备)
- MOSI(主控)→ 隔离器正向通道2 → MOSI(从设备)
- CS(主控)→ 隔离器正向通道3 → CS(从设备)
- MISO(从设备)→ 隔离器反向通道4 → MISO(主控)
MAX14431BAEE+这片料引脚上会标注通道编号和方向,比如DIN1对应DOUT1这类标记。接线的时候对照订购信息确认哪几个通道是正向、哪几个是反向,然后按上面的映射一格格接过去。MISO因为是反向通道,信号源在隔离侧,接收端在主控侧,接反了是没法工作的。
特别提醒一句:隔离器通道方向必须在选料时就定死,因为它是硬件属性,软件改不了。如果你买了全正向通道的料,MISO只能走外围补救,非常痛苦。所以我每次画原理图前都会把后缀含义、通道方向确认表打印出来,对照着画。
4.2 片选信号的特别处理
片选CS是所有SPI信号里最容易出问题的,原因在于它和其他信号的关系不只是"同相"那么简单。
正常情况下,SPI主设备在传输开始前拉低CS,然后发送SCLK和MOSI数据,结束后拉高CS。隔离器会给每根信号增加一个固定的传播延迟,如果CS的延迟和SCLK/MOSI的延迟不一样(比如不同通道批次不一致),就会出现CS先到、时钟还没到,或者时钟已经停了、CS还没拉高的情况。这会导致从设备把CS拉低之后读到的第一个时钟沿之前没有数据,或者传输结束之后又额外采样了一两个比特。
实际处理时,我给CS单独加了和SCLK/MOSI同型号的通道,并且在软件里把CS的拉低时间提前了几个时钟周期,拉高时间也延后了一点,给隔离器的传播延迟留出余量。有些MCU的SPI外设支持CS建立时间和保持时间配置,R7FA2E1A92DFM的RSPI里也有类似参数,调这类参数能有效规避这种时序错位问题。
还要注意:如果隔离侧挂的是多个SPI从设备共总线,CS信号在隔离器输出侧空闲时必须有个确定电平,不能悬空。很多SPI从设备要求CS空闲高电平,如果悬空或受干扰误拉低,从设备就会误进入通信状态,从而误驱动MISO总线。解决办法是隔离器输出侧的CS线上加一个几十千欧的上拉电阻到输出侧VDD。
4.3 原理图检查清单和PCB走线建议
原理图完成后,我会按下面这份清单逐项核对,每项都确认无问题再投板:
| 检查项 | 要求 |
|---|---|
| 通道方向映射 | MISO必须走反向通道,其余走正向通道 |
| 隔离器两侧电源 | 两侧VDD完全独立,禁止共用电源或参考地 |
| 去耦电容 | 每侧VDD引脚旁就近放置0.1uF电容 |
| CS空闲电平 | 隔离侧CS加外部上拉,防止误触发 |
| 隔离带上禁止布线 | PCB所有层在隔离带处留空 |
| 电平匹配 | 两侧VDD均在手册推荐范围内 |
PCB走线方面,SPI信号在隔离器两侧的走线尽量等长,尤其是SCLK和MOSI。时钟线如果有长走线,按50欧阻抗控制或至少保证线宽一致,远端从设备如果距离远,加个33欧的串联电阻改善振铃。我在布局时把隔离器尽量靠近MCU,输入侧走线短,输出侧走线稍长一点也没关系,从设备板还有自己的滤波。
最后还有一个很容易被忽略的:隔离器输出侧到从设备的SPI信号,建议在从设备端并联一个10pF左右的负载电容,配合串联电阻对高频噪声有很好的抑制作用。这个做法不影响正常速率,但能显著降低从设备端误采样的概率。
5. R7FA2E1A92DFM 软件配置:速率、极性和片选策略
硬件链路搭好之后,软件这边的任务就是在R7FA2E1A92DFM上把RSPI外设配置到和隔离器匹配的状态。瑞萨的FSP工具把大部分工作都图形化掉了,真正需要思考的是片选策略和时序参数。
5.1 FSP里把RSPI外设拉起来
在e2 studio里操作的大致流程是:新建RA2E1项目,选择芯片型号R7FA2E1A92DFM,打开FSP配置界面,在Stacks选项卡里添加SPI驱动(对应RSPI外设,代码生成里的模块名是r_spi)。然后按下面的参数配置:
- 模式:Master(主模式)
- 位宽:8位
- 数据速率:4MHz(根据隔离器tPD和从设备上限评估)
- 时钟极性CPOL:根据从设备手册,一般选0或1
- 时钟相位CPHA:根据从设备采样沿选择
- 片选CS:硬件控制或者软件GPIO控制,二选一
配置完成后,FSP会生成初始化代码,主程序里调用R_SPI_Open()打开外设,然后用R_SPI_WriteRead()同时发和收数据。发送时把要写的数据放到发送缓冲,接收的数据会出现在接收缓冲里,半双工还是全双工由SPI协议本身决定。这套API整体和ST的HAL库SPI接口风格类似,做过多家MCU开发的人基本能无缝上手。
5.2 硬件片选还是软件片选:关键决策
RSPI支持硬件自动片选,也就是CS信号由外设在传输开始前自动拉低、结束后自动拉高。硬件片选的好处是时序精确,软件不需要操心CS的拉低和拉高时机,CPU占用率低。坏处是灵活性差,比如需要CS提前拉低多少、结束后保持多久,虽然有些外设有参数可调,但调节范围有限。
软件片选则是把CS挂在普通GPIO上,传输前后手动拉低拉高。好处是灵活性极高,想提前多久拉低、延后多久拉高都是自己说了算,多从设备切换也自然。坏处是时序全靠软件保证,搞不好会在高时钟下出现CS和SCLK之间的建立时间不足。
我的建议:如果是固定从设备、单SPI链路,用硬件片选,把RSPI的CS建立时间和保持时间调到隔离器tPD的余量之内,省心又稳定。如果隔离侧挂多个从设备、需要在传输间隙做特殊处理,那就选软件片选,但要注意在拉低CS之后加一到两条时钟的空操作再发有效数据,给隔离器传播延迟留出空间。
我实际用的是硬件片选加CS建立时间调整,RSPI本身支持这个参数的配置。调试时通过示波器看到CS拉低之后,SCLK第一个沿要再过几十纳秒才到,这样隔离器延迟就不影响片选了。
5.3 时钟极性和相位怎么配合隔离器延迟
SPI的时钟极性和相位定义了主设备在哪个时钟沿采样数据。绝大多数SPI从设备是"CPOL=0时在上升沿采样,CPOL=1时在下降沿采样"这类固定模式,但也有一部分从设备的采样沿是可以用寄存器配置的。当隔离器的传播延迟不可忽略时,采样沿的选择会影响数据正确性。
隔离器对信号延迟是整体性的,SCLK和MOSI一起延迟,理论上相位的相对关系不会变。但SCLK有波形边沿延迟之后的斜率变缓问题,如果隔离器输出侧的驱动能力一般,SCLK上升沿会变爬,从设备如果刚好在上升沿采样,采样点可能落在信号还没稳定的区域。我这边把从设备配置成在下降沿采样或上升沿后采样,实测对隔离器延迟的容忍度明显提高。
如果从设备只能上升沿采样,那就把SPI时钟适当降低,保证在上升沿到来时MOSI数据已经稳定,同时给MISO数据留出足够的时间跨过隔离器反向通道回到主控侧。我当时把4MHz降到2MHz做了一轮对比测试,2MHz下余量很大,但4MHz也能稳定。最后保留了4MHz,因为隔离器tPD标称值在几十纳秒,符合预期。
6. 实测异常排查:隔离之后数据反而错位了
硬件和软件都调通之后,我原以为链路就稳了。结果在第二轮整机测试里,MISO返回的数据在长时间运行后偶尔错位,出现连续两次读到完全相同的数据、丢失一个字节之类的现象。频率不算高,但足够让人头疼。这一节把完整的排查链路记录下来,希望能帮你省掉几个晚上的加班。
6.1 先看波形,再改代码
排查的第一步永远是示波器。别上来就改软件参数,那样大概率是在猜。我把探头分别夹在隔离器输入侧的SCLK、MOSI、CS和输出侧的SCLK、MISO上,用正常的SPI传输触发,连续跑了几百次。
波形显示确认了两件事:第一,CS拉低之后,隔离器输出侧的SCLK第一个上升沿比输入侧晚了约40ns,这正好对得上数据手册的tPD标称值;第二,MISO从隔离器输出侧回到主控侧后,数据线上的稳定时间比直接连接时晚了大约一个采样窗口。也就是说,隔离器把MISO方向的数据也延迟了一段,主控侧在原来的采样时刻采样MISO,可能正好赶上数据还没稳定的阶段。
这个现象的根本原因是隔离器的存在改变了SPI的时间预算:主控侧发时钟,从设备在某个沿后把数据放到MISO上,这个数据要再穿过反向隔离通道,最后才回到主控侧的接收端。如果主控侧采样MISO的时机没有为这段额外延迟留出余量,偶发错位就会随机出现。
6.2 传播延迟与采样沿的博弈
在确认了延迟量之后,我对比了三种处理方案。
第一种方案是降低SPI时钟。从4MHz降到1MHz,时钟周期变成1us,隔离器几十纳秒的延迟占比只有几个百分点,采样余量非常大。缺点也明显,如果从设备有大数据量传输场景,1MHz会拖慢整个交互速度。
第二种方案是调整采样沿。前面说过把从设备配置成下降沿采样,同时把主控侧的MISO采样放到更靠后的沿。这样一来,MISO数据跨过隔离器的时间就包含在采样窗口里,不再踩边界。这个方案不需要牺牲速率。
第三种方案是修改CS时序。把CS拉低时间提前,给从设备更多的准备时间;传输结束后CS拉高时间延后,防止从设备在最后几个时钟沿后没有足够时间释放MISO总线。
最终我选了第二种和第三种的组合:从设备配置为下降沿采样,主控侧对MISO在时钟周期后半段采样,CS建立时间和保持时间各延长了一个配置单位。改完之后,同样的400次连续传输测试,一次错位都没出现过。如果从设备不支持配置采样沿,那就只能用第一种方案降速,这是物理限制,改不了。
6.3 电源上电顺序带来的隐性故障
这个坑比时序问题更隐蔽。整机测试里有一版固件,每次冷启动后第一次SPI通信大概率失败,但复位一次就好了。查了很久发现是电源上电顺序问题。
隔离器输出侧的电源来自从设备板的独立24V转3.3V,这路电上电速度比主控板的3.3V慢。主控板上电完成后立即初始化SPI并发首帧数据,此时隔离器输出侧电源可能还没稳定,隔离器输出侧没有正常的VDD,从设备端自然无法正常响应。第一次通信就把CS拉起拉下走了一圈,状态没建立好,于是失败;复位后两侧电源都稳定了,通信就正常。
解决办法是软件里加入电源稳定等待机制。主控侧初始化完成后,延时几十毫秒再发起第一次SPI通信,或者通过一个GPIO读取隔离侧电源的Power Good信号。更稳妥的是在硬件上把隔离侧电源的使能引脚接到主控侧GPIO,主控确认自身电源稳定后,再控制隔离侧电源上电,同时等一个上电标志位。这个流程在工业嵌入式设计里很常见,算是单片机应用里的基础功,但一旦忘了,排查起来很花时间。
6.4 三次踩坑换来的几条SOP
总结这几次调试的经验,我形成了一套可以复用的操作流程,每次做类似SPI隔离项目都照这个顺序过一遍。
先核对隔离器的通道方向,这是硬件设计阶段的事,错了只能改板。再看隔离器的tPD和SPI时钟的关系,估算延迟占比,超过四分之一就主动降速或调整采样策略。画板时把隔离器两侧的电源和地彻底分开,隔离带上坚决不布线。软件上优先考虑硬件片选加CS时序调整,从设备采样沿能配就往周期后半段靠。最后别忘了上电顺序,主控和隔离侧电源都稳定了再发SPI第一帧。
这套流程看起来简单,但每一步都是在实际项目里付出过代价的。尤其是通道方向确认和上电顺序这两个点,光看数据手册或者参考设计未必能想到,只有真焊了板子跑起来才会暴露。做隔离SPI链路,最忌讳的就是觉得"SPI简单、隔离器就是个芯片、调一调就能通",它的坑一个不少,全藏在时序和电源的细节里。