TT Lab
开始
学习 学习路径 课程

传感器没坏,是板子听不懂

文件里并没有比特

在 TT Lab 中继续学习

一句话总结

采集文件只是一串电压的列表。位并不在里面,而是在你确定阈值和时间轴的那一刻才产生。

为什么需要它

现场最常听到一句话:“传感器是好的,但板子认不出它。”说出这句话,说明双方已经分别测试过了。把传感器接到另一块板子上能读到,给板子换一个传感器也能读到,可是把这两者连起来就不行。剩下的就是二者之间的那根线,而线上发生的事情是算不出来的,必须去测。

测完之后留在手里的不是图像,而是一张数字表。无论是逻辑分析仪还是示波器,按下保存键后得到的,都是“第几个采样点上这根线是多少伏”的罗列。本课程处理的就是这张表:把表变成位,把位变成字节,把字节变成“哪里出了问题”这样的一句话。

这里初学者最常犯的错觉,是以为波形查看工具显示的 1010... 就在文件里。其实并不在。那是工具选定一个阈值、选定一个时间轴,由这两个选择生成出来的。选择错了,同一个文件就会得出不同的答案。而且工具并不会特意告诉你它选了什么。

工作原理

一个采样点是时间与电压的一对。时间通常不写在文件里,而是用头部的采样率和采样点序号计算出来。以 500 kHz 采集的文件,第 312 个采样点位于 312 ÷ 500,000 = 624 µs 处。读不到采样率,就没有时间轴,没有时间轴,就测不出波特率或时钟周期。

# labhub-capture v1
# sample_rate_hz=500000
# channels=rx
n,rx_v
310,3.30
311,3.29
312,2.36      <- 여기서 내려가기 시작한다
313,1.48      <- 1.65 V 로 보면 여기가 모서리
314,0.94

把电压变成位的是阈值。使用 1.65 V(供电电压的一半)时,第 313 个点是下降沿,使用 2.90 V 时,第 312 个点是下降沿。如果边沿无限陡峭,两者就会相同,但真实的线上有电容,电压是按指数变化的。所以阈值越高,下降被捕捉得越早,上升被捕捉得越晚。在本课程的正常 UART 采集中,两个阈值得到的上升沿相差 4 个采样点,即 8 µs。

这里有一个重要事实:接收端的芯片并不用一半电压来判定。数据手册中分别写有 VIH(确定读成 1 的最小电压)和 VIL(确定读成 0 的最大电压),两者之间是不受保证的区间。所以即使你的解码器说“数据完好”,真实的芯片也可能读不出来。只使用一个阈值的解码器,在结构上看不到这种差异。

与阈值成对的,是时间轴一侧的采样率。一个位里有几个采样点,决定了判读的余量。如果每个位只有一个采样点,起始沿的位置就只能精确到一个采样点,而这个误差会一直累积到帧的末尾。抽稀采样点后再读同一个文件,就能亲眼看到判读在哪个位置开始悄悄出错。“悄悄”这个词很重要。采样点不足的解码器不会报错,而是给出看似合理的另一个字符。

还有第三个选择:哪一列是哪根线。即使头部写着 channels=scl,sda,那也只是测量的人插探头的顺序而已。把两列读反,时钟就成了数据,数据就成了时钟。所以在相信名称之前,先看有没有一列在规律地起伏。时钟是规律的,数据则不然。

在现场相遇的样子

拿到采集文件后说“工具什么也读不出来”,然后又去重新测量的情况很多。大多数时候并不需要重测。要么是工具的阈值与该信号的幅度不匹配(对 3.3 V 信号使用了 5 V 基准),要么是工具采集的采样率相对于通信速率太低。直接打开文件,看前 100 行的最小和最大电压,就能排除一半的可能。

也有相反的事故。因为工具显示出整齐的 1010,就汇报“信号正常”,可实际的板子仍然读不出来。这是因为工具按一半电压判定,而芯片按 VIH 判定。这时需要的不是新的测量仪器,而是改变判定标准,把同一个文件再读一遍。如果改变标准后答案变了,这本身就是结论——说明信号没有余量。

第三种常见情况,是只用眼睛看文件就下判断。如果采样点有几千行,人能看到的只有前后几十行,而故障往往在中间。本课程一开始就要求编写程序,原因就在这里——必须能一次扫过全部数据,并且能一遍又一遍地重复同样的判定。靠手数出来的数字,下一个人是无法验证的。

下一项测验要确认什么

会问到如何从采样点序号求出时间、提高阈值时上升沿和下降沿各向哪一侧移动、每个位的采样点数减少时会以什么方式失败。之后在 UART 模块中,把这张表真正变成字节。