我要提问
ARTICLE DETAIL

资讯详情

前沿编程新知与开发实战干货的深度解读。

SPI数字隔离器实战:MAX14431BAEE+与瑞萨RA4M1工业级MCU隔离链路设计全解析

SPI数字隔离器实战:MAX14431BAEE+与瑞萨RA4M1工业级MCU隔离链路设计全解析 做工业嵌入式这些年见到的通信翻车现场大多不在CAN上而在SPI上。MAX14431BAEE这颗专门给SPI用的数字隔离器加上R7FA4M1AB3CFM这颗瑞萨RA4M1系列的工业级MCU组合起来解决的正是如何在强噪声、高共地电位差的现场把一条SPI链路在物理层上真正隔开的问题。这篇博文不打算写成数据手册翻译而是把我从选型、隔离方案设计、原理图与PCB布局、时序预估算、软件联调到排障的完整过程摊开讲一遍。内容适合正在做工业采集模块、电机驱动、PLC远程IO、伺服驱动器的人哪怕你主控选的不是瑞萨隔离链路部分的思路也完全可以搬到别的平台。我自己做这版板子时的场景比较典型主控板放在机箱里从机是装在电机附近的一个温度采集前端两者之间走SPI距离不到半米。按理说半米不长但电机一跑SPI就开始出现偶发性乱码。后来分析才发现问题根本不是数据线本身而是两侧设备的地电位不相等地环路把逆变器的共模噪声直接灌进了信号线。这正是需要数字隔离器的地方。1. 两颗芯片的分工MAX14431BAEE与R7FA4M1AB3CFM各自扮演的角色1.1 MAX14431BAEESPI链路里那道电气防火墙MAX14431BAEE属于ADI旗下专门面向SPI应用的数字隔离器不是通用四通道隔离器拿过来凑合用的东西。通用数字隔离器当然也能隔离SPI但通道方向固定、传播延迟不一致、数据速率余量不够实际用起来总是别扭。MAX14431BAEE的优势在于它是一颗针对SPI物理特征优化的器件典型配置是两正一反三个通道正好覆盖SPI最重要的三根数据线SCLK、MOSI走正向通道MISO走反向通道。数字隔离器的核心原理是用电容隔离栅或者磁耦合来传信号替代传统光耦。光耦最大的问题有两个一是速率上不去高速光耦也就是几Mbps到十几Mbps而且随着温度变化电流传输比会漂二是传输延迟一致性差同一批次光耦通道之间的延迟可能差几百纳秒这在SPI这种同步协议里几乎是致命的。数字隔离器内部用高频载波把电平状态编码后穿过隔离栅再在另一侧解码还原传播延迟能做到几十纳秒级别而且通道间延迟匹配远好于光耦。共模瞬变抑制能力也就是CMTI指标通常能做到几十kV/µs以上看高频瞬态干扰时这个指标比耐压数值更重要。MAX14431BAEE的隔离耐压我记得是3.75kVrms适合板级隔离场合。后缀里的BAEE涉及温度等级、封装形式和通道方向配置的具体细分选型时一定要以最新数据手册里的Ordering Guide为准不要只看主型号就下单。实际打样之前我特意对比过MAX14431系列其他变体的通道方向确认这颗料的通道方向是两正一反才定下来。如果方向配不对SPI信号根本走不通。1.2 R7FA4M1AB3CFM主控侧为什么挑它R7FA4M1AB3CFM是瑞萨RA4M1系列的一颗Cortex-M4F内核MCU主频100MHz带FPU功耗数字做得不错关键是有真工业级的周边资源。RA4M1的SPI模块叫做RSPI支持主从模式、四线或三线、双数据速率标称速率余量对隔离SPI这种场景够用了。CFM封装后缀对应的是LQFP64形式手工焊接、飞线调试都方便对打样阶段的工程师特别友好内部Flash和RAM容量在这个定位的芯片里给得比较大方跑一个包含协议栈和算法的小系统轻轻松松。这颗MCU的另一个优势是周边外设覆盖非常广CAN、SCI、ADC、DAC、比较器、PWM都齐了。一块板子上既要接SPI从机又要上RS-485或CAN总线与上位机通信用一颗RA4M1就能搞定不用为了不同外设叠好几颗芯片。RSPI还支持在传输过程中通过扩展帧格式做控制硬件片选和软件片选的自由度很高这对隔离SPI链路特别重要后面我会专门展开讲片选的问题。此外瑞萨的FSP灵活配置软件把底层驱动生成得很规范SPI、DMA、中断都能在图形化界面里配置比纯寄存器开发省很多时间。1.3 选型取舍为什么不当模块用也不用带隔离的SoC有人会问市面上有现成的SPI隔离模块把隔离器、隔离电源都集成好买回来往板上一插多省事。模块方案确实适合快速验证原型但对量产产品有几条硬伤第一是模块成本高一颗隔离模块的价格能买好几颗隔离器芯片第二是占板面积大模块的高度和长宽在结构受限的机箱里往往放不下第三是模块内部的隔离电源性能和布线经过优化但也因此没法根据你的具体噪声环境做针对性调整。自己设计隔离链路虽然前期要多算一阵子但后期可维护性和成本控制都好得多。至于SoC集成隔离SPI隔离这功能实在太难集成进MCU里了。SPI速率高、方向固定但取决于主从角色、应用需要隔离的等级又各不相同MCU厂商没法做一颗万能的带隔离SPI外设的芯片。另一个原因是隔离等级和封装强相关要做加强绝缘就需要宽体封装和更大爬电距离这和MCU越来越小的封装趋势是冲突的。所以实用的做法几乎都是在MCU外部加一颗独立隔离器隔离等级、速率、通道方向都能按项目需求来选。2. 隔离SPI为什么难地环路、噪声与SPI协议本身的三重考验2.1 地环路SPI通信翻车的头号原因SPI明明只有三四根线速率也不高为什么一到工业现场就出问题最深层的物理原因在地上。任何两个设备用铜线连接时理想情况下它们的参考地电位应该是完全相等的0V但实际中设备之间的地线是有阻抗的线路越长阻抗越大信号频率越高阻抗越大。当电机、变频器这类设备有大电流流过时电流在地线阻抗上就会产生压降这个压降直接改变了从机一侧的GND相对主控侧GND的电位。主控认为的低电平是按自己GND算的从机认为的高电平是按自己GND算的两者之间一旦出现几伏的瞬态偏差数据必然被误判。地环路还带来另一个问题共模噪声。电机母线上的dv/dt通过寄生电容耦合到信号线上形成共模电流。在非隔离系统里这个共模电流会沿着信号线找到回路走回主控板的地平面在SPI线上感应出差模电压。数字隔离器把两侧的GND在电气上完全断开信号只能通过隔离栅内部的电场或磁场传递共模电流没有回路可走自然就切断了这条噪声路径。实际调试里最明显的感受是不加隔离时示波器探头一靠近电机电缆就能看到波形振铃加了隔离后同样的位置再看波形干净得像个实验室环境。2.2 隔离等级3.75kVrms能保什么、不保什么很多工程师一看到3.75kVrms这个数字就以为巨耐压其实要分清这是隔离耐压等级不是说你能在这个电压下正常工作。3.75kVrms意思是隔离栅两侧能够承受持续一段时间的三相交流等效电压通常用于基本绝缘场景比如同一个机箱内部、两个PCB板之间的隔离。如果是两个独立设备之间走线或者涉及人身安全相关的应用就要考虑加强绝缘等级这时候对器件的封装、爬电距离都会有更高要求。安规上还有一个概念叫爬电距离也就是沿绝缘体表面的最短通路。MAX14431BAEE的封装形式和引脚间距决定了它自身能达到的爬电距离等级。PCB板上的铺铜间距同样要计算清楚在隔离栅下方挖空铜箔之后两侧导体之间的距离必须满足你对隔离等级的要求。我在布局时专门量过这个距离宁可多占一点板面积也不敢把隔离两侧的铜皮挨得太近否则隔离器耐压再高也会在PCB表面打火。2.3 SPI时序的难缠之处传播延迟不是简单的慢了一点SPI是同步串行协议时钟边沿打拍子数据线在对应边沿被采样。当你在链路里插入一个隔离器后所有跨过隔离栅的信号都多了一段传播延迟。麻烦的是SPI里SCLK出去要经过隔离器MOSI出去也要经过隔离器从机返回的MISO还要再从反向通道经过隔离器回到主控。这三级延迟是串联叠加的。如果隔离器的传播延迟是30ns一次完整的读操作里MISO比理想情况晚了将近百纳秒SCLK线上的时钟相位却仍然由主控决定。这意味着即使SPI数据手册上写着能跑到几十MHz加了隔离器之后整个时序余量会被大幅压缩。别小看这几十纳秒在20MHz时钟下一个周期只有50ns传播延迟比一个周期还长你要是按裸SPI的时序参数配置连接收对齐都做不到。解决思路只有两种要么降速让周期远大于链路总延迟要么调整采样相位把采样点正好安排在数据稳定之后。后一种方案要求对SPI的CPOL和CPHA配置有精确的理解我是在调试过程中逐步试出来的这块内容放到后面排障部分细讲。3. 硬件设计实操从原理图到PCB把隔离链路画好3.1 供电设计隔离栅两侧的电源树怎么搭隔离器本身不能凭空产生能量它需要两侧各有一个电源轨。主控侧用3.3V隔离侧取决于从机的工作电平可以是3.3V也可以是5V。MAX14431BAEE的VDD1和VDD2需要分别供电其中一边的电源必须来自隔离电源不能直接跟另一侧共用一个DC-DC输出否则隔离就名存实亡了。隔离电源的常见做法是用DC-DC隔离模块比如1W级别的小模块输入5V输出5V或者3.3V。选型时重点看两件事一是隔离耐压至少要比隔离器高通常这类小模块都有1kV到3kV的隔离能力二是输出纹波有的工业级DC-DC开关频率不高输出纹波能达到几十毫伏叠加在数字电源上虽然不一定致命但会让信号质量变差。我给隔离侧供电时在模块输出端加了LC滤波电感选1uH到4.7uH电容用10uF陶瓷加0.1uF高频去耦实测信号边沿比直连时干净得多。去耦电容的摆放很关键。每个电源引脚旁边都要放一个0.1uF电容尽量靠近引脚PCB走线先过电容再到引脚表面不能先走一段长线再接电容。另外隔离器两侧的去耦电容地端必须分别连接到各自的GND网不能在隔离栅附近把两个地短接起来。我习惯在原理图里把AGND和ISO_GND分成两个独立的网络直到最后通过设计规则检查来确认它们之间没有非预期的通路。3.2 SPI信号分配与CS线的正确处理MAX14431BAEE有三个通道两正一反理论上SCLK、MOSI、MISO都有对应位置。但SPI通常还缺一根CS片选线。CS怎么处理是整个隔离链路设计里最容易踩的坑。很多新手会犯一个错误觉得CS就是一根控制线直接从MCU的GPIO拉一根线跨过隔离栅接到从机。这样做表面上能工作但实际上CS和从机之间依然共享着隔离后的参考地。如果两侧地电位不同CS上的瞬态压差会在整个链路上形成一个额外回路之前辛辛苦苦隔离的SCLK和MOSI等于白干了。除非你的应用场景里从机允许CS常拉低像一个SPI Flash只挂一颗、不会跟其他器件抢总线的时候可以把CS直接固定到GND这样MAX14431BAEE的三个通道确实就够用了。但如果CS是动态控制的就必须对CS也做隔离。给CS做隔离的推荐方案很简单加一颗单向数字隔离器哪怕速率不那么高也行。CS本身是电平信号频率低不像SCLK那样需要高速通道选一颗普通的单向隔离器甚至低速光耦都行但要保证传播延迟尽量与SPI数据通道匹配。我对同步性的处理方法是主控在拉低CS之后先让软件等待两个tPD的时间再开始产生SCLK。因为CS和数据通道的延迟可能不完全一致提前等待能保证从机看到CS有效时数据线上的信号也已经稳定了。硬件片选与软件片选在这个场景下要重新权衡。硬件片选由RSPI控制器自动控制CS引脚时序精确但灵活性差CS经过隔离器后引入的额外延迟会直接叠加进时序预算控制器并不知道你加了隔离器它还以为CS是即时有效的。软件片选让MCU自己通过GPIO拉CS虽然会增加软件开销但你可以精确控制CS有效到SCLK启动之间的等待时间这正好弥补了隔离器引入的不确定性。除非你对RSPI控制器的延时参数做过精确测量否则隔离SPI场景我建议优先用软件片选。3.3 PCB布局要点爬电距离、地分割与等长走线PCB布局直接决定隔离效果。隔离器所在的区域正下方必须把铜箔全部挖掉表层、内层都不能有连续铜皮跨越隔离边界。隔离栅两侧的地平面是独立的一边属于主控GND另一边属于ISO_GND。我在设计时把这两个地平面在隔离器下方的空隙处完全断开只允许它们通过隔离电源模块内部的寄生耦合发生一点联系避免形成粗大的共地铜皮。这个细节曾经在一次改板里被忽略过结果隔离器装了跟没装一样测试一跑就出错。爬电距离的计算要落到实处。隔离器两侧焊盘之间的距离通常由封装决定了但PCB走线也会绕行绕行路径上的最近间距必须满足设计要求。3.75kVrms隔离等级对应到PCB上表层间距一般要大于4mm才能放心内层可以适当缩小但也不能任性。如果结构空间实在紧张可以开槽处理就是在PCB上铣一条物理槽来增加沿面距离这是很成熟的工程手段。SPI信号线在隔离器两侧的走线尽量短。走线长会增加寄生电容和电感造成信号边沿变缓。SCLK和MOSI作为同方向信号在进入隔离器之前要尽量做等长处理长度差控制在毫米级虽然SPI不是并行总线但两条线的延迟差会额外吃掉时序余量。另外每根SPI信号线上串一个22到33欧姆的电阻用来抑制振铃这在隔离器输出侧尤其有效因为隔离器本身的输出驱动能力并没那么强长走线加上高容性负载很容易出现过冲。3.4 时序预算计算10MHz和20MHz差在哪里时序预算不能靠感觉要拿笔算。以我手头这个系统为例SPI时钟想跑10MHz一个周期是100ns。MAX14431BAEE的传播延迟按数据手册典型值算大概在几十纳秒量级我把它当成30ns来估算。一次从机MISO回程数据的完整延迟由三部分组成主控发出的SCLK要经过正向通道到从机延时tPD1从机从收到SCLK边沿到MISO数据稳定有一个tCO输出延迟MISO再经过反向通道回主控延时tPD2。假设tPD1和tPD2都是30ns从机tCO是20ns那么从主控发出SCLK边沿到主控收到有效MISO数据总共需要80ns左右。再考虑主控的采样要求RSPI要求数据在采样边沿前有一段时间setup时间就算10ns吧这样从SCLK发出到数据有效且满足setup总共需要90ns左右而一个周期只有100ns留出的余量只有10ns。这10ns里还要包含PCB走线延迟和从机输出驱动能力带来的额外损耗实际上是非常紧张的。反观5MHz周期200ns同样的链路延迟90ns余量110ns稳定得多。所以我的结论是在这颗隔离器与这种PCB布局条件下把SPI速率设成10MHz可行但余量不多需要精确配置相位设成5MHz到8MHz是最舒服的区间20MHz理论上能出数据但几乎没有任何抗干扰余量强振动、强噪声环境下非常容易掉链子。如果你的从机本身速度很高必须要快的话就该考虑换更高速率版本的隔离器或者接受更严格的布局要求。4. 软件与联调让R7FA4M1AB3CFM把隔离链路用起来4.1 RSPI初始化与FSP配置瑞萨RA4M1的开发环境现在主推e2 studio加FSP图形化配置外设之后生成底层代码上手很快。RSPI模块我配置成四线全双工主模式CPOL和CPHA需要根据从机手册和隔离时序一起定。我在这个项目里选的是CPOL0、CPHA1也就是时钟空闲低电平、第二个边沿采样。原因很简单SPI模式0的采样边沿是上升沿而数据变化也在上升沿附近隔离器延迟的不确定性会直接落在采样窗口上模式1用下降沿采样数据有充分时间稳定。初始化代码在FSP里生成后核心调用大概是这样的fsp_err_t err; r_spi_t spi0; err R_SPI_Open(spi0, spi_cfg); if (err ! FSP_SUCCESS) { // 错误处理检查引脚复用、时钟配置 } uint8_t tx_buf[64]; uint8_t rx_buf[64]; R_SPI_WriteRead(spi0, tx_buf, rx_buf, 64);实际项目里我不会让CPU傻等着SPI传输而是用DMA。RSPI的发送和接收事件分别可以触发DMAC传输配置好之后CPU只需要发起一次传输请求数据搬完了DMA再通过中断通知应用层。隔离场景里DMA还有个额外好处传输过程中CPU不会因为中断延迟打断SPI时序这比软件手动读数据可靠得多。DMA配置在FSP里也很顺手选择传输方向、数据宽度、源地址和目的地址即可。4.2 典型从机通信以SPI Flash为例我这块板子的从机之一是颗SPI Flash用来存参数和校准数据。Flash的好处是SPI行为非常典型操作码、地址、数据三个阶段的时序模式完全固定很适合验证隔离链路稳定性。读ID是最基础的验证项发送0x9F操作码然后接收三个字节的设备ID如果这三个字节稳定读出说明基本链路是通的。读Flash数据时要特别注意页读取的连续操作。SPI Flash允许以连续时钟脉冲读一串数据逻辑上很方便但隔离链路上如果一字节出错后边的数据可能全部错位。所以我给读操作加了一个简单CRC校验读完成之后对整块数据算CRC跟Flash里预存的校验值比较。故障时并不会立即触发重读而是连续三次错误才报故障避免瞬时干扰造成的抖动误判。这套策略在工业环境里非常实用宁可多接受几次错误也不能让瞬时噪声触发频繁重传把总线占满。4.3 现场验证三板斧回环、示波器、压力测试联调阶段我习惯按三个步骤做验证。第一步是软件回环把隔离器输出侧的几个引脚短路起来让MOSI数据直接回环到MISO输入主控发一串固定模式比如0xA5、0x5A、0xAA、0x55交替读回来做比对。回环测试通过说明隔离器通道方向、电平转换和主控侧SPI配置都没有问题。第二步是示波器测量。测SCLK在隔离器输入侧和输出侧的波形确认输出侧边沿有没有严重变形测MISO在从机输出到隔离器输入、再从隔离器输出回主控这两段波形的时间关系。高压差分探头能直接看隔离栅两侧的地电位差不过实验室没有的话普通单端探头分两次量也能估计出地线噪声的幅度。我见过最明显的现象是隔离器输出侧SCLK下降沿上叠加了一个振铃振铃幅度接近2V那就是隔离侧电源去耦不够加上走线过长的直接结果。第三步是压力测试。连续24小时以上跑通信任务每隔一段时间记录一次误码率。我一般设定每10秒读取一次8KB数据并做CRC校验测试期间统计总错误次数。如果8小时之内错误次数超过个位数说明时序余量还不够下一步就是降速或者调整相位。如果连续24小时零错误基本可以认为隔离链路在这个环境下是稳定的。5. 一周调试踩过的坑问题与解决方案速查5.1 波形正常但数据偶发错位调试中遇到最诡异的问题就是示波器上看SCLK和MISO波形都对但软件里读回来的数据每隔一段就会整块错位。反复排查后发现CS撤销得太早。原因是RSPI硬件片选在最后一次SCLK完成后立刻拉高CS这个操作没有经过隔离器从机收完最后一个字节还需要一小段时间完成内部锁存CS太快释放导致最后一个字节没被锁住。解决方法是改用软件片选在读取完成之后主动延时一个隔离器tPD的量再释放CS。如果你想保留硬件片选就得把CS也纳入隔离通道并且对RSPI的片选延迟参数做精确校准。5.2 隔离侧电源纹波引起的误码还有一次误码排查了很久逻辑分析仪抓到的波形看着也正常但CRC一直报错。后来用示波器交流档一测隔离侧VDD发现问题出在隔离电源模块输出纹波上。纹波幅度大约80mV峰峰值对于3.3V数字电源算是有点高但更麻烦的是纹波频率正好和SPI时钟产生了拍频干扰。加了LC滤波之后纹波降到20mV以内问题消失。这里要提醒的是隔离电源的纹波不仅影响稳态电平还会改变隔离器逻辑阈值附近的噪声裕量高频纹波尤其阴险频率越高越容易耦合进信号路径。5.3 CPOL/CPHA设置对隔离时序的影响CPOL和CPHA这个问题很多人知道有四个模式但不知道选错对隔离链路的影响有多大。同样一套硬件我在模式0下测试误码率大约是千分之一看起来还能接受改成模式1之后连续跑了24小时一次错误都没有。原因就是模式0的采样边沿和数据变化边沿靠近隔离器引入的传播延迟会进一步压缩数据稳定时间模式1把采样点放到数据变化之后的半个周期刚好避开了最不稳定的窗口。如果你的系统用的是模式0且已经加了隔离器我建议试试改成模式1或者模式3在很多场景下会立竿见影。5.4 软件片选与中断延迟的冲突软件片选解决了隔离时序问题但它又带来了新的麻烦如果SPI传输过程中被高优先级中断抢占CS可能会在数据还没发完时被莫名其妙地操作。我踩过的坑是系统里有定时器中断和SPI传输共用同一个CPU核定时器中断一进来本来要连续输出的SCLK脉冲被掐断了几微秒从机早就失去了同步。解决方法是把SPI传输配置成DMA模式发起传输后CPU去处理中断DMA独立搬运数据这样传输过程的时钟连续性不受中断影响。如果一定要用CPU模式发送就在发送期间临时屏蔽会抢占SPI时序的中断代价是系统实时性稍微变差。对工业现场来说SPI链路不崩溃比那几微秒实时性重要得多。做这套隔离SPI方案前后调了一周最后把速率稳定在8MHz极限试过20MHz能出数据但余量太薄只作为性能测试不敢用于量产。我个人的体会是做隔离SPI链路先把CS和电源这两个不是数据线的环节处理干净再去折腾时钟相位和速率顺序绝对不能反。另外在板卡定型前一定要拿到真实的噪声环境去跑压力测试实验室里干干净净的波形说明不了任何问题只有拉到电机边上转起来才算真正验证过。如果你也正准备给SPI做隔离希望这些记录能帮你少走几个弯路。
返回列表