简介:该资源是德州仪器(TI)DS160PR410 四通道 PCIe 第 4 代线性转接驱动器的中文官方数据手册,面向从事高速数字设计、服务器与主板硬件开发以及信号完整性分析的工程师,用于解决 PCIe 链路因 PCB 走线或线缆损耗导致眼图闭合、通道长度受限的问题。压缩包为单一 PDF 文档,约 1.65MB,完整保留了芯片数据手册的结构,包括特性列表、引脚配置与功能、绝对最大额定值与 ESD 等级、推荐工作条件、热信息、直流与高速电气特性、SMBus/I2C 时序参数,以及详细的功能描述、编程方式和典型应用电路。手册重点给出 CTLE 在 8GHz 下最高 18dB 的升压、可处理 45dB 通道损耗的均衡能力、100ps 超低延迟与 160fs 低附加随机抖动等关键指标,并说明引脚搭接、SMBus 与 EEPROM 三种配置途径,以及 x2 至 x16 总线宽度的扩展方法。已有 146 人学习下载,适合硬件工程师在选型评估、链路预算核算与原理图设计阶段查阅参考。
1. 一条 16GT/s 链路跑不通,问题往往不在主控
一块服务器主板回板测试,PCIe Gen4 x16 插槽上挂加速卡,链路训练直接掉到 Gen1,换卡、换主控、重刷固件都不管用。后来用矢量网络分析仪一测,8GHz 处的通道插损已经三十几个 dB,接收端眼图基本是闭着的。这个场景里缺的不是更深的协议层调试,而是一颗 PCIe 转接驱动器——把已经被码间串扰压扁的波形重新抬起来。DS160PR410 干的正是这件事:四通道线性均衡,覆盖 Gen1 到 Gen4 的 16Gbps,能处理最高 45dB 的通道损耗,100ps 延迟、160fs 附加随机抖动,不介入链路训练。它适合正在做服务器主板、背板、加速卡、网卡或工控机底板的硬件工程师,也适合要交一份完整高速链路设计方案的毕设与课设。
2. 需求判定与技术选型:先把损耗预算算清楚再决定上不上
选型最怕两种极端:一种是通道明明还有 10dB 余量就急着加器件,白白增加成本和调试面;另一种是损耗已经吃掉整个预算还在死磕走线。判断依据只有一条——把奈奎斯特频率处的插损算出来,跟器件能力对上。
2.1 通道损耗预算:45dB 这条线怎么算
PCIe Gen4 是 16GT/s,NRZ 编码,奈奎斯特频率落在 8GHz。器件手册里写的「8GHz 下高达 18dB 的 CTLE 升压」和「可处理高达 45dB 的 PCIe 通道」,说的是两个不同层面的能力:18dB 是均衡器在 8GHz 这个单点上能提供的增益,45dB 是整个通道在链路上允许的总损耗。这两个数不能混着用,混着用就会得出「余量还有 27dB」这种错误结论。
实际做预算时,把通道拆成几段分别估,比拍脑袋给一个总数靠谱得多。下面这张表是我在几个板卡项目里常用的量级,具体数值必须用板材厂商的损耗模型和实测 S21 替换。
| 链路环节 | 8GHz 处典型插损 | 备注 |
|---|---|---|
| 主板走线(约 15cm) | 12~18dB | 与层叠、线宽、参考平面完整性直接相关 |
| 高速连接器一对 | 1~3dB | 背板连接器差异很大,以厂商 S 参数为准 |
| 过孔(含残桩) | 0.5~2dB/个 | 背钻与否能差出一倍 |
| AC 耦合电容焊盘 | 0.3~1dB | 0402 封装明显优于 0603 |
| 铜缆(如有) | 随长度线性增长 | 长线缆场景要单独建模 |
把这些量加起来,跟 45dB 的上限比,同时留出至少 20% 余量给批次差异和温漂。写个小脚本比手工加更不容易漏项:
# 通道插损预算:把各环节在奈奎斯特频率(Gen4 对应 8GHz)的插损相加 # 数值为工程经验量级,实际必须以板材厂商损耗模型和实测 S21 替换 loss_db = { "pcb_trace": 15.0, # 主板走线,换低损耗板材可压到 8dB 以内 "connector": 2.0, # 一对高速连接器 "vias": 3 * 1.2, # 3 个过孔,未背钻按 1.2dB/个估算 "ac_cap_pad": 0.6, # 一对 AC 耦合电容引入的阻抗不连续 } total = sum(loss_db.values()) BUDGET = 45.0 # 器件手册给出的通道损耗处理能力上限 print(f"总插损 {total:.1f} dB,剩余余量 {BUDGET - total:.1f} dB") if total > BUDGET * 0.8: print("已占用八成以上预算:优先缩短走线或换更低损耗板材,再考虑加器件")脚本里BUDGET取 45,是因为这是器件能力的硬上限,不是推荐工作点。0.8这个系数是我的习惯,超过八成就要回头改布局,而不是指望均衡器把所有问题吃下去。真实项目里还有一个常被忽略的项:参考平面被分割或者跨分割,那种损耗在 S21 曲线上表现为某个频段的塌陷,用平均值算预算根本发现不了。
2.2 线性转接驱动器与重定时器的取舍
这两类器件经常被混为一谈,其实设计取向完全不同。线性转接驱动器只做连续时间线性均衡加线性驱动,不做时钟数据恢复,因此它保留发射端 preset 信号的特性,主机控制器和终端设备照常协商发射均衡系数,链路训练协议完全透明。重定时器内部有 CDR,会重新采样、重新定时,能重置抖动预算,代价是延迟从百皮秒级涨到纳秒级,功耗和配置复杂度也上一个台阶。
| 对比项 | 线性转接驱动器 | 重定时器 |
|---|---|---|
| 延迟 | 约 100ps | 数百 ps 至 1ns 以上 |
| 协议透明性 | 完全透明,不改链路训练 | 需按协议配置,部分场景要固件配合 |
| 抖动处理 | 不重置抖动预算,只补偿 ISI | 可重置抖动预算 |
| 功耗 | 130mW/通道量级 | 明显更高 |
| 适用场景 | 无源通道损耗为主、参考时钟质量良好 | 多连接器级联、抖动预算卡死 |
判断方法很直接:如果眼图闭合的主因是 ISI,也就是无源通道把高频分量衰减掉了,线性方案就够;如果链路要跨两三个连接器、参考时钟本身抖动就大,或者系统要求把抖动预算完全重置,才轮到重定时器。选错方向的代价不小——用线性器件去救参考时钟问题,怎么调 CTLE 都是玄学,因为问题根本不在那个域里。
还有一点值得说清楚:协议无关是双刃剑。好处是它不会因为固件版本、协议版本对不上而出问题,插上就能用;坏处是它也不会帮你「骗过」链路训练,通道实在跑不动的时候,它没法凭空造出裕量来。
2.3 四通道粒度与链路宽度的映射
DS160PR410 是四通道器件,链路宽度决定了要放几片。x4 用一片、x8 用两片、x16 用四片,这个对应关系没什么悬念。真正需要设计的是通道的独立掉电能力:PWDN1 控制通道 0 和 1,PWDN2 控制通道 2 和 3,两路都是高电平掉电、低电平正常工作。
| 链路宽度 | 器件数量 | 使用的通道 | PWDN 配置 |
|---|---|---|---|
| x2 | 1 | ch0 / ch1 | PWDN2 拉高,关掉后两通道 |
| x4 | 1 | ch0~ch3 | PWDN1、PWDN2 均拉低 |
| x8 | 2 | 各 4 通道 | 同上 |
| x16 | 4 | 各 4 通道 | 同上 |
掉电带来的收益是实打实的:四通道全开时器件电流 150~200mA,只开两通道降到 85~110mA,全关待机只要 26~33mA。x16 场景下四片全开,3.3V 轨上就是 600~800mA 的静态负载,电源设计时必须把这笔账算进去,不能按单片去估。
x16 还有一个容易翻车的细节:四片器件的 CTLE 档位不必完全一致。四对差分对的走线长度、过孔数量、连接器位置往往不同,插损能差出 3~5dB,用同一档均衡会让损耗小的那几对过均衡、损耗大的那几对欠均衡。分片独立配置,是这类方案能不能把眼图做齐的关键。
3. 硬件方案设计:从引脚定义到电源与布局
原理图阶段真正决定成败的,往往不是主信号路径,而是那几个四电平引脚怎么接、电源怎么去耦、散热焊盘怎么打孔。这三件事做错,后面软件怎么调都救不回来。
3.1 通道拓扑、AC 耦合与端接
典型链路的走向是:主控或交换芯片的发送端 → AC 耦合电容 → DS160PR410 的 RX 差分对 → 片内 CTLE → 线性驱动 → TX 差分对 → AC 耦合电容 → 终端设备。器件内部 RX 侧有 100Ω 差分端接、DC 单端阻抗 50Ω,TX 侧是 100Ω 差分驱动,所以外部不需要再加端接电阻,这一点跟某些老式中继器不一样,别照着旧方案抄。
AC 耦合电容的位置按 PCIe 规范放在发送端附近,容值常用 100nF。封装选 0402,焊盘尽量做窄,让电容焊盘处的阻抗不连续尽量小——这一对焊盘在 8GHz 上贡献的插损比你想象的大。
RX_DET 引脚是四电平输入,用来控制接收检测功能:不同电平决定上电时使能 50Ω 还是大于 50kΩ 的端接。器件在上电阶段会通过 TX 输出做接收端检测,检测结果直接影响链路能不能正常建立。这个引脚不能悬空,悬空等于把检测行为交给运气。
3.2 电源、VREG 去耦与上电时序
供电是 3.3V 单电源,推荐范围 3.0~3.6V。电源噪声容限分三段给出,这个细节很多方案会忽略:DC 到 50Hz 允许 250mVpp,50Hz 到 10MHz 收紧到 120mVpp,10MHz 以上是 110mVpp。也就是说低频段宽松、高频段严格,去耦电容的选型要按高频段那 110mVpp 来卡,光堆大容值电解电容没用。
VREG 是内部稳压输出,引脚 11 和 18,标称 2.5V,每个引脚旁边必须就近放 0.1µF 去耦。手册明确写了这个稳压器仅供内部使用,不要拿去给外部器件供电——拿它当 LDO 用是典型的翻车点,轻则电压跌落导致配置异常,重则直接损伤器件。
VDD 上电斜率要求 0.15~100ms,从 0V 爬到 3.0V。斜率太慢会让内部上电复位逻辑判断异常,太快则可能触发浪涌。做电源时序控制的时候,这一条要写进上电时序表里,别只写「3.3V 正常上电」。
功耗和结温在方案阶段就该算清楚,别等到样机烫手才回头:
# 估算 x16 链路(4 片器件)的总功耗与结温余量 per_channel_mw = 130 # 手册给出的每通道有功功率 channels_per_device = 4 devices = 4 # PCIe x16 需要 4 片 total_mw = per_channel_mw * channels_per_device * devices theta_ja = 31.1 # WQFN-40 封装结到环境热阻,无风冷条件 ambient = 55 # 机箱内环境温度,按最坏情况取 tj = ambient + (total_mw / 1000) * theta_ja print(f"总功耗 {total_mw/1000:.2f} W,估算结温 {tj:.1f} °C") print("结温上限 125°C,余量 30°C 以上可以不用散热器")per_channel_mw取 130 是手册的典型值,theta_ja取 31.1 对应 40 引脚 WQFN 封装。算下来四片总共 2.08W,环境 55℃ 时结温约 120℃——已经贴着上限了。这个结果说明 x16 满配场景下,即便单通道功耗很低,四片挤在一起时散热焊盘的设计仍然不能省,强制风冷或者加大铺铜都是必要手段。
3.3 四电平引脚的电阻网络设计
EN_SMB、EQ0_ADDR0、EQ1_ADDR1、GAIN、RX_DET、VOD 这六个引脚都是四电平输入,靠分压出四个档位来编码配置。这里有两个硬约束必须同时满足。
第一个是电压上限。四电平输入的绝对最大电压是 2.75V,而系统电源是 3.3V,所以这几个引脚绝对不能直接短接到 3.3V 电源轨上。这是原理图评审时最容易漏的一条,接了当时可能也能工作,但已经工作在绝对最大值边缘,长期可靠性没有保障。
第二个是漏电流。手册给出四电平输入在高电平 2.5V 时的漏电流是 10µA,在 GND 时的低电平漏电流是 -150µA。分压网络的等效输出阻抗如果太大,这 150µA 就会把档位电压拉偏。按档位间隔的十分之一作为允许偏移来反推:
# 四电平输入分压网络取值校核 i_leak = 150e-6 # 手册给出的四电平输入低电平漏电流 v_span = 2.5 # 四电平输入的有效电压范围上限 level_gap = v_span / 4 # 相邻档位间隔,约 0.625V max_offset = level_gap / 10 # 允许偏移取档位间隔的十分之一 z_max = max_offset / i_leak print(f"允许偏移 {max_offset*1000:.0f} mV,分压网络等效阻抗需小于 {z_max:.0f} Ω")算出来阈值在四百欧量级。这意味着分压电阻不能随手用 10k/10k,那种组合的戴维南等效阻抗是 5k,150µA 一灌就是 0.75V 的偏移,档位直接跳到隔壁去了。实用的取法是百欧量级的分压电阻,配合 1% 精度,同时注意静态功耗——四档分压网络常驻导通,每个网络几百微安,六个引脚加起来也是毫安级,电池供电场景要单独评估。
| 电平档位 | 接法 | 注意事项 |
|---|---|---|
| L0 | 直接接 GND | 最简单,无静态功耗 |
| L1 | 低阻分压至约 1/4 量程 | 分压电阻取百欧量级 |
| L2 | 低阻分压至约 1/2 量程 | 同上,注意电阻精度 |
| L3 | 分压至接近 2.5V,不可接 3.3V | 必须低于 2.75V 绝对最大值 |
具体每个档位对应的电压窗口以器件手册第 7.4 节的四电平编码表为准,上面这张表给的是设计方法,不是可以直接照抄的电压值。
3.4 封装散热与 PCB 布局约束
封装是 4mm × 6mm 的 40 引脚 WQFN,底部有裸露散热焊盘。这个焊盘既是接地回流路径,也是主要散热通道,必须通过低阻路径连到地平面。常规做法是在焊盘下打阵列过孔,孔径 0.3mm、间距 1mm 量级,过孔要连通到至少两层地平面,既降低接地阻抗也提升散热。
差分对布局的几条硬要求:单对内部等长控制在 5mil 以内,对与对之间的长度偏差按协议要求单独控制;差分阻抗按 100Ω 设计,参考平面必须完整,不允许跨分割;AC 耦合电容尽量靠近发送端,电容两侧的走线不要出现宽度突变。
电源部分,VDD 引脚 31、34、35、38 每个都要有独立去耦,0.1µF 就近放置,大容值储能电容放在电源入口。VREG 的 0.1µF 必须紧贴引脚 11 和 18,多走 2mm 效果就打折。
布局评审时我一般会拿这张清单逐条过:散热焊盘的过孔阵列有没有打满、VREG 去耦电容距离是否在 2mm 内、六个四电平引脚的分压网络是否都避开了 3.3V 直连、AC 耦合电容是否在发送端、差分对有没有跨分割、PWDN1/PWDN2 是否有明确的上拉或下拉电阻而不是悬空。这六条过完,板子基本不会出结构性问题。
4. 配置落地:引脚搭接、SMBus 与 EEPROM 三条路径
这颗器件的配置方式有三条:引脚搭接、SMBus/I2C 在线配置、外部 EEPROM 上电自动加载。选哪条不取决于哪条更「高级」,而取决于产品阶段和量产形态。
4.1 引脚搭接模式的最小系统
把 EN_SMB 设在 L0,器件进入引脚控制模式。此时 EQ0_ADDR0 和 EQ1_ADDR1 不再当地址用,而是解码成 CTLE 升压档位;GAIN 设定 CTLE 的 DC 增益,只有 L2 的 0dB 和 L3 的 3.5dB 两档有效,L0 和 L1 是保留值;VOD 设定输出幅度,四档分别是 -6dB、-3.5dB、0dB、-1.6dB;RX_DET 控制接收检测的端接行为。
这个模式的好处是上电即生效,不需要任何 MCU、不需要固件、不需要产线烧录,BOM 上只多了几个分压电阻。链路拓扑固定、损耗在设计阶段已经测准的量产板,用这个模式最省事。READ_EN_N 在这个模式下要上拉到 3.3V,外部 4.7k 电阻,不能悬空。
代价是调不了。CTLE 档位改一次就要改板,样机阶段用这个模式会很痛苦。我的习惯是样机阶段先留出 I2C 测试点和四电平引脚的跳线位,等参数扫完、确定最终档位之后,再在量产版本上固化成电阻搭接。
4.2 SMBus/I2C 从机模式与寄存器访问
EN_SMB 设到 L3 进入从机模式,EQ0_ADDR0 和 EQ1_ADDR1 转为设定器件地址。SCL 和 SDA 都是开漏、3.3V 容忍,外部需要 1k~5k 上拉,总线频率最高 400kHz。READ_EN_N 在这个模式下拉低会让器件保持复位状态,包括 I2C 状态机复位和寄存器复位,所以正常工作时必须用 4.7k 上拉到 3.3V。
调试阶段先用 i2c-tools 确认器件在不在总线上:
# -y 跳过交互确认,-r 使用读字节方式探测,避免某些控制器写探测误判 i2cdetect -y -r 3 # 读一个寄存器确认器件在线,寄存器地址按手册寄存器表填写 i2cget -y 3 0x3c 0x00 # 写寄存器:量产脚本里建议先用 i2cget 读回原值再决定写入内容 i2cset -y 3 0x3c 0x12 0x0fi2cdetect扫描出来全是--的时候,先查三件事:READ_EN_N 有没有上拉、SDA/SCL 上拉电阻装了没有、地址有没有跟板上其他器件撞。这三条覆盖了绝大多数「扫不到」的现场。
寄存器操作有一个必须遵守的习惯:读改写,不要直接整字节覆盖。同一字节里往往装着好几个字段,直接写会把别的位一起冲掉,而且现象很难复现。
from smbus2 import SMBus, i2c_msg BUS = 3 ADDR = 0x3C # 由 EQ0_ADDR0 / EQ1_ADDR1 两个四电平引脚决定,按实际搭接修改 def read_reg(bus, addr, reg): """读一个 8 位寄存器:先写寄存器指针,再发起读事务""" ptr = i2c_msg.write(addr, [reg]) rd = i2c_msg.read(addr, 1) bus.i2c_rdwr(ptr, rd) return list(rd)[0] def update_bits(bus, addr, reg, mask, value): """读改写:只修改 mask 覆盖的位,其余位保持原状""" old = read_reg(bus, addr, reg) new = (old & ~mask) | (value & mask) bus.i2c_rdwr(i2c_msg.write(addr, [reg, new])) return old, new with SMBus(BUS) as bus: old, new = update_bits(bus, ADDR, 0x12, mask=0x0F, value=0x07) print(f"寄存器 0x12: 0x{old:02X} -> 0x{new:02X}")read_reg里用的是组合事务,先写指针再读数据,中间不能让总线释放,否则指针会丢。update_bits的mask参数决定改哪几位,value只在 mask 覆盖的位置生效。寄存器 0x12 和具体字段位定义要按手册的寄存器表填,上面代码给的是访问方法,不是可以直接跑的寄存器映射。地址 0x3C 也只是示例,实际值由两个地址引脚的四电平搭接决定,写代码前先用i2cdetect确认。
4.3 EEPROM 主模式的上电自动加载
EN_SMB 设到 L1 进入主模式,器件上电后自己当主机去读外部 EEPROM,把配置加载进来。这个模式在产线上很受欢迎,因为不需要 MCU、不需要固件、不需要额外工序,配置跟着板子走。
时序上有两个信号要盯住。READ_EN_N 拉低启动 EEPROM 读操作;ALL_DONE_N 是开漏输出,需要外部 4.7k 上拉,加载成功后它会拉低,加载失败或不完整则保持高电平。从这个电平就能直接判断配置有没有加载进去,等于给了一个免费的自检位。
# 主模式上电自检:驱动 READ_EN_N,回读 ALL_DONE_N 判断加载结果 # gpio 为板级 GPIO 抽象,实际替换为项目所用的库 import time READ_EN_N = gpio.claim("gpio112", direction="out") ALL_DONE_N = gpio.claim("gpio113", direction="in") # 需外部 4.7k 上拉 def load_from_eeprom(timeout_s=0.2, poll_s=0.005): READ_EN_N.set(1) time.sleep(0.01) # 留出内部复位完成的时间 READ_EN_N.set(0) # 拉低触发 EEPROM 读 deadline = time.time() + timeout_s while time.time() < deadline: if ALL_DONE_N.get() == 0: # 低电平表示加载成功且完整 return True time.sleep(poll_s) return False ok = load_from_eeprom() print("EEPROM 加载成功" if ok else "加载失败:查上拉电阻、EEPROM 内容、上电斜率")超时时间 200ms 是保守取值,实际能多快取决于 EEPROM 容量和总线速率,样机阶段先用宽裕值跑通,再按实测收紧。轮询间隔 5ms 是为了不让 GPIO 读取占满 CPU,同时保证能在超时前抓到跳变。
这个模式有一个前提容易被忽略:EEPROM 里必须有有效内容。空片或者内容校验不过,ALL_DONE_N 就不会拉低,链路会停在默认配置上,现象是「能起来但性能不对」,比完全不通更难查。
4.4 增益、CTLE 与 VOD 的联合调法
三个参数都能影响眼图,一起动手的结果就是调完不知道是谁起的作用。我一般按固定顺序扫:先把 VOD 放 0dB 档(L2)、GAIN 放 0dB 档(L2),只动 CTLE,从低档往高档扫,记录每个档位的眼高和眼宽。CTLE 找到拐点之后,再动 VOD,最后才考虑 GAIN 那 3.5dB。
| 序号 | CTLE 档 | GAIN | VOD | 眼高(mV) | 眼宽(UI) | 判断 |
|---|---|---|---|---|---|---|
| 1 | 低 | 0dB | 0dB | 基准 | ||
| 2 | 中 | 0dB | 0dB | 只看 CTLE 增量 | ||
| 3 | 高 | 0dB | 0dB | 过均衡时眼高反而下降 | ||
| 4 | 最优档 | 0dB | -3.5dB | 降幅度看抖动变化 | ||
| 5 | 最优档 | 3.5dB | 0dB | 最后验证增益补偿 |
CTLE 档位不是越高越好。过均衡会把低频分量也一起抬起来,眼高看着没降,但抖动变差、共模偏移加大,长时间跑压力测试才暴露。第 3 行那个「过均衡时眼高反而下降」的现象,是判断档位有没有调过头的直接信号。
VOD 往下降(-3.5dB、-6dB)能减小输出摆幅,在某些接收端过驱的场景下反而让眼图更干净,但这会压缩信噪比,不能作为常规手段。
5. 避坑与排查:五类最容易翻车的现场
5.1 链路能训练但只跑 Gen1,或者宽度从 x16 掉到 x8
现象是插上设备能识别,lspci也能看到设备,但链路速率和宽度都低于设计目标,重插、换槽位有时候会变,有时候不变。
原因通常有两个方向。一是均衡不足,通道插损超出当前 CTLE 档位的补偿能力,接收端眼图在 Gen3/Gen4 速率下闭合,链路训练自动降速保连接——这是协议的保护机制,不是故障。二是 AC 耦合电容位置放错,放到了接收端,导致直流共模点偏移,训练过程中出现异常。
解决路径是先测后调。用lspci -vv看当前链路状态,确认降速是发生在训练阶段还是运行阶段:
# 查看指定设备的链路能力与实际状态,LnkCap 是能力,LnkSta 是当前状态 lspci -vv -s 01:00.0 | grep -A2 -E "LnkCap|LnkSta"如果LnkCap显示支持 16GT/s x16 而LnkSta只有 2.5GT/s,说明是训练没谈拢,优先加 CTLE 档位;如果两边一致但都低,问题在更上游。AC 耦合电容的位置用显微镜复查一遍,确认在发送端。
5.2 四电平引脚档位读错,器件进不了预期模式
现象是配置电阻明明按计算值焊了,器件行为却跟预期不符,比如设成从机模式却怎么都扫不到,或者 CTLE 档位跟搭接对不上。
原因基本锁定在分压网络的等效阻抗。四电平输入的低电平漏电流是 -150µA,如果分压电阻取了 10k 量级,这个电流产生的偏移足以把档位推到相邻区间。另一个常见原因是把某个档位直接接到了 3.3V 电源轨,超过 2.75V 的绝对最大值,器件可能进入未定义状态。
解决方法是把分压电阻降到百欧量级,用 1% 精度,焊完之后实测每个引脚的实际电压,对照手册的四电平编码表逐档确认。这一步在样机阶段花十分钟,能省掉后面几天的怀疑人生。
5.3 I2C 扫不到器件,或者读回来全是 0xFF
现象是i2cdetect扫出来目标地址位置是空的,或者能扫到但读寄存器返回 0xFF。
原因按出现频率排:READ_EN_N 没有上拉到 3.3V,器件一直处于复位状态;SDA/SCL 上拉电阻漏装或者阻值过大,边沿太缓;地址跟板上 EEPROM 或其他器件撞了;总线频率超过 400kHz 上限。
排查时先用示波器看 SCL/SDA 的波形,边沿是不是够陡、有没有被拉死在低电平。然后单独量 READ_EN_N 的电压,确认是 3.3V 而不是悬空的中间电平。地址冲突可以用i2cdetect的全量扫描对比,看预期地址上是不是已经有别的器件。上拉电阻按 1k~5k 选,总线电容大的板子取小值。
5.4 EEPROM 主模式加载失败,ALL_DONE_N 一直是高电平
现象是上电后链路能起来,但性能明显不对,测 ALL_DONE_N 一直是高,说明配置没加载进去。
原因有三种。ALL_DONE_N 是开漏输出,外部 4.7k 上拉漏装的话它永远读不到有效
本文还有配套的精品资源,点击获取