第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的码型,只抓批量传输。

最后一个小诀窍:很多协议分析仪支持“多级触发”,就是先满足一个条件,再等第二个条件,类似软件里的if-else。这个功能太强了,后面章节我会细讲。
触发条件类型及选择逻辑 触发条件选择逻辑 信号输入 边沿触发 上升/下降/双沿 电平触发 高/低/脉冲宽度 码型触发 地址/数据/序列 适用:时钟、简单跳变 启动分析首选 适用:空闲检测、毛刺 配合时间窗口抗噪 适用:多线协议、地址过滤 精确捕获特定帧 触发捕获

这张图把选择逻辑串起来了:信号进来,你先判断想抓“跳变”还是“状态”,再决定走哪条路。实际调试时,我通常从第一条路开始,不行就换第二条,最后才用第三条——因为码型触发配置起来最花时间,但也是抓最准的。