news 2026/11/3 1:06:52

工业传感器SPI隔离链路设计与调试:从MAX14431到PIC18LF45K42的实战笔记

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
工业传感器SPI隔离链路设计与调试:从MAX14431到PIC18LF45K42的实战笔记

上个月给一套工业传感器板改版时,我又一次被 SPI 隔离链路折腾了个底朝天。设备主控是 Microchip 的 PIC18LF45K42,外设侧是一颗放在强电柜里、需要单独接地的 16 位 ADC,两边用几十厘米的排线连接。最初没有做隔离,结果旁边伺服驱动器一启动,ADC 的 SPI 读回来就是满屏 0xFFFF。后来换成 ADI(原 Maxim)的 MAX14431BAEE+ 四通道 SPI 数字隔离器,配合 PIC18LF45K42 的 MSSP 模块重新调整时序和布局,才把链路彻底稳住。这篇文章把这个过程中的选型逻辑、原理图设计、寄存器配置、PCB 布线和调试踩坑都整理出来,给正在做工业隔离 SPI 项目的朋友作参考。

1. SPI 隔离的必要性:为什么长线直连一定会在工业现场翻车

1.1 地电位差是万恶之源

SPI 的本质是同步串行通信:SCLK、MOSI、MISO、CS 这四根线全部以发送方和接收方之间的 GND 为参考。在 PCB 板上走线只有几厘米时,这种共地参考几乎不会出问题,因为两个芯片的地电位差可以忽略。但工业现场不一样,主控板和外设可能分属两套电源系统,中间隔着一根长排线或者屏蔽电缆。只要两边的地不是严格同一个网络,就存在地电位差。这个电位差平时可能只有几十毫伏,但电机启动、变频器切换、继电器吸合时,地回路里会出现大电流脉冲,地电位瞬间跳变一两伏都不稀奇。

SPI 是高阻抗数字接口,TTL 电平的噪声容限本身就不大。3.3V 供电时,输入高电平阈值大约 2V 左右,低电平阈值大约 0.8V 左右。一旦地电位跳变叠加到信号上,接收端看到的电平就可能超过或者低于阈值,直接导致采样错误。我第一版没有隔离时遇到的现象非常典型:上电后单独测试通信完全正常,但只要伺服一动,主控读 ADC 就得到 0xFFFF。这是因为 MISO 线上的高电平空闲状态下混入噪声,接收端把噪声当成了数据位。

另一个容易忽略的问题是 SPI 时钟本身是快速翻转的方波。长线缆上的分布电感、电容会产生振铃,SCLK 的过冲会耦合到旁边的 MISO 线上,造成数据翻转错位。这种问题在示波器上看尤其明显:SCLK 上升沿处 MISO 上出现一个尖刺,逻辑分析仪可能判定为一次额外跳变。可以说,不加隔离的 SPI 在洁净环境里很香,一进工业现场就非常脆弱。

1.2 光耦为什么不是首选

很多人的第一反应是用光耦隔离。光耦确实很便宜,做开关量隔离很合适,但直接用来隔离 SPI 会有几问题。首先是速度,SPI 时钟哪怕只跑 1MHz,数据线上也有大量高频翻转,普通低速光耦的上升下降沿动辄几微秒,根本跟不上。其次是通道一致性,光耦的传输延迟受 LED 老化、温度、CTR 离散度影响,4 个通道之间的延迟差可能比 SPI 半个周期还大,时钟和数据对不齐就直接废了。

数字隔离器走的是另一个路子。它内部用电容或者电感耦合传输数字信号,不依赖光电流,速度可以做到几十 Mbps,传播延迟大约几十纳秒,通道之间的偏差也小得多。而且数字隔离器的共模瞬态抗扰度 CMTI 通常比光耦高不少,强电磁干扰环境下不容易因为共模电压突变导致输出毛刺。实际选型时,我第一关注的并不是隔离电压标称值,而是 CMTI 和传播延迟一致性。对于机柜内各种伺服、变频器同时启动的场景,这两项比纸面上的 5kV 更让人安心。

