news 2026/10/2 7:50:52

SR8201F国产百兆PHY调试实战:从机贴失败到杜邦线救场

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SR8201F国产百兆PHY调试实战:从机贴失败到杜邦线救场

SR8201F这颗国产百兆以太网PHY,我是真没想到会用得这么折腾。项目因为国产化替代和成本原因,要把之前进口的PHY换掉,看了一圈选了SR8201F,结果从PCB贴片回来就开始一路踩坑:先是机贴出来link灯死活不亮,再是MDIO读ID全读成0xFFFF,折腾了快一周,最后靠一把杜邦线飞线救了场。这篇文章就把整个过程完整复盘一下,把原理图设计、机贴返修、调试工具、寄存器操作和最后的飞线排查都写清楚,给正在用SR8201F或者其他百兆PHY的工程师排排雷。不管你是硬件工程师还是嵌入式软件工程师,只要手里有基于STM32、瑞萨或者其他带MAC的MCU+外挂PHY的项目,这篇实战记录应该都能帮上忙。

1. SR8201F是颗什么样的芯片:除了便宜,还要知道它的脾气

1.1 基本参数和定位

先简单交代SR8201F是什么。它是国产单路10/100M自适应以太网物理层收发器芯片,支持RMII(精简媒体独立接口)和MII两种MAC互联模式,内部集成有编解码、自适应均衡、基线漂移修正这些PHY该有的功能。典型工作电压是3.3V,I/O电压独立,配合RMII接口的时候MAC侧一般用3.3V电平即可。封装是QFN32,引脚间距小,这也为后面机贴翻车埋下伏笔。

核心能力就是和带以太网MAC的MCU(STM32F407/F429、GD32、AT32这类)配合,完成以太网物理层收发。对外是差分对接到网口变压器和RJ45,对内是RMII/MII总线和MDIO管理接口。寄存器基本遵循IEEE 802.3标准,0x00是控制寄存器(BMCR)、0x01是状态寄存器(BMSR)、0x02/0x03是PHY ID、0x04/0x05是自动协商对端能力等,这套寄存器体系只要是做PHY的都眼熟。

另一个特点是这颗PHY广泛用于低成本以太网模块、开发板、工业控制板,量走得挺大,但原厂给的参考设计和勘误说明远没有国际大厂那么全。应用笔记翻来覆去就那几页,很多细节比如RMII时钟到底怎么给、内部是否有时钟输出、上电时序要求,都得靠实际调试去试。

1.2 为什么选它:成本、交期和国产化的综合权衡

选SR8201F不是拍脑袋。当时进口PHY不是缺货就是价格翻倍,交期动辄十几周,对产品进度影响太大。SR8201F单价便宜,交期稳定,样品也好拿,型号本身和某款常见的百兆PHY在设计上是兼容的,原理图改动的成本很低。在这个前提下选了它。

但要说一句大实话:选国产PHY,一定要把调试周期预算得比进口芯片宽松。不是说不信任国产芯片能力,而是配套生态的成熟度决定了踩坑概率。进口PHY的参考设计、勘误表、论坛讨论一搜一大把,国产PHY很多问题连原厂FAE都要现查。所以选了它就要有心理准备:资料少、坑要靠自己填。

2. 硬件设计阶段的三个雷区:原理图细节不懂真会炸

2.1 电源、复位和时钟,缺一个都不行

PHY芯片看似简单,外围就那么几个件,但实际上对电源和时钟的要求非常苛刻。SR8201F的模拟电源和数字电源最好都加磁珠或者至少是0欧电阻隔离,每个电源引脚就近放0.1uF陶瓷电容,大电容在板子电源入口处放10uF左右。我第一次画的时候偷懒,数字和模拟电源直接铺铜连一起,后面排查link不稳的时候就怀疑过这里。

复位电路也很关键。RC复位是最常见的做法,但电阻电容取值要算好,确保上电后PHY的复位信号能维持足够时间。如果MCU的复位和PHY复位是连在一起的,注意MCU的复位时间是否满足PHY的要求。还有个细节:SR8201F复位释放以后,MDIO接口大概需要一段时间才能准备好,紧接着就读寄存器往往读不到正确值,程序里最好加个延时再操作。

