第3章 触发条件:边沿触发、电平触发、码型触发
触发条件,说白了就是告诉分析仪“什么时候该干活”。你设好触发,它就一直盯着信号,直到条件满足才把数据抓下来。不然你想想看,数据流上百万个比特,你要手动翻到哪一年去?
我个人习惯把触发条件分成三类:边沿、电平、码型。这三个东西搞清楚了,百分之八十的调试场景你都能应付。我先一个个说。
3.1 边沿触发
边沿触发是最基础、也最常用的一种。它只关注信号从低到高(上升沿)或从高到低(下降沿)的那一瞬间。我们在协议分析仪里通常可以选:
- 上升沿触发 —— 信号从0变1时触发
- 下降沿触发 —— 信号从1变0时触发
- 双沿触发 —— 任意跳变都触发
什么时候用边沿?比如你想看时钟的第一个周期,或者信号刚开始的一瞬间。我记得有一次调SPI接口,主机时钟老是不对,我就设了一个下降沿触发,抓到的波形清楚地显示时钟相位反了。嗯,就是那种让你拍大腿的错误。
3.2 电平触发
电平触发不是看跳变,而是看信号维持在高或低多长时间。比如你想在总线空闲(长时间高电平)后开始捕获,或者想抓一个窄脉冲的异常。
常见的电平触发参数:
| 触发类型 | 条件 | 典型应用场景 |
|---|---|---|
| 高电平触发 | 信号>阈值 且 持续≥时间 | 检测复位信号释放 |
| 低电平触发 | 信号<阈值 且 持续≥时间 | 捕获总线争用引起的低电平毛刺 |
| 脉冲宽度触发 | 高/低电平持续时间在规定范围内 | 查找异常窄脉冲或超时 |
电平触发有个坑:如果你设的时间太短,和边沿触发就没区别了;设太长呢,又可能错过真正的事件。我曾经调一个I²C总线,用上升沿触发老是抓到一堆无效帧,后来换成“低电平持续时间≥50μs”才准确抓到Start条件后的第一个数据——因为总线在Start条件后会有低电平保持。
3.3 码型触发
码型触发就高级一点了。它不是看单根线的电平,而是看一组信号线的组合状态。说白了,你先定义一个“模式”,比如“地址=0xA5 且 数据=0x3C”,当总线上出现这个组合时,触发捕获。
我在项目中用得最多的是这几种场景:
- 特定数据帧头 —— 比如UART的0x55同步头,检测到就抓后面的包
- 地址匹配 —— 只抓指定从设备地址的I²C或SPI事务
- 位序列匹配 —— 比如连续三个0或连续五个1
// 伪代码 —— 码型触发配置示例
trigger.on(pattern={
channel: "SDA",
mask: 0xFF,
value: 0xA5,
next: {
channel: "SCL",
mask: 0xFF,
value: 0x3C
}
});
码型触发的难点在于时序窗口。你想想看,两路信号可能不是同时出现的,你得定义“在多少时钟周期内匹配第二个码型”。我之前调一个MIPI DSI接口,同事设的码型触发一直不生效,查了半天发现第二个码型窗口设得太窄,实际信号有几百纳秒偏移。把窗口从1个UI改成3个UI,立马就抓到了。
3.4 三种触发方式的对比与选择
| 特性 | 边沿触发 | 电平触发 | 码型触发 |
|---|---|---|---|
| 触发基础 | 信号跳变 | 电平状态+时间 | 多通道组合逻辑 |
| 抗噪能力 | 较弱 | 中等(可设时间漏斗) | 强(逻辑判否决) |
| 配置复杂度 | 简单 | 中等 | 高 |
| 适用协议 | 时钟、单线协议 | 总线空闲检测、毛刺捕获 | 多线协议、地址过滤 |
| 实战频率 | ★★★★★ | ★★★☆☆ | ★★★★☆ |
怎么选?我的经验是:
- 开始调试时先用边沿触发,把整个通信过程看一遍
- 发现异常信号的位置后,改用电平触发缩小范围
- 最后用码型触发锁定你关心的特定数据包
举个实际例子:调USB逻辑分析仪时,我第一步总是设D+的下降沿触发,抓一个SOF包看看整体帧结构;然后设一帧内的高电平持续超过3ms的时间触发,定位挂起的设备;最后设同步序列(SYNC)+ PID的码型,只抓批量传输。
这张图把选择逻辑串起来了:信号进来,你先判断想抓“跳变”还是“状态”,再决定走哪条路。实际调试时,我通常从第一条路开始,不行就换第二条,最后才用第三条——因为码型触发配置起来最花时间,但也是抓最准的。