2. 选型落地的关键:MAX14431BAEE+ 和 PIC18LF45K42 是怎么配到一起的

2.1 看后缀之前先把方向表搞清楚

MAX14431BAEE+ 这个型号读起来很长,但后缀不是随意编码。以我拿到的这批货为例,B 对应方向版本,EE 对应封装形式,+ 代表无铅。同一个系列里还有不同的方向版本,开箱之后第一件事不是急着上电,而是去 ADI 官网把这份手册的 Direction Configuration 表打开,确认手里这颗到底是几路正向、几路反向。

我这次要找的是经典全双工 SPI:SCLK、CS、MOSI 从主控端送到隔离端外设,MISO 从外设送回主控端,总共 4 个通道。MAX14431 这类 SPI 专用隔离器,好处是引脚语义已经按 SPI 信号命名,不需要自己把普通数字隔离器的通道一个个映射过去,PCB 设计时不容易晕。多个方向版本的存在,意味着抄网上的参考设计前必须核对型号尾缀,A 版本和 B 版本在视图中可能正好差了一次交叉,抄错之后只能飞线补救。

下面是我在设计阶段会反复看的几个关键参数,具体数值请以你自己那批芯片的最新数据手册为准:

关注项我关注的位置说明
通道数数据手册框图确认是 4 通道,刚好覆盖 SCLK、CS、MOSI、MISO
数据速率电气特性表对 PIC 常见的几 MHz SPI 时钟要留足余量
传播延迟Switching Characteristics关系到高时钟下 MISO 的建立时间
供电范围Absolute Maximum / Recommended1.71V 到 5.5V 级别,可做 3.3V 对 3.3V 或 3.3V 对 5V
CMTICMTI 指标强电柜场景重点关注,越高越好
封装Ordering Info宽体 SOIC,焊接和飞线都比较友好

SPI 专用隔离器和普通 4 通道数字隔离器的本质区别就是方向。普通 4 通道隔离器买回来要自己约定哪几路正、哪几路反,万一后面改板换料,方向表一变化就全乱。专用隔离器至少把 SCLK、CS 这类固定方向信号的位置定下来了,出错的概率低很多。当然,它仍然不是自动方向感应,只要外部接反,芯片不会替你纠正。

2.2 主控侧为什么是 PIC18LF45K42

项目主控选 PIC18LF45K42,首先是因为它非常省事。低电压版本工作电压 1.8V 到 3.6V,适合和 3.3V 逻辑的隔离器直接对接。内部振荡器可以跑到 64MHz,不需要外部晶振,BOM 省掉一颗无源器件,板子面积也小。对于 SPI 这种同步协议,内振荡器的精度足够,因为从机采样完全跟随主控的 SCLK,不依赖于绝对波特率是否准确。

其次,PIC18LF45K42 的 MSSP 模块可以做 SPI 也可以做 I2C,配置灵活。它支持主从模式、可编程时钟极性、时钟相位和采样点设置,这些对于和数字隔离器联调时非常关键。芯片的低功耗特性在我这个项目里也是加分项,传感器板长时间挂在现场,整机功耗控制得住,散热问题就少。

我之前也犹豫过要不要直接用 STM32,毕竟生态更熟悉。但这个项目为了和产线固件保持统一,主控和配套工具链都定死在 Microchip 上。实际做下来之后,PIC18LF45K42 并没有让我觉得别扭,核心的 SPI 收发逻辑很简单,反而是隔离那一段的时序设计占据了大部分时间。如果你也有一个存量项目要用 Microchip,完全没必要为了 SPI 隔离这件事临时换平台。

3. 原理图到 PCB:隔离器的每一只脚都要有明确用途

3.1 一个能直接抄的引脚映射

我把主控侧和外设侧的信号连接整理成一张表。注意这里的方向都是以主控视角说的,不是说隔离器副边就没有输入。