时钟方面,这颗PHY在RMII模式下需要外部提供50MHz的参考时钟(REF_CLK)。问题来了:这个50MHz是谁给的?可以让MCU的MCO引脚输出,可以外挂50MHz有源晶振,也可以看PHY是否支持25MHz晶振内部倍频。设计前务必查清楚,我见过不少人是按照某款经典PHY的25MHz晶振方案画的,结果芯片根本没有内部倍频,根本起不来。SR8201F的参考设计里多用外部50MHz时钟,但不同批次和型号后缀可能还有差异,画原理图前一定要向供应商确认。

2.2 RMII接口连接,别把方向搞反

RMII接口信号不多,一共就7根左右:TXD0、TXD1、TX_EN(MAC到PHY方向),RXD0、RXD1、CRS_DV(PHY到MAC方向),加上REF_CLK。看起来简单,但方向接反、信号错位是高频错误。

这里尤其要注意REF_CLK的接法。有的设计是MCU输出50MHz给PHY,有的是PHY输出给MCU,具体要看MCU的ETH模块是否支持从外部接收RMII参考时钟。以STM32F407为例,RMII接口的REF_CLK是MAC模块的工作时钟,它既可以由外部有源晶振直接供给,也可以由MCU内部PLL输出MCO提供,但如果你想让PHY来提供这个时钟,得确认PHY有没有REF_CLK输出能力。设计SR8201F时我最后采用了外部有源晶振给PHY和MCU各供一路50MHz的方式,一次通过。但注意这个方案需要留意时钟质量,有源晶振要选低抖动的,电源也要干净。

还有TXD和RXD之间不要靠得太近,和时钟线保持距离,数据线等长做到差不多就行,毕竟RMII是单端信号,速率只有50Mbps,不是那么娇气,但也不能完全不管。

2.3 PHY地址与LED引脚复用

PHY地址是个特别容易被忽略的设计点。MDIO总线上可以挂多个PHY,每个PHY必须有唯一地址。SR8201F的PHY地址通常通过特定的引脚上下拉来实现,而且有些引脚还和LED驱动功能复用。比如你把地址引脚悬空了,内部默认上拉还是下拉,决定地址是0还是1,必须看数据手册确认。

我当时设计的地址是0x01,通过一个10K电阻下拉固定。结果调试的时候MDIO总线上死活读不到这个地址,后来用杜邦线把地址引脚强制拉到地,再复位,ID就读出来了。这个问题的坑在于:你的原理图和PCB走线可能引入干扰,让引脚电平不稳定,地址跟着漂。

还有LED灯的状态。SR8201F的link LED和activity LED引脚在刚上电未协商时会有一个表现,仔细观察可以帮你判断PHY是否正常工作。比如link灯完全都不亮,说明PHY可能根本没起来,或者没在自动协商;如果link灯会闪一下又灭,说明协商有问题。这些小现象是硬件工程师排查的第一步。

3. 机贴失败全过程复盘:QFN封装的首板之痛

3.1 现象收集:link灯不亮、芯片烫手、ID读出来全是FF

板子贴片回来,拨码开关设置好,上电。先说结果:插上网线,link指示灯纹丝不动,用STM32读PHY ID,读出来是0xFFFFFFFF,再读状态寄存器也是一样。手摸PHY芯片表面,微烫,这倒不是说一定坏,但心里已经咯噔一下。

把网线拔了拿万用表量RJ45到变压器,再到PHY的差分引脚之间的连通性,看起来都是通的。又用示波器点PHY的时钟引脚,结果根本没有波形。这时候就开始怀疑是芯片焊接问题了。QFN32封装的引脚在芯片底部,从外面看不到,机器贴片的时候很容易因为锡膏量不合适、贴装偏移或者钢网开孔不对,造成虚焊或者连锡。

3.2 一步一步排查:先从电源打起

遇到PHY完全不工作,我的排查顺序是固定的:电源->时钟->复位->MDIO通信->Link状态。这套顺序看起来简单,但能帮你把问题范围快速缩小。

