ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

LPC总线设计实战:从时序关系到PCB布线与调试全攻略

LPC总线设计实战:从时序关系到PCB布线与调试全攻略 前阵子有一块工控主板BIOS 里 Super I/O 偶尔识别不到冷启动大概率失败热机之后又能过。最开始怀疑芯片本身换了三四颗无果。后来拿示波器量 LPC 总线的 LAD[3:0]发现数据线下降沿上挂着一个明显的回钩建立时间余量几乎被吃干净。查了整整两天根因就是 LAD 少了两个上拉电阻走线还绕了将近 8 英寸。一个工作在 33MHz 的所谓“低速总线”硬是把高频信号的那些毛病全体验了一遍。LPCLow Pin Count总线由 Intel 在 90 年代末提出用来替代老旧的 ISA 总线至今仍然是 PC、工控机、服务器主板上连接 Super I/O、TPM、BMC、BIOS Flash 的重要接口。很多人觉得它频率低、线又少layout 随便拉一拉就行但真正踩过坑的人都知道LPC 恰恰是低速信号设计里最有代表性、也最容易翻车的一类。这篇文章把我实际做过的 LPC 相关设计经验完整梳理了一遍从时序逻辑、原理图细节、PCB 布局布线到上板调试和搭档器件选型一次性讲透。1. 先把 LPC 的时序骨架和“低速陷阱”搞清楚1.1 为什么新平台都在推 eSPI我们还要认真设计 LPC先说个现实Intel 从 Skylake 时代开始力推 eSPI用来替代 LPC。eSPI 引脚更少、速率更高、还支持带外管理通道新平台默认优先走 eSPI。那为什么 LPC 还值得专门写一篇因为存量远比你想象的多。工控机、服务器、医疗设备这些生命周期动辄五年十年的产品BOM 里大概率还挂着支持 LPC 的 Super I/O 和 TPM 模块。服务器 BMC 目前很多也是通过 LPC 去访问 BIOS Flash 和 Super I/O做带外管理。哪怕你画一块全新的板子只要选了颗只带 LPC 接口的老外设就绕不开这些设计要点。更何况LPC 的很多设计思路——共享总线拓扑、开漏信号上拉、源端匹配、参考平面完整性——到了 eSPI 上依然完全适用。把 LPC 吃透了再去做 eSPI 的 layout 会轻松不少。1.2 “低速”的真相频率低但边沿一点不慢这是整篇文章最核心的认知必须先掰开揉碎讲清楚。LPC 总线最常用的时钟是 33MHz周期大约 30ns。从重复频率看它确实是个不折不扣的低速总线。但数字信号质量的杀手从来不是时钟频率而是上升沿时间。3.3V LVCMOS 信号的上升沿通常在 1ns 到 3ns 之间取决于芯片驱动强度和负载电容。工程上估算一个方波信号的有效带宽常用公式[ f_{knee} \frac{0.35}{t_r} ]假设上升沿是 1ns算出来有效频率高达 350MHz哪怕边沿放宽到 3ns也有 116MHz 左右。换句话说一根 LPC 数据线上跳变的瞬间等效于在走线上跑一个几百 MHz 的信号。FR4 板材里信号传播速度大约是 6 inch/ns1ns 的上升沿对应约 6 inch 空间长度。经验法则告诉我们走线长度超过上升沿对应空间长度的 1/6也就是 1 inch 左右传输线效应就不能忽略。所以“33MHz 随便拉线”这个想法是 LPC 设计里最大的坑。你看到的现象可能是走线 8 英寸、拓扑是一拖多的长分支、还没有任何匹配——反射、振铃、过冲自然全来了。1.3 七根信号线各司其职LPC 总线之所以叫 Low Pin Count是因为它把地址、数据、命令全部复用到 4 根线上。完整的 LPC 接口总共就七个关键信号信号方向类型作用LCLKHost 输出推挽总线时钟通常 33MHz部分平台 25MHz/24MHzLFRAME#Host 输出推挽帧信号低有效标志一个新传输周期开始LAD[3:0]双向三态地址/数据/命令复用的 4 位总线LRESET#Host 输出推挽/需确认复位信号低有效LDRQ#外设输出开漏DMA 或总线主控请求低有效SERIRQ外设输出开漏串行中断请求一根线上时分复用传输多个中断源前五个是标准 LPC 必有的SERIRQ 在接 Super I/O 这类带中断的设备时基本都会用到。LDRQ# 则只在设备需要 DMA 或总线主控能力时才接。注意方向LCLK、LFRAME#、LRESET# 都是 HostPCH/EC输出LAD[3:0] 是双向三态总线而 LDRQ# 和 SERIRQ 是外设开漏输出。这个方向差异直接决定了上拉和端接怎么做。1.4 一次 LPC 访问在时间轴上是怎么走的理解 LPC 的信号设计之前至少要知道一次访问大概长什么样。以 Host 发起一次 32 位内存写为例大致经历这么几个阶段STARTLFRAME# 拉低同时 LAD[3:0] 送出 0000总线上的所有设备都意识到新周期开始了。Cycle Type / Direction / SizeHost 在 LAD 上送出周期类型内存读写、I/O 读写、DMA 等、传输方向和位宽。Address32 位地址在 4 根数据线上分 8 个 nibble 依次送出。所以地址本身就要占 8 个时钟周期。Data数据同样按 4 位一组走32 位数据要 8 个时钟。如果外设比较慢它会在数据阶段插入 SYNC 等待周期让 Host 等着它。TAR周期最后有 turn-around 拍让总线所有权从外设交还给 Host避免三态缓冲冲突。全部算下来一次 32 位内存访问在无等待状态下大概要 20 个时钟左右。这意味着 LPC 虽然“只有 33MHz”但实际完成一个事务的速度并不像它的频率看起来那么快。这个时序结构也解释了一个设计要点由于地址和数据都挤在 LAD 上LAD 的信号质量直接影响整个事务的成败任何一位在采样沿附近跳变不稳定、建立时间不足都会导致地址错、数据错而且这种错往往还时好时坏极难复现。1.5 时序预算真正影响 LPC 布局布线的三个数LPC 是同步总线所有信号都在 LCLK 上升沿采样。设计上需要关心的时序参数主要有三个建立时间Setup Time数据必须在 LCLK 上升沿之前稳定。多数 LPC 设备要求几纳秒量级的建立时间具体以器件手册为准。保持时间Hold Time数据在采样沿之后还需要保持一小段时间通常是 0 到 2ns。时钟到数据的偏斜Clock-to-Data Skew不同设备端看到的 LCLK 和 LAD 之间的延迟差这是布线阶段可以直接控制的。实际操作中不需要像 DDR 那样精确到 mil 级。33MHz 的周期有 30ns留给布局布线的余量相对宽松。我们项目里一般把 LCLK 与 LAD 的延迟差控制在 ±1 inch 以内换算过来约等于 150~200ps完全足够覆盖建立保持时间的需求。但要注意时序余量宽不代表可以无视信号质量。因为过冲、振铃这些问题会让信号在阈值附近来回穿越哪怕时序上算出来余量很大实际采样点也会变得不稳定。这正是 LPC 设计里“时序不是主要矛盾信号质量才是”的根本原因。2. 原理图阶段这几件事没做好后面很难救2.1 LAD 该不该上拉为什么总有人在这里翻车LAD[3:0] 是双向三态总线。正常工作的时候Host 或外设会把总线驱动到确定电平空闲状态下总线保持高电平。问题出在系统启动瞬间。Host 复位释放前LAD 上没有任何设备驱动总线处于高阻状态。如果外部没有任何偏置LAD 会浮空在某个随机的电平甚至有可能是门限附近。一旦某个设备在这种不确定状态下误判了总线状态轻则一次错误访问重则把总线拉死导致整个 LPC 周期起不来。所以工程上普遍的做法是在 LAD[3:0] 上各加一颗上拉电阻到 VCC_LPC。阻值常见 10k 到 47k我们一般取 10k 或者 22k兼顾静态功耗和抗干扰。也有些平台参考设计不加 LAD 上拉也能正常工作。但我个人强烈建议预留。一颗 0402 电阻的成本几乎可以忽略但它能消除一大类“上电时序敏感、时好时坏”的疑难杂症。2.2 LFRAME#、LRESET#、LDRQ#、SERIRQ 的上拉差异这几根信号的上拉需求完全不同列个表说清楚信号是否需要上拉推荐阻值原因LFRAME#建议预留10kHost 强推输出正常不需要预留是为了防止 Host 未就绪期间电平不确定LRESET#看平台参考10k驱动方式不统一参考设计没明确时预留最稳LDRQ#必须4.7k~10k外设开漏输出不上拉无法产生有效低电平SERIRQ必须4.7k~10k外设开漏输出不上拉等于没接中断重点说下 SERIRQ它经常被忽略。很多 Super I/O 的串口、并口中断都通过 SERIRQ 上报。如果原理图上漏了这颗上拉最常见的现象就是设备在 BIOS 里能认到但一进系统串口收发数据正常就是中断不触发或者触发一次之后就再也不响应了。其实 SERIRQ 的设计思路和主板上的 I2C SDA/SCL 很类似开漏、多设备共享、靠上拉电阻保证高电平。布线时把它当作一根比较敏感的信号处理不要和电源、时钟靠太近。2.3 串联匹配电阻LCLK 和 LFRAME# 值得加LAD 要谨慎LPC 总线要不要做端接匹配是原理图阶段另一个容易纠结的点。我的工程结论是LCLK 建议加串联电阻阻值 22Ω 到 33Ω放在时钟源输出端Host 引脚附近。LCLK 是单端时钟边沿陡走线稍长就会有反射串阻能显著改善过冲。LFRAME# 建议加串联电阻同样是 22Ω 到 33Ω放在 Host 端。因为 LFRAME# 始终由 Host 驱动源端匹配的效果很直接。LAD[3:0] 的串联电阻要谨慎。LAD 是双向总线信号驱动源会在 Host 和外设之间切换。如果你只在 Host 端串了电阻Host 驱动数据时有效果但到了外设回数据比如 TAR 或者读数据阶段驱动源变成外设Host 端那颗电阻反而变成了路径上的累赘对信号质量帮助有限。所以在很多参考设计里LAD 是不加串阻的靠短走线、整洁拓扑和上拉来保证质量。如果你实在担心 LAD 的过冲可以在原理图上先预留 0Ω 电阻位等样机实测之后根据波形再决定要不要换成 22Ω 或者 33Ω。这个方法成本低还不用返工改版。2.4 电源去耦和电平域的细节LPC 接口电平通常是 3.3V部分新平台会有 1.8V 的变种。上拉电阻的电源必须和对应器件电源域一致不要随手拉到主 3.3V 去否则器件在休眠或掉电状态下可能通过上拉电阻漏电把不该带电的域带起来。去耦方面每个 LPC 器件电源引脚附近放一颗 0.1uF 陶瓷电容是底线离引脚控制在 100mil 以内。如果器件离电源输出比较远再补一颗 1uF 到 10uF 的体电容。这里有一个容易被忽略的点LPC 器件在工作时拉低 LAD、LDRQ#、SERIRQ 会产生瞬态电流尤其是开漏信号从高拉到低的瞬间电流几乎全部由电源通过上拉电阻提供。如果电源布局上 LPC 器件的去耦不足总线翻转瞬间会在地弹和电源噪声里体现出来现象就是信号边沿上叠加毛刺。不要小看这些毛刺。它们会让本来就紧张的建立时间余量雪上加霜。3. PCB 阶段拓扑、等长和回流是三个核心维度3.1 拓扑选择菊花链是 LPC 的默认答案到了 layout 阶段第一件事就是确定拓扑。LPC 总线上可能挂两个甚至三个设备比如 Super I/O、TPM、BIOS Flash 同时存在。这个时候拓扑结构直接决定信号质量的上限。推荐的拓扑很简单Host 引脚出来沿一条主线依次经过每个设备所有设备都挂在这条主线上每个设备引脚的引出线段stub尽量短最好控制在 300~500mil 以内。这种菊花链结构让信号能量沿主线传播每个设备连接处只产生很小的阻抗不连续。最忌讳的是星形拓扑。比如 Host 在板子中间TPM 插座在左边Super I/O 在右边layout 为了“等长美观”从 Host 分两路走线到两个设备。这种结构等于在总线上拉了两条长分支信号在每个分支末端反射叠加起来会在接收端形成明显的台阶和振铃。实测中最典型的表现是单个设备工作在板上能跑通插上第二个设备之后整个总线偶尔挂死拔掉一个设备又恢复。这就是长分支反射叠加造成的典型症状。3.2 长度约束真正该等长的是“每个设备看到的时钟与数据延迟差”很多人一说到总线布线就想到等长然后要求 LAD[3:0] 四条线严格等长。这个方向没错但不完整。LPC 更关键的是对每个具体设备而言它看到的 LCLK 路径长度和它看到的 LAD 路径长度之差要尽量小。因为采样沿是 LCLK 上升沿设备用 LCLK 去采样 LAD。假设 Host 到 Device1 的 LCLK 是 3 英寸LAD 是 3 英寸那 Device1 处的时钟数据和 skew 就很小。如果 Host 到 Device2 的 LCLK 是 5 英寸LAD 是 5 英寸Device2 处的 skew 同样小。这两个设备各自的采样时序都不错。反过来如果只追求所有 LAD 等长到 4 英寸但 Device2 的 LCLK 走到了 6 英寸那 Device2 看到的时钟明显滞后于数据建立时间余量就会恶化。具体指标上我们内部一般要求LPC 单段网络总长度尽量控制在 8 英寸以内最理想不超过 6 英寸每个设备处的 LCLK 与对应 LAD 长度差控制在 ±1 英寸以内严格一点可以做到 ±0.5 英寸LAD[3:0] 四条线之间互相等长误差 ±500mil 内即可。LPC 不是 DDR不需要做到 ±几十 mil 那种级别。把主要矛盾抓在时钟与数据相对偏斜上能省很多无谓的等长绕线绕线绕多了反而增加走线长度和过孔数量。3.3 参考平面、换层过孔与回流路径LPC 走线对参考平面的要求是尽量完整不要跨分割。在实际板卡布局里最容易出的问题是 LAD 走线跨过一条电源分割槽或者在一堆过孔旁边绕来绕去。跨分割会直接切断回流路径让信号绕着更大环路回流环路电感变大振铃加剧。如果确实需要换层要在换层过孔旁边紧挨着打一个回流地过孔保证信号换层时回流路径连续。这不是 LPC 特有的要求但对这种共享总线来说尤为重要因为 LAD 上任何一个毛刺都可能被正在采样的设备当成有效数据。还有一点LPC 尽量走内层还是表层表层方便调试飞线但受外部干扰大内层参考更稳定信号质量更好。我的习惯是总线部分优先走内层如果必须走表层组外围至少保证完整的 GND 铜皮包裹。3.4 串扰、连接器和 ESD 细节串扰方面LAD[3:0] 和 LFRAME# 这五根线组内间距建议不小于 2 倍线宽做到 3W 更好。它们都是同时翻转的信号组内串扰会叠加到受害线上严重时出现振铃。和板上其他高速信号比如 USB、PCIe、SATA、DDR 数据线要保持足够距离。LPC 虽然慢但它的边沿频带能到几百 MHz既容易被高速信号干扰也可能成为高速信号的骚扰源。至少做到其他高速信号组的 3W 间距之外避免长距离平行走线。如果 LPC 要引出到板外比如 TPM 模块插座、调试排针在连接器附近加低电容 TVS 二极管做 ESD 保护。注意选择电容尽量小的 TVS太大的容性负载会拖慢信号边沿。经验上单路电容小于 10pF 的型号对 33MHz LPC 影响很小可以放心用。连接器处的 pin stub 也要控制。排针焊盘到 TVS 或上拉电阻的走线不要太长避免在总线上留下明显的末端反射源。4. 上板调试信号质量判断与总线挂死定位4.1 第一步永远是判断“设备到底有没有被枚举”LPC 出问题时切忌一上来就满板子飞线测波形。先回答一个更基础的问题设备有没有被正常访问到不同平台的判断方式不太一样。常见的几个手段BIOS setup 里如果能直接看到 Super I/O 型号或 TPM 状态说明 LPC 至少能完成读写如果板子有串口而串口信号是从 Super I/O 出来的试着打开 BIOS 串口重定向。能出字符说明 LPC 的 Super I/O 通路基本是通的用传统 Port 80 诊断卡如果主板有这个接口看它有没有正常跑码。诊断卡本身也依赖 LPC 或 PCI 总线可以间接反映总线状态进系统后用dmesg | grep -i tpm或者厂商提供的 Super I/O 检测工具确认设备有没有出现在系统里。如果设备根本没被枚举到不要急着查 LAD 波形。先确认供电、复位、时钟是否到位再检查上拉电阻有没有贴反、漏贴。4.2 逻辑分析仪怎么接、怎么抓 LPC 事务LPC 调试最好用的工具是逻辑分析仪只要能抓到 LFRAME# 下降沿触发就能把总线事务完整还原出来。接线方式LCLK 接到逻辑分析仪的任意通道作为参考时钟LAD[3:0] 接四个通道LFRAME# 接一个通道有需要的话再接 LDRQ#、SERIRQ。采样率不用太高100MHz 到 200MHz 足够看清楚 33MHz 总线上的跳变。触发条件设置为 LFRAME# 下降沿这样每次 LPC 周期开始都会被捕获。上电或复位后抓一段数据重点看几件事LFRAME# 有没有周期性的低脉冲LAD 是否在 START 阶段送出 0000地址 nibble 是否连续完整最后有没有正常的 TAR 交接如果 LFRAME# 挂了之后 LAD 上没有任何后续动作说明 Host 访问被卡住或者根本没有发起有效周期。有些逻辑分析仪软件带协议解码功能可以直接解出地址、数据、周期类型调试效率会高很多。不过就算没有协议解码光看原始波形也能判断个八九不离十。4.3 示波器上判断信号质量的四个指标逻辑分析仪能告诉你“有”还是“没有”但信号好不好还是得上示波器。测量位置很重要探头一定要点在接收端引脚上也就是设备芯片的引脚附近而不是 Host 引脚附近。信号在线上传输之后接收端看到的才是设备真实采样的结果。探头地线要短最好用弹簧地针避免地环路引入额外噪声。示波器带宽建议 500MHz 左右200MHz 的也够用主要是看上升沿真实性会打折。重点看四个东西空闲电平LAD 和 LFRAME# 空闲状态是否稳定在 3.3V有没有毛刺或向下漂移到 VIH 以下的情况过冲幅度上升沿和下降沿的最高/最低点超出电源轨和地的比例。经验上不要超过 10% 的 VCC也就是 0.33V 左右。超过这个值说明端接或拓扑有问题。边沿单调性上升沿或下降沿有没有出现台阶、回勾、振铃一个明显的回勾往往意味着某个阻抗不连续点在反射。采样窗口稳定性用无限余辉模式观察 LCLK 上升沿前后各 5ns 的时间窗口内LAD 是否稳定不翻转。这是最接近设备真实采样视角的观察方式。LCLK 本身也要测频率是否正确、占空比是否接近 50/50、上升沿是否干净。时钟是采样基准时钟都不行后面数据再好也白搭。4.4 一个 LPC 总线挂死的完整排查链路这里分享一个实际项目里处理过的排查过程。现象是TPM 模块插上之后整机启动过程中不时卡住BIOS 检测不到任何 LPC 设备拔掉 TPM 模块就正常。当时没有一上来就动烙铁按照下面的顺序逐级排查步骤检查对象使用的工具结论1VCC_LPC 电源、接地万用表电压正常2LCLK 频率与幅度示波器33MHz 稳定3LFRAME#/LAD 空闲电平示波器LAD 空闲时出现 1.2V 左右的漂移电压4上拉电阻万用表LAD 上拉电阻未贴BOM 遗漏5TPM 模块连接器 stub 长度量测插座到模块之间 FPC 排线长约 12cm根因很清楚LAD 缺少上拉总线在空闲阶段浮空TPM 模块的 FPC 排线又过长相当于一条大号 stub把外界噪声耦合进总线。逻辑分析仪上看到的现象是 LFRAME# 周期明明存在但 LAD 上的 START 标志经常被噪声篡改设备端完全无法识别。补上 LAD 上拉、把 FPC 排线换成更短版本之后问题彻底消失。这个案例给我们的教训是LPC 这类低速共享总线上拉电阻和连接器长度都属于“看似不起眼、实则致命”的细节。5. 搭档器件的兼容性经验与投板前自检5.1 Super I/O 与 EC复位、地址规划一个都不能乱Super I/O 是 LPC 总线上最常见的设备。如果你板上同时有 ECEmbedded Controller和独立 Super I/O要注意二者之间的资源分配。首先是复位顺序。EC 通常会作为系统的上电管理核心它的启动顺序可能早于 PCH。如果 EC 也挂在 LPC 上要确保 LRESET# 释放之后所有 LPC 设备都完成了自身初始化Host 再开始访问。否则可能出现访问发起时设备还没准备好事务没有任何响应的情况。其次是 I/O 地址规划。Super I/O 的传统地址空间在 0x2E/0x2F 或者 0x4E/0x4F 这类端口很多外设功能也占用固定的 I/O 地址。如果 EC 或另一个设备占用了相同地址就会出现“两个设备都认为自己在被访问”的乱象。设计阶段就把地址表列清楚比调板时猜靠谱得多。5.2 TPM 模块连接器、上拉和排线长度都是雷区TPM 模块是 LPC 调试中最容易出问题的搭档。原因很现实主板上的 TPM 往往通过一个排针或者 FPC 连接器接出去模块本身可能是第三方转接来的走线长度和信号质量完全不在你控制范围内。设计上可以把这些因素控制住连接器尽量选短针型减少 pin stubTPM 模块的 FPC 排线尽量短超过 10cm 就要非常谨慎最好做成板对板直插确保 LAD、LFRAME# 的上拉在主板这一侧不要指望模块内部帮你加上拉有些 TPM 模块的某些引脚有特殊自检功能比如 DEEP_SLEEP、CLKRUN# 等原理图上不用的引脚也要按模块手册要求处理。还有一点不是所有 TPM 模块都是 LPC 接口。现在 SPI 接口的 TPM 也很常见。选型时先确认模块接口类型再对照主板设计别买回来才发现不兼容。5.3 新项目里还要不要选 LPCeSPI 时代怎么决策这个问题我在项目评审时经常被问到。如果是全新设计而且主控平台原生支持 eSPI那我的建议很明确能走 eSPI 就优先走 eSPI。引脚更少、速率更高、带外管理能力更强这些都是实打实的优势。但现实中的限制往往来自外设选型。你需要的某颗 Super I/O 只支持 LPC或者项目要求沿用上一代的 TPM 模块这时候就得在 LPC 和 eSPI 之间做桥接或共存。现在市面上有从 LPC 桥接到 eSPI 的转换方案也有同时支持两种接口的外设具体型号建议直接找原厂 FAE 要参考设计和兼容性测试报告比自己闷头猜稳妥得多。如果最终决定还是用 LPC那就接受它的局限性尽量少挂设备一个 LPC 总线上挂两三个设备已经是比较重的负载了。能用一颗多功能的芯片就尽量不要拆成两颗分开挂。5.4 投板前自检LPC 相关检查清单送板厂之前我会把下面这份清单过一遍很多 LPC 的问题都是在这里被拦下来的LAD[3:0]、LFRAME# 的上拉电阻是否预留阻值是否在 10k~47k 范围LDRQ#、SERIRQ 是否已经加上拉阻值是否在 4.7k~10kLCLK 和 LFRAME# 是否预留了源端 22Ω~33Ω 串联电阻位所有设备的电源去耦电容是否靠近引脚放置LPC 走线是否优先采用菊花链stub 是否小于 500mil每个设备处的 LCLK 与 LAD 长度差是否在 ±1 英寸以内是否有跨分割换层过孔旁是否打了回流地孔引出到连接器的 LPC 信号是否有 TVS 保护pin stub 是否最短LAD 组与其他高速信号间距是否足够以上任何一项不满足我个人的习惯是不轻易放行。毕竟 LPC 这种总线问题往往不是爆发式的而是在量产之后以“偶发性故障”的方式出现那才是最折磨人的。
返回列表