PIC18LF45K42 引脚功能连到 MAX14431BAEE+ 的位置隔离后接外设
RC3 / SCK1SPI 时钟输出隔离器主控侧 SCLK 输入外设 SCK
RC4 / SDO1SPI 数据输出(主出)隔离器主控侧数据输入外设 MOSI
RC5 / SDI1SPI 数据输入(主入)隔离器主控侧数据输出外设 MISO
RC2 / GPIO软件片选输出隔离器主控侧 CS 输入外设 CS

片选我特意没有用 MSSP 的硬件自动片选,而是拿普通 GPIO 控制。原因是很多 SPI 从机要求片选在整个事务期间保持低电平,如果 MSSP 在每发送一个字节后就自动拉高,从机就会认为通信结束,之前收到的数据全部丢弃。软件片选虽然多写几行代码,但可控性最好,后面调试时序也方便。

信号命名上最容易踩的坑是 MOSI 和 MISO。SPI 主机的输出其实是 Master Out Slave In,对从机来说这是它的输入 SDI。你在原理图里如果某一侧标了 SDI、另一侧标了 MOSI,一定要确认它们指的方向一致。我见过好几次所谓“隔离后没信号”的故障,最后查到都是 MOSI 和 MISO 在原理图交叉处接反了。

3.2 电源和地必须彻底分开

买回 MAX14431BAEE+ 之后要记住一件事:它是数字隔离器,不是电源隔离器。VDD1 给主控侧供电,VDD2 给隔离侧供电,两边都由外部独立提供,不能指望从信号脚里“偷”电。我主控侧用 3.3V,隔离侧外设是 3.3V 逻辑,所以 VDD2 也接 3.3V。如果外设是 5V 逻辑,VDD2 直接接 5V 就行,因为隔离器供电范围覆盖了 1.71V 到 5.5V,相当于顺带做了电平转换。

每颗 VDD 引脚旁边都要放 0.1µF 高频去耦电容,再并联一颗 1µF 或者 10µF 的体电容。电容要尽量靠近芯片引脚,不要用过长走线绕过整个板子再接。GND1 和 GND2 是两套独立地网络,不能为了省事在 PCB 上直接连到一起,那会把隔离作用全部抵消。如果系统里必须单点连接两个地,也应当只在电源入口处做严格的一点连接,而不让信号走线附近出现任何地回路。

还有一个容易被忽略的布置问题:印刷电路板上隔离器底下不要铺成一大片完整的地铜,最好开槽或者至少挖空一部分。这不是玄学,而是为了减小两侧地平面之间的耦合电容,提高共模瞬态抗扰度。如果 PCB 表面污染比较重,爬电距离还要按标准拉大,必要时加三防漆。

3.3 PCB 布线的信号完整性经验

隔离器件本身是高速器件,但 SPI 链路里更值得注意的是主控到隔离器、隔离器到外设这两端的长走线。我个人习惯是:SCLK、MOSI、CS 这三个高频或者关键信号上串联 22Ω 到 33Ω 电阻,位置放在驱动端,也就是靠近隔离器输出引脚的地方。这个电阻的作用不是降压,而是抑制振铃,波形从过冲变成圆角,误码率立刻不一样。

布线时 SCLK 和 MISO 一定要保持距离。道理很简单,MISO 是从机返回来的数据,信号幅度小、经过隔离器之后还有约几十纳秒的延迟,如果旁边一条 SCLK 线靠得太近,翻转时产生的串扰足以污染数据。我用的是四层板,把 SCLK 和 MISO 分到不同层,中间隔一个完整地平面,效果最好。两层板做不到分层屏蔽时,至少保证 3 倍线宽的间距,并且不要在隔离器附近大面积平行走线。

每块板子上我都预留了隔离器前后两侧的测试点:主控侧的 SCLK、MOSI、MISO、CS 各留一个,隔离侧同样留一组。调试时把逻辑分析仪探头扎上去,不用手忙脚乱去抓芯片引脚。工厂量产阶段,这些测试点也能让产线快速定位是主控没发出信号,还是隔离链路本身出了问题。

4. PIC18LF45K42 侧 SPI 配置:模式、寄存器、收发例程

4.1 时钟极性、相位和采样点怎么配

