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

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

没有标注的采集文件

在 TT Lab 中继续学习

一句话总结

没有标注名称的采集文件也会自我说明。凭通道数、空闲电平,以及线与线之间的关系,就能判断出是哪种总线。

为什么需要它

现场收到的文件通常没有名称。只写着 ch0、ch1,测量的人只说“这里不行”。问是哪种总线,得到的回答是“从传感器出来的线”。有时甚至没有人可以再问。那就只能去问文件本身。

本模块把前面的三种总线合在一起。分别了解每一种,与在不知道是什么的情况下把它判断出来,是两种不同的技能。而现场需要的是后者。

工作原理

判断从成本最低的线索开始。

通道数。一条线是异步串行(UART)。没有时钟,所以必须自己找出速度。两条线很可能是 I2C——如果一条是规律的时钟,另一条只在该时钟的低电平区间内变化,就几乎可以确定。四条线是 SPI。其中一条是整个传输期间保持低电平的选择线,另一条是只在其中运行的时钟。

空闲电平。什么事都没有时线路处于什么位置,能说明很多事情。UART 和 I2C 空闲时是高电平。所以遇到空闲时为低电平的单线采集,就怀疑极性被翻转了。可能是中间接入了会反相的电平转换器,或者把 RS-232 信号误当作 TTL 来测。这时如果原样读取,就找不到起始位,帧会被错误地截取,而把所有位翻转后再读,就会得到完好的句子。

线与线之间的关系。在两线采集中,如果一条线在另一条线的高电平区间内产生了变化,那就是 START 或 STOP。在四线采集中,如果一条线在另一条线的每个边沿上变化,那就是数据。如果有一条线在整个传输期间一次也没有变化,这同样是信息——说明从设备一次也没有驱动 MISO。可能是选择错了,可能是芯片没有接上,也可能是没有供电。只剩上拉的线,读出来永远是 0xFF。

给故障命名时,要同时写上证据。不要写“波特率不匹配”,而要写“最短脉冲是 112 µs,而标称位时间是 104.2 µs”。前一句话下一个人无法验证,后一句话可以验证。而无法验证的报告,时间一长就会变成传言。

채널 1 · 유휴 낮음        -> UART, 극성 반전 의심
채널 2 · STOP 없음        -> I2C, SDA 가 붙들려 버스가 잠김
채널 4 · MISO 모서리 0개  -> SPI, 대상이 응답하지 않음

挑选作为证据的数字时,最好同时放入数出来的值和测出来的值。数出来的值是整数,如 START 的个数、采样边沿的个数、多余位的个数。错了就是确定的错,所以没有争议。测出来的值是连续量,如上升时间、位时间、低电平区间的长度。它们会随阈值和采样率而略有不同,所以必须一并写下,下一个人才能得到相同的值。只写其中一个,报告就只有一半——只有个数,不知道还剩多少余量;只有时间,不知道什么事情发生了几次。

而且遵守从成本最低的线索开始的顺序,确实能节省时间。通道数和空闲电平只需读文件的前几行就能得到。到这里如果总线确定了,就只需按那种总线的规则去解码,如果没有确定,说明还不是使用解码器的时候。一上来就解码,然后反复说“结果很奇怪”,是这项工作中最常见的时间浪费。

最后还剩下写明做不到的事。本课程的采集文件全部是合成的波形。边沿是用一阶 RC 生成的,没有加入噪声、抖动或反射。因此,在这里判定为“正常”的东西,并不意味着在真实的板子上也正常。解码器是对的,与信号有余量,是两个不同的主张,后者必须把实物测量与数据手册中的 VIH、VIL 和时序值进行对照。如果不在报告里写明这条边界,读的人就会相信比所读内容更多的东西。

在现场相遇的样子

故障报告里经常只有“I2C 错误”这一行。仅凭这一行,没有人能决定下一步行动。是地址 NACK,还是总线被锁死,或者是上升缓慢,修复的人各不相同——第一种是固件,第二种是驱动的恢复流程,第三种是硬件。如果能从波形上区分这三种,报告中的一行就能点名一位负责人。

反过来,没有依据、只是起了个名字的报告也很危险。“是噪声造成的”这句话,几乎总是“我还不知道”的另一种说法。要说是噪声,就必须同时给出能看到噪声的区间及其大小。

下一项实验要做什么

解码四份 I2C 采集和三份 SPI 采集:正常的读取传输、无响应的地址、拉住时钟的从设备、上拉较弱的总线、模式 0 与模式 3、选择线延迟的传输。在最后一步,你会拿到三份没有名称的采集,判断出是哪种总线,并为故障附上名称和数字证据。