第一步量电源。SR8201F各路供电引脚对地电压是不是3.3V?用示波器看纹波有没有异常大的毛刺?地引脚有没有和旁边引脚短路?当时用万用表蜂鸣档测了相邻引脚,果然发现有两个引脚有轻微短路倾向,数值不是完全为0,但阻值只有几十欧。这种问题在用QFN封装时特别常见,肉眼还看不出来,真是防不胜防。

第二步量时钟。有源晶振通电以后,输出脚应该有50MHz,拿示波器一量直接没波形。晶振电源正常,输出端却没信号,这就比较诡异了。后来发现是晶振的输出引脚在贴片时被锡膏污染,引脚被覆盖导致输出没有接触到焊盘。把晶振拆下来重焊,输出就正常了。这一步让我意识到,贴片回来不能直接上电,得先目检一遍重点器件。

第三步量复位。复位脚电压应该是高电平,如果被拉低,芯片永远处于复位状态,什么都白搭。用示波器抓一下上电瞬间复位脚的波形,确认不是一直在低。

3.3 怎么修好的:热风枪补焊和飞线

确认是焊接问题后,最简单的办法就是热风枪补焊。温度调到合适档位(一般350度左右,风速中等,具体看板子大小和器件密度),在PHY芯片周围均匀加热大概20秒左右,等焊锡重新融化后用镊子轻轻压一下芯片,让引脚和焊盘接触充分。温度别太高,时间别太长,不然旁边的小元件容易移位。

补焊完以后,重新上电。时钟信号有了,但MDIO读ID还是全FF。这时候我开始怀疑是不是板子上的走线本身就有问题,比如MDIO或者MDC走线有断线,或者过孔不通。走线在内层的话,万用表去量都不太方便,而且一层层板子里到底哪一段断了,很难在成品板上定位。

当时手头又没有第二版板子,重新打样周期太长。于是我想到了飞线——用杜邦线直接从MCU引脚救场。

4. 调试平台搭建:STM32怎么和PHY通信

4.1 硬件接线和CubeMX配置要点

在讲飞线之前,先把调试平台怎么搭的交代清楚。主控是STM32F407,自带有以太网MAC,配合外部PHY使用。CubeMX配置里选择ETH(以太网)外设,接口选RMII,然后配置相应的引脚。

RMII模式在STM32F407上实际用到PA1(ETH_RMII_REF_CLK)、PA2(ETH_MDIO)、PC1(ETH_MDC)、PB11(ETH_RMII_TX_EN)、PB12(ETH_RMII_TXD0)、PB13(ETH_RMII_TXD1)、PC4(ETH_RMII_RXD0)、PC5(ETH_RMII_RXD1)、PA7(ETH_RMII_CRS_DV)。不同型号引脚有差异,以你实际用的MCU引脚定义为准。

注意这几个引脚中,REF_CLK如果让MCU的MCO输出,CubeMX里会有两种选择:一种是MCO引脚输出,另一种是外部时钟直接接在PA1上。我最后用的是外部有源晶振方案,PA1直接接收50MHz时钟,此时MCO是被释放的,用起来也简单。

CubeMX里ETH外设的参数配置主要关注:自动协商开还是关、目标速率要不要强制、MAC地址填什么、PHY地址填多少。这些参数都能通过软件在运行的时候改,但初始化的时候至少要保证MDIO能通。

4.2 MDIO/MDC时序:读PHY寄存器三板斧

MDIO是PHY的管理接口,用两根线:MDC(管理时钟)和MDIO(管理数据)。操作方式其实很像I2C,但省去了地址帧里的设备选择,直接发PHY地址和寄存器地址。MII管理帧的格式是:前导码(32个1)+ 操作码(读是10,写是01)+ PHY地址(5位)+ 寄存器地址(5位)+ 转态(2位)+ 数据(16位)。

自己软件模拟MDIO也不难,就是把GPIO拉来拉去,注意MDIO数据在MDC上升沿采样,写操作时数据在MDC下降沿变化。时序要求其实很宽松,100KHz左右的MDC完全没问题。当然STM32的ETH外设自带MDIO控制器,直接用HAL库的HAL_ETH_ReadPHYRegister就能读,方便很多。

