1. 先把“时序记录”的边界划清楚
做视频前端这几年,我经手过不少把图像传感器接到主控上的活,中间那条链路出问题的频率,远高于后端编码和传输。前段时间整理一份调试档案,主题就是海思平台 VI(Video Input)支持视频输入接口的时序记录。它既不属于调试日志,也不属于验证报告;它的定位更像一张设备接入说明:任何一次新的视频输入接入,只要照着这张表把该记的都记下来,后面出问题就不必再从零开始摸索。这篇内容适合三类人看:第一类刚开始接触海思 VI 驱动配置、还没搞清楚 dev 属性和 sensor 时序对应关系的开发者;第二类手上有现成板子、图像能出但偶尔抽帧或偏色的工程师;第三类需要把项目里视频输入参数固定下来、供后续复用或交接的人。全文围绕“怎么记、记什么、记下来怎么用”展开,兼顾并口和 MIPI 两条常见路径。
我见过太多项目在调试阶段凭手感改参数:图像偏了就把 hsync 极性翻一下,图像有噪点就把 pclk 相位调一格,试通了就锁死,谁也说不清最终值为什么是这个。等换一块 sensor、换一版驱动、甚至换一根排线,问题复现了,原来的“手感”直接失效。时序记录的价值就在于把这种隐性经验变成显性数据,让“这组参数在这个组合下能跑”变成可查、可比、可复现的事实。
1.1 一份时序记录要能回答哪三个问题
我在设计记录模板时反复简化,最后就留下三个问题:信号从哪来、以什么节奏来、VI 用什么姿态去接。第一个问题要写清接口类型、数据位宽、lane 数量和时钟来源;第二个问题要写清一帧内的行数、每行的像素节拍、行场消隐区、同步信号的极性与宽度;第三个问题要写清 VI 设备的接口模式、扫描方式、数据排列顺序、采样边沿。这三块内容凑齐,一条链路就基本被描述完了。
剩下的是边界条件,比如当前的分辨率、帧率、像素时钟频率、MIPI 单 lane 速率,以及这些值在驱动里对应哪个属性字段。别小看这一层,很多时候排查不下去,是因为记录里只有现象没有数值,比如“图像有轻微竖条纹”,这条描述没法帮任何人定位问题,但如果记录里写着行有效像素 1920、htotal 2200、pclk 148.5MHz、采样边沿为上升沿、lane 速率 372Mbps,那这条链路的时序模型就能被完整重建出来了。
我给自己定的规矩是:任何一次接入,记录必须能让另一个人在不看代码的情况下,通过配置和数值推算出波形的大致形状。做不到这一点,说明记录还是太依赖“当时现场的情况”。
1.2 为什么 VI 侧的时序问题最难定位
难在信息不对称。sensor 那边有数据手册,时序参数写得明明白白;主控这边有寄存器手册,字段定义也清楚;唯独中间那段实际走线,既没有文档也没有标准答案。板子上的走线长度、转接座阻抗、sensor 输出驱动强度、主控端采样时钟相位,这些因素共同决定了一个肉眼看不见的采样窗口,而这个窗口的余量往往只有几百皮秒到一两纳秒。
更麻烦的是表现形式的欺骗性。采样点偏到窗口边缘,可能不是直接黑屏,而是画面顶部几行出现规律性噪点;hsync 极性反了,可能只是整幅图像往右平移了若干像素,看起来“还能用”;lane 顺序接错,画面颜色能出但人脸发青。这些问题如果不动脑,很容易被归到“图像质量”上,跑去调 ISP 的降噪和色彩矩阵,一通操作下来毫无改善。我最早也踩过这个坑,在 ISP 侧折腾了整整两天,最后发现是并口 hsync 有效电平写反了。
所以要把时序记录往前推,推到信号刚进主控的那一刻,让“进主控时是什么样”成为可验证的事实。实际排查时,这个记录就是唯一可靠的锚点。
1.3 记录物应该长什么样
记录物不是一份文档,是一组东西:一张参数对照表、一段启动日志、一份关键寄存器快照,外加(如果条件允许)一段波形截图。参数表是主线,日志用来证明“驱动确实把这些值写下去了”,寄存器快照用来证明“硬件确实接受到了这些值”,波形用来证明“芯片管脚上真的是这个节奏”。四样东西层层校验,任何一层对不上,问题范围立刻就缩小了。
我习惯把这四者按“期望值—写入值—生效值—物理值”的顺序排列。期望值来自 sensor 手册和系统设计,写入值来自驱动代码里的结构体,生效值来自寄存器回读或 proc 节点,物理值来自示波器或逻辑分析仪。四列一摆,差异一目了然。这个四列法是我后来所有硬件调试的通用套路,不只是视频接口。
注意:寄存器回读的值和物理测量的值经常不一致,这在配置生效流程里有明确原因,但排查时很容易混淆。务必先确认设备已经进入工作状态再去回读,否则读到的只是复位默认值,会把你引向完全错误的方向。
2. 视频输入接口的时序底座:并行口与 MIPI 的差异
海思 VI 支持多种输入形态,实际项目里最常见的两类是并行接口(BT.656、BT.1120 这一类)和 MIPI CSI-2。这两条路径的时序记录方法完全不同,不能混在同一张表里写,否则读的人会搞混。
并行口属于“看得见”的时序:时钟线、行同步、场同步、数据线各司其职,抓波形一目了然。MIPI 属于“看不见”的时序:差分信号在高速态和低速态之间来回切换,物理层没有独立的同步线,行场信息藏在包头的短包里。前者的问题通常在极性和相位,后者的问题通常在物理层参数和数据包解析。
2.1 并行接口的时序参数清单
BT.1120 走的是内嵌同步或者独立同步的 16 位 YUV 传输,常见配置是 PCLK、HSYNC、VSYNC、DATA[15:0],有的方案会额外用 DE 信号标记有效数据区。要记录的参数我列成下面这张表,每次接入按行填,缺一行都算记录不完整。
| 参数 | 含义 | 记录要点 |
|---|---|---|
| PCLK 频率 | 像素时钟 | 实测值,不是标称值 |
| PCLK 极性 | 上升沿或下降沿采样 | 与 VI 配置必须一致 |
| HSYNC 极性 | 高有效或低有效 | 反了会左右平移 |
| HSYNC 宽度 | 行同步脉宽 | 单位 pclk 周期 |
| VSYNC 极性 | 高有效或低有效 | 反了会上下滚动 |
| VSYNC 宽度 | 场同步脉宽 | 单位行 |
| 行有效像素 | 每行有效数据 | 与分辨率对应 |
| 行总周期 | htotal | 含消隐 |
| 场总行数 | vtotal | 含场消隐 |
| 数据排列 | YUV422 顺序 | YUYV 或 UYVY |
| 数据位序 | 高位在前或低位在前 | 与硬件接法绑定 |
PCLK 频率我坚持写实测值。因为板上晶振有偏差,sensor 内部分频也可能带来偏差,标称 74.25MHz 实测 74.18MHz 是常有的事。这个偏差本身不影响功能,但它会在计算帧率和行周期时累积误差,如果记录里只写标称值,后面用逻辑分析仪算出的 htotal 会对不上,白白浪费一轮排查。
2.2 MIPI CSI-2 的物理层参数清单
MIPI 这边记录的维度换了,核心是 lane 配置和物理层时序参数。lane 数量决定了数据分摊方式,lane 顺序决定哪个字节属于哪个像素分量,物理层的 settle 时间决定了接收端什么时候开始采样。
| 参数 | 含义 | 影响 |
|---|---|---|
| lane 数量 | 1/2/4 lane | 影响单 lane 速率和带宽 |
| lane 映射顺序 | lane0~lane3 的物理对应 | 接错会花屏或偏色 |
| lane 极性 | 差分对 P/N 是否互换 | 反了不通信或误码 |
| 数据速率 | 单 lane 有效速率 | 与像素率匹配 |
| hs_settle | 高速态稳定时间 | 过小导致首包错 |
| clk_settle | 时钟 lane 稳定时间 | 影响整体采样 |
| 数据类型 | RAW8/10/12、YUV422 | 决定解包方式 |
| 连续时钟 | 是否连续输出时钟 | 影响低功耗与稳定性 |
hs_settle 和 clk_settle 这两个参数,是我见过最容易被随意填的。很多人从别的项目抄一个值过来,能出图就不管了。这两个值本质上是接收端的“等待时间”,以物理层时钟周期为单位计数。等待时间太短,接收端在信号还没稳定时就开始采样,表现出来是图像顶部几条线异常或者随机丢包;等待时间太长,会挤压后面的传输窗口,高分辨率高帧率时可能引发带宽不足。
2.3 建立保持时间与采样窗口的通俗解释
用一个生活化的类比:想象你在火车站接人,列车进站后乘客陆续下车,你要在人群里准确认出一位朋友。列车刚停稳的那一瞬间,人还在晃动,这时候去认容易认错;等人都稳定站定了再认,准确率最高;但如果等太久,人已经走出站台,你就错过了。采样窗口就是这个“稳定站定”的时间段,早了晚了都不行。
数字信号里,数据在时钟边沿附近会经历一段电平跳变的过渡期,这段过渡期内的电平是不可靠的。真正有效的判决区间是过渡期结束到下一次跳变开始之间的部分。建立时间要求数据在时钟沿到来之前稳定多久,保持时间要求数据在时钟沿之后继续保持多久。接收端的采样点如果落在这个区间中央,余量最大;落在边缘,任何一点抖动都会导致误判。
并行口的采样点靠 PCLK 相位调节,很多主控支持几个相位的粗调,本质上是在移动采样时刻。MIPI 的采样点由物理层自动对齐,调节手段就是 settle 时间和均衡配置。这两者的调参逻辑完全不一样,但目标一致:让采样点落在窗口中央。
2.4 消隐区为什么必须记
新手容易忽略消隐区,觉得反正不传图像数据,记不记无所谓。实际上消隐区承载了三件事:行场同步的实现、接收端的缓冲时间、以及一些传感器的内部处理时间。htotal 减掉行有效像素就是水平消隐,vtotal 减掉有效行数就是垂直消隐。这两个差值直接决定了实际像素时钟和实际帧率。
举个具体的:接到 1080p30 的输出,标称像素率是 1920×1080×30 约 62.2M 像素每秒,但真实像素时钟通常按 htotal×vtotal×帧率算,如果 htotal 是 2200、vtotal 是 1125,实际像素时钟就是 74.25MHz,比标称值高了将近 20%。这个差距全部来自消隐区。要是在记录里只写分辨率不写 htotal 和 vtotal,后面算带宽、算 MIPI 速率、算 DDR 占用,全都会算错。
注意:不同 sensor 的消隐区默认值差异很大,同一颗 sensor 在不同工作模式下消隐区也可能不同。记录时必须标注当前工作模式,否则同一颗 sensor 的两份记录会互相矛盾。
3. 海思 VI 侧的时序配置项逐条拆解
到了 VI 这一侧,配置分两层:一层是接口设备属性,描述“我用什么方式接”;另一层是通道属性,描述“我怎么处理接进来的数据”。时序相关的主要在第一层,但第二层的数据排列和裁剪也会影响最终画面,所以记录时两层都要写。
3.1 接口模式与数据宽度
VI 设备的接口模式是一个枚举值,MIPI、BT.656、BT.1120、数字相机接口各有对应项。这个值选错,后面所有配置都是错的。我遇到过一次,硬件走的是 BT.1120 的 16 位并口,驱动里写成了 BT.656 的 8 位内嵌同步模式,结果图像能出来但只有半幅,另一半是绿的。原因是 BT.656 只有 8 位数据线,高 8 位的分量信息根本没被接收。
数据宽度要和硬件实际连接严格对应。位宽写大了,多出来的位会读到悬空电平,表现为随机噪点;位宽写小了,高位分量丢失,表现为色彩严重失真。记录时我要求写清“物理连接位宽”和“驱动配置位宽”两项,两者必须相等。
/* 并口接入的接口属性示意,字段名以具体平台 SDK 为准 */ VI_DEV_ATTR_S dev_attr; memset(&dev_attr, 0, sizeof(dev_attr)); dev_attr.enIntfMode = VI_MODE_BT1120; /* 接口形态 */ dev_attr.enWorkMode = VI_WORK_MODE_1Multiplex; dev_attr.enScanMode = VI_SCAN_PROGRESSIVE; /* 逐行 */ dev_attr.enDataSeq = VI_DATA_SEQ_UYVY; /* 分量排列 */ dev_attr.enInputDataType = VI_DATA_TYPE_YUV; dev_attr.stSize.u32Width = 1920; dev_attr.stSize.u32Height = 1080;上面这段是并口配置的骨架,字段不多但每一个都对应一项物理事实。我习惯在结构体旁边逐行加注释,写明这个值是依据什么定下来的,比如“依据 sensor 手册第 X 页”“依据原理图连接”。写注释这件事看起来啰嗦,等半年后再回来看,能省下大量回忆成本。
3.2 时钟极性与同步信号极性
极性是最容易配错也最容易改对的一项。PCLK 极性决定了在上升沿还是下降沿锁存数据,HSYNC 和 VSYNC 极性决定了同步信号的有效电平。三项都是布尔值,配错的组合一共八种,实际能出正常图像的只有一种。
我总结的判断方法很朴素:先看现象定位到哪一项,再单向调整。图像整体左右偏移、边缘出现一条竖直噪带,先怀疑 HSYNC。图像上下滚动、或者出现横向拼接错位,先怀疑 VSYNC。图像有随机噪点、规律性竖条纹、边缘发虚,先怀疑 PCLK 极性或相位。这个对应关系不是绝对的,但能覆盖大部分情况,比盲试八种组合高效得多。
改极性的时候有个细节值得记:只改一项,其余保持不动,改完立刻抓一次画面。同时改多项,即使好了也不知道是哪一项起的作用,记录就失去意义了。
3.3 数据序列与 YUV 排列
数据序列这个字段,本质上描述的是“第一个字节是哪个分量”。YUV422 的排列方式有 YUYV、UYVY、YVYU、VYUY 四种常见形态,配错的表现很有辨识度:人脸发青或者发紫,皮肤色完全不对,但亮度和轮廓是正常的。因为 Y 分量没错,只是色度分量被互换了。
我一般会先拍一张有纯色块和肤色参照的画面,配错时色偏很容易看出来。确认之后再看原理图,检查 sensor 输出端的数据线序和驱动里的枚举是否一致。有时候原理图上为了走线方便做了字节交换,硬件工程师觉得无所谓,软件这边就必须跟着改。这种情况如果不写进时序记录,下一个接手的人一定会重新踩一遍。
3.4 参数计算:像素时钟、行场时序、MIPI 速率
这部分是记录里最有技术含量的地方,也是最容易算错的地方。我按实际项目的算法走一遍。
假设目标是 1080p30,sensor 输出的 htotal 是 2200,vtotal 是 1125。那么:
- 实际帧率 = 像素时钟 ÷ (htotal × vtotal)
- 像素时钟 = 2200 × 1125 × 30 = 74,250,000 Hz,即 74.25MHz
- 行周期 = 2200 ÷ 74.25MHz ≈ 29.63μs
- 行有效时间 = 1920 ÷ 74.25MHz ≈ 25.86μs
- 水平消隐 = (2200 − 1920) ÷ 74.25MHz ≈ 3.77μs
- 场周期 = 1125 × 29.63μs ≈ 33.33ms
- 垂直消隐 = (1125 − 1080) × 29.63μs ≈ 1.33ms
这组数字的意义在于,它们能直接对应到波形上的量测值。用逻辑分析仪抓一帧,量出 HSYNC 周期是不是 29.63μs,量出有效像素段是不是 25.86μs,一比对就知道配置和实际是否吻合。
再看 MIPI 侧的速率计算。同样 1080p30,RAW10 输出,4 lane:
- 每秒像素数 = 2200 × 1125 × 30 = 74.25M
- 每像素 10bit,总有效数据率 = 742.5Mbps
- 平均到 4 lane = 185.6Mbps/lane
实际配置时不能贴着这个值配,因为包头、包尾、低速切换都有开销,加上时钟容差,一般要留 15% 到 20% 的余量,所以单 lane 速率配到 220Mbps 到 240Mbps 比较稳。如果 lane 数减到 2,单 lane 就得翻倍,这时候要确认 sensor 和主控的物理层都能支持。
注意:算出来的速率是“有效载荷速率”,不是“物理层线路速率”。RAW10 是打包传输的,四个像素占 5 个字节,实际线路速率和有效载荷之间有固定的换算关系,别把两者混着写进记录。
4. 一次完整的时序记录实操
理论讲完,说流程。我整理过一条比较通用的操作路径,硬件和软件交替推进,每一步都有明确的产出物。
4.1 器材与软件准备
硬件侧需要一台带宽足够的示波器或逻辑分析仪。并行口相对好测,PCLK 在 74.25MHz 量级,逻辑分析仪采样率至少要到 500MSa/s 才能看清边沿,低于这个值量出来的时序只能看个大概。MIPI 侧就比较麻烦了,差分信号需要专用探头,一般团队没有条件,那就退一步,靠主控侧的误码统计和 proc 节点来间接判断。
软件侧要准备三样:能输出的驱动日志、能读寄存器的调试工具、能打印 VI 状态的 proc 节点。海思平台的 VI 通常在 proc 下有对应的状态节点,能打印出设备当前的分辨率、帧率、丢帧计数、中断统计。这三样东西配合起来,基本能还原出运行时状态。
我习惯在正式记录前先做一次“空跑”:上电、加载驱动、启动采集、什么都不改,把日志和状态完整存一份。这份基线数据后面所有对比都以它为参照,比记忆可靠得多。
4.2 抓取现场:从 proc 节点到寄存器快照
采集跑起来之后,我按固定顺序取四份数据。第一份是设备状态,包含当前分辨率、帧率、接口模式、lane 配置;第二份是中断与丢帧统计,连续取三次,看有没有增长;第三份是关键寄存器回读,重点是接口控制、时序参数、数据格式这几组;第四份是波形或者误码统计。
# 采集设备状态与统计信息,连续两次间隔 5 秒对比增量 cat /proc/umap/vi > vi_state_01.txt sleep 5 cat /proc/umap/vi > vi_state_02.txt # 关键寄存器回读,地址按具体平台手册确定 devmem 0x11450000 32 # 接口控制 devmem 0x11450010 32 # 时序参数 devmem 0x11450020 32 # 数据格式三次取数的间隔很重要。如果丢帧计数在增长,说明链路不稳定,这时候去调 ISP 毫无意义,得先解决时序。如果计数稳定,只是画面有瑕疵,那才轮到后处理环节。
寄存器回读时我一并记录读取的时刻和设备状态。有人喜欢在采集停止后回读,那时候很多寄存器已经复位,读出来的值跟运行时完全不同,这种数据放进记录里反而是干扰项。
4.3 记录模板落地
模板我用一张表,横向分四列:期望值、写入值、生效值、物理值。纵向按参数分组,先接口层再时序层。这样填的时候思路清楚,查的时候也一目了然。
| 参数项 | 期望值(手册/设计) | 写入值(驱动) | 生效值(回读) | 物理值(实测) |
|---|---|---|---|---|
| 接口模式 | BT.1120 | BT.1120 | BT.1120 | 16 位并口 |
| PCLK 频率 | 74.25MHz | 74.25MHz | — | 74.18MHz |
| HSYNC 极性 | 高有效 | 高有效 | 高有效 | 高有效 |
| 行有效像素 | 1920 | 1920 | 1920 | 1920 |
| htotal | 2200 | 2200 | 2200 | 2200 |
| vtotal | 1125 | 1125 | 1125 | 1125 |
| 数据排列 | UYVY | UYVY | UYVY | 待测 |
这张表填完,一条链路的时序就固化了。下次换板子,先填同样的表,再把两份表并排比,差异点就是风险点。这个用法在实际项目里救过我好几次,尤其是量产阶段换了不同批次的 sensor,默认消隐区有小改动,一比对立刻发现。
物理值那一列有时填不上,比如没有条件测 MIPI 的差分信号。这时候我会写“不可测,依赖误码统计”,把判断依据也写清楚,而不是留空。留空会让人误以为测过了没问题。
4.4 数据比对与偏差定位
四列数据填完,接下来就是找差异。差异分三类:期望与写入不一致,说明代码写错了;写入与生效不一致,说明配置没生效;生效与物理不一致,说明硬件没跟上。
第一类最常见的原因是驱动里参数被硬编码覆盖。有些方案在初始化流程里有一段兜底赋值,会把上层传下来的配置改掉,看代码时很容易漏掉。第二类是配置顺序问题,某些寄存器必须在设备停止状态下写,运行中写会被忽略。第三类通常是硬件问题,走线、焊接、供电、阻抗匹配,得往硬件那边推。
我印象比较深的一次,生效值和期望值都是 1920,但物理测出来有效像素只有 1912。差了 8 个像素,画面右边有一条 8 像素宽的绿边。查了半天发现是 sensor 输出端有个 crop 设置,起始位置偏了 8 个像素,驱动侧读的是完整宽度,所以数字对得上,实际数据少了一截。这个偏差只有把物理值测出来才能发现,光看寄存器永远对不上。
5. 常见故障与排查速查
这一节是我这些年攒下来的对照表,按现象归类,写清嫌疑点和验证手段。不敢说覆盖全部,但常见的那几类基本都在里面。
5.1 图像现象与时序嫌疑对照
| 现象 | 首要嫌疑 | 验证手段 |
|---|---|---|
| 整幅纯黑 | 无时钟或无同步信号 | 测 PCLK、HSYNC、VSYNC 有无 |
| 整幅纯绿或纯色 | 数据线全低或全高 | 测数据线电平 |
| 图像左右平移 | HSYNC 极性或起始位置 | 改极性,测有效段起点 |
| 图像上下滚动 | VSYNC 极性或场同步宽度 | 改极性,测场周期 |
| 右侧绿边或黑边 | 行有效像素偏大 | 比对实际有效段长度 |
| 底部绿边或黑边 | 有效行数偏大 | 比对实际有效行数 |
| 顶部规律噪点 | 采样窗口偏前 | 调相位或加大 settle |
| 全屏随机噪点 | PCLK 相位或信号完整性 | 调相位,看走线与阻抗 |
| 人脸发青发紫 | 色度分量排列错误 | 改数据序列枚举 |
| 画面撕裂错位 | 帧同步丢失或缓冲异常 | 看丢帧计数与中断 |
| 高分辨率下花屏 | 带宽或速率不足 | 核算 lane 速率余量 |
这张表的作用是缩小范围,不是直接给答案。同一个现象可能对应好几个原因,我只按出现频率排序,从最可能的开始试。试的时候一次只改一项,改完立刻验证,这是铁律。
5.2 排查顺序:从物理到逻辑
我的顺序永远是先物理后逻辑。先确认线接对了、电平对了、时钟有了,再看配置对不对,最后才看算法。反过来做,等于在不确定的地基上盖楼。
第一步,断电测通断。数据线、时钟线、同步线逐根量,看有没有虚焊、短路、接反。这一步花十分钟,能排除相当一部分问题。第二步,上电测静态电平。同步信号在无输出时的默认电平能反映极性配置,这个信息在抓波形前就能拿到。第三步,采集状态下测动态波形,量周期、量宽度、量有效段。第四步,比对配置与实测。第五步,才去看驱动日志和状态统计。
有一次我为了省事跳过第一步,直接看波形,发现 HSYNC 完全没有,排查了两个小时驱动,最后发现是转接板上那根线虚焊。从那以后我再没跳过通断测试。
注意:测通断一定要断开电源并给电容放电后再测,带电量测通断不仅读数不准,还可能损坏万用表或板上的敏感器件。
5.3 踩过的坑与避坑技巧
第一个坑是“改了没生效还以为生效了”。有些平台的 VI 配置在设备启动后再改是不起作用的,必须停止再启动。我吃过一次亏,改了极性,看代码也是新值,图像就是不变,折腾半天才发现要重新初始化设备。后来养成习惯,每次改配置都完整走一遍停止、配置、启动的流程,再验证。
第二个坑是“用错了消隐区”。同一颗 sensor 在不同分辨率下,消隐区默认值可能不一样,特别是切换工作模式之后。我习惯在每次切换模式后重新读一遍 sensor 侧的时序寄存器,把值记下来,而不是沿用上一次的记录。
第三个坑是“忽略温度影响”。有些 sensor 在低温或高温下时序会轻微漂移,常温调好的参数到了高低温环境出现偶发噪点。这类问题在实验室很难复现,必须在环境测试阶段重点关注。我的做法是在时序记录里加一栏工作温度范围,标注参数是在什么温度下测的。
第四个坑是“拿别的项目的参数直接用”。MIPI 的 settle 时间跟板级走线强相关,不同板子直接套用,出问题的概率很高。正确做法是把别人的值当起点,然后在自己板子上做小步调整验证。
第五个坑是“只记录成功状态,不记录失败状态”。其实失败记录更有价值,因为失败的那组参数直接告诉你边界在哪。我现在的记录里专门有一节叫“已验证不可用组合”,写清楚哪些值试过不行、现象是什么。这部分内容在接手别人项目时特别有用,能避免重复踩坑。
最后分享一个我在实际项目里的体会:时序记录这件事,做一次花不了多少时间,但它带来的最大收益不是解决眼前的问题,而是让“这套参数为什么这么配”从口头传承变成书面事实。团队里人来人往,口头的东西留不住,写在表里的东西能留住。我现在拿到任何一块新板子,第一件事就是建这张表,边调边填,填完这一版,下一版就有了参照。参数调整的过程本身也是理解硬件的过程,很多时候调着调着,对信号完整性的直觉就建立起来了,这种直觉比任何一份文档都值钱。