SPI 的模式问题本质上是回答三个问题:SCLK 空闲时是高还是低?数据在 SCLK 的哪个沿发生变化?接收端在哪个沿采样?PIC18LF45K42 的 MSSP 模块主模式里对应三个关键位:CKP 控制时钟极性,CKE 控制时钟边沿,SMP 控制输入采样相位。网上各种“照着抄就好了”的帖子很多,但我建议不要死记组合,而是拿数据手册的时序图对着设。

我这次外设要求 Mode 0,也就是空闲低电平、第一个沿锁存数据。实际配置时用了比较保守的主模式参数:CKP 设为 0,CKE 设为 0,SMP 设为 1。这个组合只是我这条链路的做法,不代表所有 PIC 都通用。配置完不要急着读寄存器结果,先拿示波器看 SCLK 和 MOSI 的相对位置,确认从机要求的采样沿是正确的,再继续往下调。

下面是我在 MPLAB X + XC8 里实际用过的初始化片段。PIC18LF45K42 不同批次、不同 MPLAB 版本生成的寄存器名可能会有差异,例如有的头文件里叫 SPI1CON0,有的平台生成的是 SSP1CON1,务必以你自己的设备头文件为准:

void SPI_Master_Init(void) { // 先关闭模块,避免配置过程中引脚出现毛刺 SPI1CON0 = 0x00; SPI1CON1 = 0x00; SPI1STAT = 0x00; // 64MHz 系统时钟下,分频到 4MHz 左右 SPI1BAUD = 0x03; // 主模式,MSB first,先不开使能 SPI1CON0bits.MST = 1; SPI1CON0bits.LSBF = 0; // 时钟空闲低,标准 Mode 0 常用组合 SPI1CON1bits.CKP = 0; SPI1STATbits.CKE = 0; SPI1STATbits.SMP = 1; // 最后使能 SPI1CON0bits.SPIEN = 1; }

4.2 一次完整读写的例程

配置好之后,最常用的函数就是对着 SPI 缓冲寄存器写一个字节、等待接收完成、再读出收到的字节。这里我刻意把片选拉低和拉高的延迟也写进去,因为很多 SPI 从机对片选建立时间有要求。如果片选刚拉低就开始发时钟,从机可能还没准备好,第一字节直接丢掉。

uint8_t spi_read_write(uint8_t data) { uint8_t rx; CS_IO = 0; // 片选拉低 __delay_us(2); // 满足从机片选建立时间 SPI1BUF = data; // 启动发送 while (!SPI1STATbits.BF); // 等待接收完成 rx = SPI1BUF; // 读走接收缓冲 __delay_us(2); // 保持从机片选最小脉宽 CS_IO = 1; // 片选拉高 return rx; }

读寄存器时,主机每发一字节,同时会从 MISO 上收回来一字节。第一次用这个函数的人往往会困惑为什么读数据要先发数据,这正是 SPI 全双工的机制:主机不提供 SCLK,从机根本不会把数据放上总线。所以读操作通常先发送指令或寄存器地址,再发送一个哑字节,接收到的内容才是想要的数据。

4.3 软件片选和硬件片选怎么取舍

我把片选放在普通 IO 口之后,时序逻辑就变得非常透明:什么时候拉低、什么时候拉高完全自己控制。唯一的缺点是 CPU 要在读写前后各等几个微秒。对大部分工业外设来说,主频 64MHz 的 PIC 跑这点延迟毫无压力,不值得为了省几行代码去启用硬件片选。

有个常见误区是把片选也接进隔离器之后就不管了。实际上隔离器输出 CS 的是推挽信号,和主控直接驱动从机时不太一样。推挽输出在正常情况下不需要上拉,但如果从机在总线释放期间会把 CS 悬空或者需要外部上拉,那还得在隔离器副边加上拉电阻。这个细节我在后面调试坑里会再提一次,因为它最容易和“隔离器坏了”搞混。

5. 调试周报:三个看起来像玄学的故障,最后都是工程问题

5.1 一上电读寄存器,满屏 0xFF

第一块板子焊完,上电,主控读 ADC 的设备 ID,结果全是 0xFF。MISO 线上一直保持高电平,看起来像没有任何设备应答。我一开始怀疑从机没上电,但用万用表量 VDD2 正常;又怀疑 CS 没有真正拉低,逻辑分析仪探主控侧 CS,波形也正常。最后把探针移到隔离器副边,才发现 MISO 上根本没有数据翻转。

排查到这里,问题基本锁定在隔离器的方向配置上。MAX14431 这种专用隔离器方向是固定死的,B 版本和网上参考设计里 A 版本的方向表不一致,MOSI 和 MISO 的通道映射被我按老图接反了。主控发出去的字节进了隔离器后走错了通道,从机自然收不到;从机的应答也回不到主控这边。好在宽体 SOIC 封装引脚间距大,我用飞线把 MOSI 和 MISO 交叉交换回来,板子立刻就能通信了。第二版 PCB 上修改了原理图映射,问题彻底消失。

这次教训告诉我:拿到任何一款隔离器,都要先在数据手册里把方向表圈出来,对照自己的原理图逐个引脚确认。特别是同一个系列出现 A、B 不同方向版本时,网上那种截图很可能和你拿到的物料编号不一样。别偷懒,开板前多花十分钟,省得样机阶段飞线。

5.2 通信能通,但高频时偶发校验失败

自检通过后我把 SPI 时钟从 2MHz 调到 8MHz,故障就出现了:读写寄存器大部分时候正常,偶尔返回一个错误值,次数完全随机。用逻辑分析仪抓波形,能看到 MISO 在上升沿附近有明显的振铃,最低处下冲到 1V 以下,已经逼近低电平阈值。再量 MOSI 和 SCLK 的过冲,全都有类似现象。

这就是最典型的阻抗不匹配:隔离器输出引脚到外设走线太长,没有串阻抑制反射。我给 SCLK、MOSI、CS 的输出端各串了一颗 33Ω 电阻,又在隔离器副边的 MISO 和 CS 上各加了一颗 10kΩ 上拉电阻。这里上拉不是为了把推挽信号拉高,而是防止从机在总线释放期间把 MISO 变成高阻态,导致噪声窜进来。

加了这两样东西之后,8MHz 下跑了一晚上伪随机数据,再也没有出现误码。事实证明,“偶尔出错”这类问题几乎都可以靠改善信号完整性解决,和芯片本身质量没有关系。那种一遇到错误就怀疑隔离器不良的做法很浪费生命,先把终端电阻和上拉补上再说。

5.3 环境温度一高,又冒出来随机错误

结构测试都通过之后,我把板子放进温箱做高温摸底。温度到 85°C 时,原本稳定的 4MHz 链路开始出现零星错误。这个现象很有意思,因为常温下同样的代码和板卡完全没事,温度和误码率之间似乎存在相关。

我重新抓了隔离器副边波形,发现数据建立时间比常温时明显缩短。数字隔离器的传播延迟会随温度漂移,这是正常的物理特性。如果 SPI 时钟太快,留给 MISO 数据的建立时间余量本来就不多,温度一高就把最后的余量吃光了。解决办法并不复杂,我把 SPI 时钟从 4MHz 降回 2MHz,并且在代码里增加了连续三次读取校验,如果两次结果不一致就重新读一次,错误完全消失。

工业现场的温度范围通常比实验室苛刻得多,如果只在常温下调试通过就发货,到了夏天或者密闭机柜里很容易出事。我现在的习惯是直接在数据手册允许的最高环境温度下跑一遍回环测试,宁可把设计余量压在最坏情况,也不要在客户现场提心吊胆。

6. 用 1MB 伪随机数据把链路测到说不出话

6.1 回环自检法:隔离器两侧一起验证

调试后期我用的最顺手的验证手段是回环测试。把隔离器副边输出和输入短接,也就是让主控发出去的数据经过隔离器之后原路返回,这样一次测试就把隔离器正向通道、反向通道全部覆盖了。回环测试通过之后,再换成真实外设,确认从机确实能被读写,才算完整验证。

测试数据不要用简单的 0xAA、0x55 这类重复序列。它们看起来像是压力测试,实际上边界条件很差。我用 libc 里常见的 LFSR 或者 CRC 多项式生成伪随机字节,这样相邻字节之间不停变化,MISO 上会出现各种高低电平组合,更容易暴露信号完整性问题。测试流程大概是这样:发一包伪随机数据,收回来逐字节比较,统计累计错误数。

uint32_t lfsr = 0xDEADBEEF; uint32_t errors = 0; for (uint32_t i = 0; i < (1UL << 20); i++) { uint8_t tx = (uint8_t)(lfsr & 0xFF); uint8_t rx = spi_read_write(tx); if (rx != tx) { errors++; } lfsr = (lfsr >> 1) ^ ((lfsr & 1u) ? 0xEDB88320u : 0u); }

如果回环数据 1MB 里一个错误都没有,通信链路的状态基本可信。但要说明,这个测试只能证明隔离器在现有 PCB 和供电条件下工作正常,不能代替真实外设的端到端验证,更不能代替现场的电磁兼容测试。

6.2 我记录到的一组对比数据

下面这组数据是我这块板子做好之后实测记录的,只对当前布局和供电有效。它能说明一个问题:SPI 时钟每提高一倍,链路余量就会明显收窄,等到某个临界点之后,就不再是偶然错误,而是稳定复现错误。

测试条件2MHz 时钟4MHz 时钟8MHz 时钟
未加串阻和上拉,常温0 错误 / 1MB2 错误 / 1MB41 错误 / 1MB
加 33Ω 串阻和 10kΩ 上拉,常温0 错误 / 1MB0 错误 / 1MB3 错误 / 1MB
加串阻和上拉,85°C 热风吹 10 分钟0 错误 / 1MB0 错误 / 1MB11 错误 / 1MB

最后我选择了 2MHz 作为量产的默认时钟。虽然 4MHz 在加补偿之后也稳定,但客户现场会有排线长度差异、电源波动、温度漂移等各种不确定因素,2MHz 换来的那点速度损失完全不值一提。工业控制领域,稳定永远比峰值性能重要。

6.3 测试之外的现场粗测经验

温箱和逻辑分析仪只能证明实验室状态,现场测试还应该做一轮更粗糙的验证。我的做法是把板子装到实际工作位置,在旁边的伺服驱动器上反复启停,同时主控持续往 ADC 里写一个固定寄存器再读回来,连续跑 30 分钟。伺服启停产生的共模干扰比实验室的方波发生器更真实,如果这条链路在频繁启停过程中一个错误都不出,那才有资格进下一阶段。

这个粗测方法不需要额外设备,只需要在固件里留一个自检函数,通过串口把错误计数打出来。我一般会加上连续三次读取一致才认为成功的逻辑,这样单次偶发噪声不会被误判成硬性故障。现场测试时间不宜太短,至少要覆盖开关机、负载突变和温度逐渐上升这几个场景。

改完这版之后,我对隔离 SPI 链路的态度变成了“隔离器只负责切断电气连接,稳定不安全取决于隔离器本身,而是取决于你给它的电源、地和时序余量”。以后每块带隔离 SPI 的板子上,我都会预留隔离器前后两端的测试点,并且在 BOM 备注里标注清楚方向版本。这样的设计,量产和现场排障都能省太多时间。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/3 1:05:51

安全继电器选型避坑指南:从安全等级到西门子实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/3 1:05:48

STM32 SPI隔离实战:MAX14431BAEE+与HAL库驱动详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/3 1:03:14

工业现场SPI隔离设计:MAX14431与PIC32的高可靠通信实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/3 1:02:58

STM32F072 SPI隔离设计:数字隔离器选型与时序布线实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/3 1:02:57

基于MAX14431BAEE+与PIC18F86J10的SPI隔离通信设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/3 1:02:51

ZOWIE智威LXR30M快恢复贴片整流桥选型与Z4PAK封装应用指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华