调试初期我建议除了用HAL库函数,额外封一个自己写的MDIO读函数,这样不受ETH初始化失败的干扰。ETH外设配置有问题的时候,HAL_ETH_ReadPHYRegister可能根本执行不了,自己用GPIO模拟就没有这个限制,可以在最小系统上验证PHY活着没有。

4.3 用串口打印寄存器:调试的第一双眼睛

寄存器读到了,还要看得懂。我习惯在调试初期,通过串口把PHY的关键寄存器打出来,主要是0x00、0x01、0x02、0x03、0x04、0x05、0x06这几个。打在串口调试助手里,一眼就能看出PHY状态。0x00的bit13是速度选择、bit12是自动协商使能、bit8是全双工;0x01的bit5是自动协商完成、bit2是link状态;0x02/0x03就是芯片ID,能识别出芯片真实型号;0x04是本地能力,0x05是对端能力,0x06是协商状态。

有一次link一直起不来,读0x01的bit2一直为0,后来发现是0x00的bit12没置1,自动协商没使能,等于PHY根本不会主动去和交换机对话。软件改一行,把自动协商打开,link灯立刻亮了。所以串口打印寄存器这个方法,一定要用起来。

5. 杜邦线救场的完整过程:硬件问题快速定位

5.1 为什么选择飞线而不是重新打样

回到前面说的情况:PHY芯片补焊过了,时钟也有了,但MDIO读ID还是全FF。这时候我心里已经默认是PCB走线有问题,但不能完全确定到底哪根线有问题。重新打样要一周多,项目进度等不起。对硬件工程师来说,飞线是优先于重新打样的手段,它能让你绕过有问题的PCB走线,快速验证核心逻辑是否正常。

杜邦线飞线的本质就是:用一根导线,替代板上某一段不通的走线连接两个点。听起来很土,但在原型验证阶段确实管用。

5.2 飞线步骤:确认网络、断开走线、焊接

飞线不是拿杜邦线随便戳两个点就行,步骤要对。

先确认要飞哪几根线。MDIO读不到ID,优先怀疑MDIO、MDC两根线,其次是PHY的复位和时钟。拿万用表把MCU引脚到PHY引脚之间的连通性逐一量一遍,确认哪一段断路。当时测量发现从STM32的PC1(MDC)到PHY对应引脚居然是断开的,走了好几层板,中途过孔没问题,那就是内层走线断了。

接下来的操作要慎重。如果原走线是断的,但板子上还有其他元件连着,飞线时可能存在信号并联的问题,所以最好找到断线的两端,把两端都从原来的网络上摘下来再接杜邦线。当时我把PHY侧的MDC引脚用烙铁翘起来一点,和PCB焊盘脱离,再把杜邦线焊在引脚上。这一步要非常小心,QFN封装的引脚细小,翘多了容易把引脚搞断,翘少了还是和焊盘连着。另外,STM32端的引脚是排针引出来的,直接用杜邦线母头插上去就能用。

实际操作中,因为板子空间有限,杜邦线不能到处乱走,尤其MDIO和MDC本身是慢速管理信号,飞线倒还好。但如果你怀疑RMII数据线有问题需要飞线,那要特别注意线长和走向,尽量短、远离干扰源。

5.3 飞线后的效果:ID正常、link up、ping通

当我把STM32的PC1(MDC)用杜邦线引出来,直接接到PHY的MDC引脚上,重新上电运行代码,串口打印出来的PHY ID瞬间正常了,0x02寄存器读出了芯片ID的高16位,0x03读出了低16位,对应上了数据手册上的数值。

那一瞬间的心情真是又欣喜又崩溃:说明芯片本身、硬件整体设计、软件初始化都是没问题的,问题就出在这根PCB内层走线上。接着把RMII数据线也检查了一遍,最终以飞线方式把有问题的数据线也临时接好,PHY自动协商成功,link灯稳定亮起,插上网线能ping通电脑。

这时候你才真正理解为什么大家说"硬件调试到最后往往是返璞归真"——漂亮的PCB布线和扎实的软件架构都很好,但关键时候救你的可能就是一把杜邦线和一把烙铁。

6. 后续调试遇到的坑:时钟、协商、稳定性

6.1 RMII 50MHz时钟:谁提供,怎么提供

时钟的问题绝不只在硬件设计阶段,后续调试中也会遇到,而且表现非常诡异。有段时间板子刚开始偶尔能link上,几次重启以后就不行了,抓波形才发现是REF_CLK频率有偏差,50MHz飘到了48MHz多一点,PHY自然不干活。

这个现象在RMII接口里影响很大,因为RMII收发数据是以REF_CLK为基准的,如果时钟频率偏了,等送出去的包越长误差越大,最后要么link不上,要么大包丢包。排查完发现是有源晶振供电脚上的滤波电容虚焊,导致电源纹波偏大,晶振输出频率被拉偏。把电容补焊后,时钟稳定在50MHz,问题消失。

给个建议:画板子的时候,有源晶振的电源引脚是个容易翻车的地方,一定要加足够容量的去耦电容,而且放得离电源引脚越近越好。实测下来,10uF+0.1uF组合比较靠谱。

6.2 自动协商不稳定怎么办:强制100M全双工

还有一个常见坑是自动协商时不时失败。SR8201F和交换机有时候会协商不到一致的状态,拿0x01寄存器看,bit5自动协商完成位始终不置1,或者偶尔置1了但很快又清零。

这时候可以先手动固定速率和双工模式来定位。把0x00寄存器的bit12自动协商使能清0,bit13速度位设1(100M),bit8双工位设1(全双工),强制设为100M全双工。两边都固定成相同参数,看能不能正常通信。如果能,说明PHY的协商逻辑或者线缆条件有问题,再回头查硬件。

我遇到的情况是网线长度超过40米,用的是很普通的超五类线,自动协商模式下协商偶尔会失败。后面把软件改成默认自动协商,失败后重试一次,再失败就强制100M全双工,实测稳定多了。当然这只是缓解手段,根治还得换更好的网线或者调整变压器参数。

6.3 长时间运行丢包:从电源和地找原因

功能通了还不算完,稳定性才是大考。有段时间板子运行几个小时就会出现ping不通的情况,重启又好了。抓寄存器的时候发现0x01状态寄存器偶尔会显示link丢失,但很快又恢复,这种瞬断用万用表根本测不出来,只能用示波器观察。

后来发现问题出在电源上:PHY的3.3V在数据发送高峰期有比较明显的跌落。PHY芯片内部功耗不算大,但如果电源走线细、去耦电容少,高速收发时就会有压降。解决办法是把电源走线加粗,芯片附近补上几个100nF和1uF电容。这些改动对已经做好的板子来说不好弄,但至少验证了设计方向:PHY的电源设计宁滥勿缺。

如果板子已经定型不能改,可以在软件上做一些补偿,比如降低以太网发包频率或批量大小,但治标不治本。根本上还是要回到电源完整性设计上来。

7. 最后的排查流程和经验清单

7.1 新板子拿到手,先按这个顺序跑一遍

很多同事问我PHY调不通先查什么,我觉得直接给一个固定的排查流程最有用,不然慌起来东一榔头西一棒子。

  • 上电前目检:重点看PHY、晶振、网口变压器、RJ45附近有没有连锡、虚焊、元件明显偏位,不要嫌麻烦,能省半天功夫。
  • 上电测电源:用万用表确认各路电压正常,用示波器看纹波大不大,同时摸一下芯片有没有异常发烫。
  • 测时钟:REF_CLK引脚有没有频率稳定的50MHz,波形是否干净,幅度是否满足芯片要求。
  • 测复位:复位脚在上电后应该为高,RC复位的充电波形是否正常。
  • 试MDIO通信:用GPIO模拟或HAL库函数读0x02/0x03寄存器,确认能读到正确的PHY ID,这一步通了说明管理接口没问题。
  • 看Link状态:插上网线,观察link灯和0x01寄存器的bit2,确认物理层是否协商成功。
  • 测试网络通信:先用ping验证网络连通性,再通过UDP/TCP工具持续收发大数据包,观察稳定性和丢包率。

这个流程里的每一步都是环路排查,前一步没过就不要往后走,否则会增加排查难度。

7.2 几个常见问题和对应的解决手段

现象可能原因排查和解决办法
MDIO读ID全为FFPHY地址不对、MDIO/MDC走线断、PHY没供电或没复位万用表量走线,GPIO模拟MDIO,检查地址引脚电平,复位后延时再读
link灯不亮电源异常、时钟没起、变压器焊接问题、PHY不协商按电源、时钟、复位、寄存器顺序一步一步查
link灯闪一下就灭自动协商失败、网线质量问题查0x01寄存器协商完成位,尝试强制100M全双工
能link但ping不通RMII数据线接错、MAC配置错误、地址/CRC问题核对RMII信号方向,检查MAC地址和CRC配置
长时间运行丢包或断线电源纹波大、时钟不稳、过热示波器看电源/时钟波形,加去耦电容或更换晶振
协商成功但速度总是10M对端设备能力、线缆问题、寄存器设置被覆盖读0x00寄存器确认速度位,检查软件是否反复初始化PHY

7.3 个人体验:调试国产PHY,耐心和实验精神比工具重要

这块板子前前后后折腾了一周半,最后定位到确实是一个PCB走线断裂问题外加前期的焊接缺陷。但如果让我重新设计,我大概会做三件事来避免这些坑:第一,原理图阶段就把PHY地址、复位、时钟、LED这些关键引脚的使用方法逐条和数据手册对上,不留模糊;第二,PCB打样回来以后,先上电测一遍电源再焊芯片,或者至少在贴片厂做飞针测试;第三,调试的时候一定要把MDIO寄存器读取功能做成一个标配工具,不管是用串口命令还是上位机,方便随时看PHY状态。

杜邦线这个事说起来像是个笑话,但在现场调试里它就是最实用的一把刀。不要觉得飞线丢人,能快速定位问题的都是好方法。你飞完线,确认了哪一段有问题,再回过来改板子,下一次打样就直接绕开了。

最后还有个小技巧送给正在调试的朋友:如果你的MDIO始终不通,又怀疑是硬件问题,先别急着换芯片,把PHY的地址引脚轮流接高接低,多试几个地址。有些PHY对地址引脚的处理并没有你想的那么直接,尤其国产芯片的引脚复用情况复杂,很可能你设计的地址和芯片实际识别到的不一样。反正我用这个办法又救回过一次,地址是罪魁祸首。

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

Logistic回归本质:概率建模、数值稳定与最大熵解释

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

作者头像 李华
网站建设 2026/10/2 7:48:34

热-结构耦合仿真与热应力分析:从物理本质到工程实战

做结构仿真的朋友应该都遇到过这个场景:温度场云图画出来五彩斑斓,觉得热分析这一步算是过关了,结果把温度场导入结构分析一算,应力直接飙到几千兆帕,红色区域糊了一屏幕。第一反应通常是“我是不是哪里设置错了”&…

作者头像 李华
网站建设 2026/10/2 7:48:20

C++调用海康SDK实现局域网设备批量搜索与信息解析

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

作者头像 李华
网站建设 2026/10/2 7:47:25

iTunes登录协议抓包被检测?HTTPDebugger机制解析与替代方案

折腾过 Apple 系协议调试的朋友,多半都遇到过这种让人抓狂的场面:明明 HTTPDebugger 已经跑起来了,过滤器也设好了,结果 iTunes 一登录就断连、超时、或者干脆弹个“网络连接已重置”的提示。更烦的是,日志里什么都没留…

作者头像 李华
网站建设 2026/10/2 7:47:15

高通Chromatix Tuning:从XML到可烧录bin的完整固件交付实战

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

作者头像 李华
网站建设 2026/10/2 7:46:11

InDesign排版的本质是信息ID治理,不是软件操作

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

作者头像 李华