ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

TTL三态门、高阻态与总线冲突:并口总线设计实战

TTL三态门、高阻态与总线冲突:并口总线设计实战 做并口总线这些年见过最玄学的一类故障十有八九是两根线在打架。板子上电程序跑飞拿示波器一量某根数据线稳稳停在1.3V上下两边都不靠芯片摸上去还温温的。新手第一反应是信号被干扰了老手第一反应是总线冲突——两个输出端同时打开一个往上拉一个往下拽中间那几十欧的导通电阻把电源和地直接串起来电压自然卡在中间。能从根本上治这类病的器件就是TTL三态门也就是常说的TSLTri-State Logic。这篇文章我想把三态门从符号讲到板子包括它内部到底多做了什么、数据手册上哪几个参数真正决定成败、总线该怎么设计、高阻态在仪器上长什么样以及为什么那么多人搜TTL搜到的却是USB转TTL、485转TTL、TTL电平这些完全不同的东西。适合刚接触数字电路的初学者也适合调了几年板子但没系统梳理过总线时序的工程师。看完你至少能做到三件事看懂三态器件的真值表、算得出一组能用的上拉电阻、在板子发烫时知道先量哪里。1. 先把TTL这个词的三张面孔分清楚1.1 逻辑家族、电平标准、生存时间三件同名不同姓的事在硬件圈里TTL是个高频词但它至少背负着三层完全不同的含义混在一起聊就必然吵起来。第一层是逻辑器件家族指晶体管-晶体管逻辑Transistor-Transistor Logic对应的是一整套以74系列为代表的芯片比如7400、74LS00、74HC00它们的内部用双极型晶体管搭出门电路。这一层说的是用什么器件做的。第二层是电平标准指以地为低、以正电源为高的那套电压约定典型是0V/5V也有0V/3.3V的说法。所谓TTL电平串口USB转TTL模块485转TTL芯片说的全是这一层指的是信号的电压摆幅和极性跟逻辑门内部结构没关系。第三层则完全跑到了软件侧是Time To Live缓存和DNS里的生存时间你在接口返回里看到的{code:0,message:ok,ttl:1,data:}、Java里那个轻量缓存的ttl参数都属于这一层。它和电路一点关系都没有只是恰好缩写成同样三个字母。把这三层拆开之后再看标题TTL三态门TSL位置就很清楚了它属于第一层是逻辑器件家族里一个具体的功能分支。三态门的英文是Three-State Logic也写作Tri-State Logic缩写常见TSL或3-State。它的独特之处在于输出端除了高电平、低电平之外还多出第三种状态——高阻态通常记作Z或Hi-Z。这一点点多出来的状态直接撑起了整个共享总线架构。注意很多搜索热词里的TTL其实是第二层含义。如果你要解决的是串口通信问题看第5节如果你要解决的是总线冲突、设备复用那才是三态门的主场。1.2 三态门在嵌入式系统里的真实位置三态门不是一个只在教材里出现的概念它几乎无处不在只是多数时候被封装在更大的芯片里你看不到它的名字。最典型的是单片机和外设之间的并行总线一颗MCU的数据线D0到D7往往同时挂着Flash、SRAM、LCD控制器、并口扩展芯片它们共用同一组铜线。同一时刻只能有一个设备说话其余全部闭嘴。这个闭嘴的动作就是把自己的输出切到高阻态。再往上看芯片内部也大量使用三态结构。老一代的微控制器和FPGA内部总线就是三态总线各个功能模块通过使能信号竞争总线使用权。现代FPGA厂商很多已经不再推荐片内三态总线了因为工艺演进后片内三态的门控延迟和时序分析都比较麻烦改成了多路选择器MUX结构综合工具会把if-else或case自动综合成MUX。但你一旦走到芯片引脚上三态又回来了因为引脚是要往外接真实铜线的而真实铜线上一定存在多个潜在驱动者。还有一个特别贴近日常的场景双向IO口。你配置一个GPIO为输入模式时它的输出级实际上就被关掉了只留下一个高阻的输入缓冲器挂在外面。为什么能这么干因为如果输出级不关你的引脚被外部电路拉到低电平而你的输出级正使劲往上拉又是一次冲突。所以把引脚设为输入这件事的物理本质就是把输出驱动器切到高阻。理解了这一点你就明白为什么有些芯片手册会写输入模式下引脚呈高阻态请勿悬空。1.3 三态门带来的影响范围从单点开关到共享总线架构三态门最深远的影响不在于它多了一根使能线而在于它改变了系统的拓扑可能性。在没有三态器件的年代要让多个来源驱动同一根线只能靠机械开关、继电器或者二极管矩阵体积大、速度慢、寿命短。三态门把断开这件事电子化、纳秒化于是才有了N点共用一组线的架构。这个架构变化带来的连锁效应非常广。第一是引脚经济性8个设备各用8根数据线是64根共用一组8位总线加起来可能只需要十几根封装可以做小PCB可以少层。第二是带宽共享所有设备共享同一个物理信道仲裁逻辑决定谁用这让系统结构从星形变成总线形。第三是可扩展性加一个设备只需要挂在总线上并分配一个片选地址不用改主干布线。现代工业现场里这个思路被放大到了极端CAN总线、RS-485总线都是多节点共享一对差分线它们的收发器内部必然包含三态驱动器。RS-485的DE引脚就是这个三态开关的控制端DE拉低时驱动器进入高阻节点从总线上消失。一条485总线上挂32个甚至更多节点全靠这个高阻态。同理内存条上的DIMM总线、机箱内的并行背板、测试设备的多路复用开关本质上都是同一套逻辑。反过来这个架构也带来了新的风险面一旦互锁失效冲突就从不可能变成随时可能。单点驱动的系统不会有总线冲突共享总线系统如果使能逻辑写错一个极性、上电时序差几十纳秒、复位抖动一下就可能出现两个驱动器同时打开的窗口。这就是为什么共享总线设计里互锁、死区、上电默认态这三件事比信号速率更值得花时间。2. 三态门内部多出来的那两只管子到底管什么2.1 从普通TTL反相器的图腾柱输出讲起要理解三态得先理解两态。传统TTL门的输出级叫图腾柱输出Totem-Pole名字很形象上面一只晶体管负责往上拉下面一只负责往下拽中间串一只限流电阻或者一个二极管输出点就夹在两只管子中间。输入为低时上面的管子导通、下面的截止输出被拉到高电平输入为高时反过来下面的管子导通、上面的截止输出被拉到低电平。这个结构的好处是驱动能力强、不需要外接上拉高电平和低电平都能主动输出电流边沿也做得比较陡。但它有个致命限制输出端永远是被某一只管子抓住的要么高要么低不存在松手的状态。你把两个这样的输出接在一起只要一个想高一个想低上面那只管子和下面那只管子就会通过电源和地形成一条低阻通路。这条通路的电流有多大LS系列输出级的导通电阻加上限流电阻等效下来大概是几十欧到两百欧的量级。5V除以一百欧就是50mA已经超过多数器件24mA的持续灌电流能力了。这个电流会让芯片局部发热时间长了会损伤输出级同时把总线电压钳在1.2V到1.8V之间——这个电压既不能被识别为合法低电平也不能被识别为合法高电平读取结果随机。这就是冲突三个字的物理含义。顺便说一个容易忽视的点图腾柱输出在推挽驱动容性负载时上下管切换的瞬间会出现很大的尖峰电流因为电容两端的电压不能突变管子只能靠瞬时大电流去充放。这也是为什么多路输出同时翻转时芯片的电源引脚上会出现几十到几百毫安的瞬态电流去耦电容没配好就会看到明显的电源塌陷和振铃。2.2 使能级是怎么掐断上下管的三态门做的事情说到底就是在图腾柱输出级上面加了一套总闸。这套总闸通常由使能输入、若干只附加晶体管和电阻构成核心动作有两个把上面那只输出管的基极拉低让它彻底截止同时把下面那只输出管的基极拉低也让它彻底截止。两只管子同时截止输出点就两头不接只剩下两只管的关断漏电流往外流。漏电流有多大这是三态门最关键的指标之一。以常见的LS系列为例高阻态下输出漏电流的量级是微安级手册里通常写成IOZ正负几微安到二十微安比起导通时的几十毫安差了四五个数量级。正因为漏电流这么小理论上你可以在一条线上挂几十个三态输出而不互相拖累——当然实际限制来自输入漏电流和线路电容这个后面算。还有一个细节值得说不同厂商、不同系列实现高阻的手法不一样。有的是在相位分裂级phase splitter动手脚直接把这个中间级的输出钳到一个固定电平让上下两只输出管同时失去驱动有的是给输出管加抗饱和网络配合门控切换速度更快。反映到参数上就是关断时间和开启时间的不对称——几乎所有三态器件关断都比开启快一点因为关断只需要把基极电荷抽走开启还得先把管子推入导通区。实操心得正因为关断快、开启慢多驱动器切换时天然存在一小段全关的窗口。这通常是有利的避免了重叠导通但如果总线上下拉电阻太大这段窗口里总线会浮起来速度一快就采到错误值。所以切换速度、上拉强度、总线电容这三者必须一起算。2.3 高阻态在万用表和示波器上长什么样初学者最容易被高阻态骗的一次经历是拿万用表去量一个应该是高阻的输出脚。量出来的读数往往是1V到2V之间某个不确定的值而且手一碰探针读数就变。很多人据此判断芯片坏了或者电路有问题其实这恰恰是高阻态的正常表现输出端既不接电源也不接地只剩下一个几微安级别的漏电流源和引脚周围的空气、PCB表面的寄生路径它的电位由周围环境的泄漏和探头输入阻抗共同决定本质上就是没有定义。要区分真的高阻和弱上拉的高电平有个很实用的土办法在该引脚和地之间临时并一只10kΩ电阻再量一次。如果读数仍然稳稳地停在3V以上说明它确实被主动驱动或者被强上拉如果读数掉到接近0V说明原先那个电压只是浮起来的假电平输出确实处于高阻。这个动作很快比翻手册快。示波器上的判断更直观。把一个三态输出接到示波器通道设成正常触发你会看到使能期间信号是标准的0/5V方波边沿陡峭一旦使能撤销波形不会立刻跳到某个固定电平而是顺着容性负载缓慢漂移到某个中间值有时还带着工频干扰的纹波触发也稳不住。如果示波器探头上再并一只10k下拉波形会立刻被拉到低位附近——这就是高阻态在时域上的指纹。工程上还有两个观察点值得记住。第一高阻不等于断电器件仍在供电仍在消耗静态电流只是输出级不工作。第二高阻不等于隔离上下管虽然截止了但寄生二极管和封装内部的漏电通路仍在如果总线上出现超出电源范围很多的电压比如误接了12V仍可能通过寄生通路灌进去。真正要隔离得用继电器、光耦或者专门的模拟开关。2.4 常见三态器件真值表与型号对照74系列里带三态的型号非常多选型时最容易搞混的就是使能极性和是否需要外部方向控制。先看最基础的两个74LS125和74LS126都是四路单通道总线缓冲器区别只在使能极性。74LS125低电平使能的真值表使能 G输入 A输出 YLLLLHHHX任意Z高阻74LS126高电平使能的真值表使能 G输入 A输出 YHLLHHHLX任意Z高阻看清楚了吗两个芯片功能完全相同唯一差别就是G端有效电平反了一下。选错极性的后果很直接你以为拉低是关断结果拉低是打开总线上瞬间多了一个驱动器。我见过不止一块板子因为把125当成126用导致上电就烧驱动芯片。再往上就是实际项目里用得更频繁的几款型号功能通道数使能方式典型用途74LS244单向缓冲器8分2组两组低有效使能地址总线/控制线缓冲74LS245双向收发器8低有效使能 DIR方向数据总线双向桥接74LS373八D锁存器8锁存使能 低有效输出使能地址锁存、IO扩展74LS374八D触发器8时钟 低有效输出使能同步输出、端口扩展74LS541单向缓冲器8双低有效使能需要独立分组控制时74LS367单向缓冲器6两组使能小规模总线隔离这里要特别提醒245的使用它同时有使能和方向两个控制端。使能端高时A、B两侧全部高阻使能有效时由DIR决定数据从A传到B还是从B传到A。DIR翻转的瞬间如果使能还开着输出级会经历一个先关断再反向打开的过程中间那段窗口是高阻的通常没问题但如果总线上下拉很弱就会看到一个小的毛刺。稳妥的做法是先关使能、再改方向、再开使能多花几纳秒换来确定性。3. 数据手册里真正要盯的几个参数3.1 直流参数VOH/VOL、IOH/IOL、IIH/IIL与漏电流IOZ翻开任何一份三态器件手册直流参数表都长得差不多但真正会影响你设计的其实就那么几个。先看输出侧VOH是输出高电平的最小保证值LS系列在额定负载下通常是2.7V或2.4VVOL是输出低电平的最大保证值一般是0.4V或0.5V。这两个数字决定了你能驱动多少负载、能不能和后级芯片的电平门槛对接。IOH和IOL是输出电流能力普通LS门大约是高电平0.4mA、低电平8mA而总线缓冲器比如244/245能做到高电平15mA左右、低电平24mA。这个差异很关键普通门电路的高电平驱动能力其实很弱因为图腾柱的上管是射极跟随器结构输出高时会损失一个VBE的压降带载能力天生不如拉低方向。所以设计总线缓冲时优先选专门的缓冲器别拿普通门电路硬撑。输入侧要关注IIH和IIL也就是输入高电平和低电平时的输入电流。LS系列典型值是高电平20µA、低电平0.4mA。这个不对称是TTL输入结构的固有特性输入为低时电流是从输入端往外流出的因为输入级的下管导通所以低电平负载更重。算扇出的时候必须两个方向分别算取小值。最后一个也是最容易被忽略的IOZ高阻态输出漏电流。它告诉你关断得有多干净。LS系列典型值在正负20µA以内。这个参数直接决定了你一条总线上能挂多少个三态输出而不产生明显的漏电叠加。看起来20µA很小但八个器件叠起来就是160µA如果上拉电阻用了几十千欧这个漏电流就能把总线电压拉到门槛附近造成误判。3.2 使能/关断时序tPZL、tPZH、tPLZ、tPHZ数据手册的交流参数表里有四个名字很像的参数初学者经常看混我把它们的含义拆开说。tPZL使能有效后输出从高阻变成低电平所需的时间。tPZH使能有效后输出从高阻变成高电平所需的时间。这两个合称开启时间。tPLZ使能撤销后输出从低电平变成高阻所需的时间。tPHZ使能撤销后输出从高电平变成高阻所需的时间。这两个合称关断时间。中括号里的Z就是高阻。注意LZ和HZ的区别在于从哪个状态出发而P是propagation的意思。测量这几个参数比测普通传播延迟麻烦因为高阻态没有稳定的电平参考点测试电路通常要接一个特定的负载电阻来定义什么时候算变成高阻——一般是输出电压越过某个阈值时判定。这也是为什么不同厂商给出的数值会有差异你得看测试条件。LS系列这几个参数的典型量级在十几纳秒到三十几纳秒之间具体数值请以你手上那份手册为准。这带来两个工程结论第一总线切换需要预留足够的死区不能让两个驱动器的使能刚好首尾相接第二如果你的总线周期本身只有几十纳秒三态切换的开销就占了相当比例这时候要么提高时钟周期要么改架构。注意开启时间通常比关断时间更长。设计互锁逻辑时要按最慢的关断和最慢的开启分别留裕量而不是取平均值。更保守的做法是保证在任何情况下都有一段所有驱动器都关断的窗口。3.3 一组能直接抄的总线参数算例理论说再多不如算一遍。假设我要做一条5V的8位数据总线上面挂1个三态驱动器和8个LS系列的负载输入总线上还要加一只上拉电阻确保在所有驱动器都关断时总线不会浮起来。上拉电阻该取多少先算上限驱动器关断时上拉电阻要能把总线拉到LS输入的高电平门槛VIH2.0V以上而抵抗它的是所有输入端的IIH和所有高阻输出的IOZ。取保守值8个输入端每个20µA共160µA加上若干高阻输出按8个每个20µA算再160µA合计约320µA。于是有R_max (VCC - VIH) / I_total (5 - 2.0) / 320µA 9.4kΩ也就是说上拉电阻不能超过9.4kΩ否则拉不到2.0V。再算下限驱动器拉低时它要同时吸收负载的IIL和上拉电阻的电流。LS输入的IIL是0.4mA8个就是3.2mA驱动器IOL取8mA允许的VOL上限0.4V。于是上拉电阻上能流过的电流最多是8 - 3.2 4.8mAR_min (VCC - VOL) / I_pull (5 - 0.4) / 4.8mA ≈ 958Ω所以合理区间是约1kΩ到9.4kΩ取中间偏大一点选2.2kΩ或4.7kΩ都行。4.7kΩ更省电2.2kΩ边沿更陡。但这还没完还得算边沿时间。上拉电阻和总线电容构成一个RC充电回路总线电容包括PCB走线、器件引脚和输入电容一条10cm的线加上8个负载估个100pF到150pF不算夸张。上升时间近似为t_r ≈ 2.2 × R × C取R4.7kΩ、C120pF得到t_r ≈ 1.24µs。这个速度对1MHz以下的慢速总线够用但如果你的总线跑到5MHz以上这个边沿就太慢了必须换更小的上拉电阻或者干脆用带总线保持功能的器件比如ABT、LVT系列中的某些型号靠内部弱锁存维持电平不用外部电阻。这个算例的价值不在于数字本身而在于它把随便挂个10k上拉这种习惯性做法变成了有依据的选择。上拉太大边沿慢、噪声容限低上拉太小功耗高、驱动器负担重。中间这个区间就是设计自由度。3.4 扇出、容性负载与传输线效应教科书上的扇出概念是直流扇出一个输出能带多少个同类输入。LS系列的经典答案是20个算法是低电平方向8mA÷0.4mA20高电平方向0.4mA÷20µA20两边刚好相等。但实际项目里真正限制你的是交流扇出。原因很简单直流扇出只看稳定后的电流而交流扇出要看翻转瞬间的电荷。每个输入引脚都有几皮法的输入电容八个输入加起来就是几十皮法再加上走线电容。驱动器要在有限的上升时间里把这些电容全部充到门槛以上靠的是它的峰值输出电流。电容一大、边沿就慢边沿一慢后级就在门槛附近多停留一会儿噪声容限直接被吃掉。再进一步就是传输线效应。当总线长度和信号上升时间的空间跨度可比时经验判据是线长超过上升时间对应电长度的六分之一走线上就会出现明显的反射。三态门驱动的总线在快速开关时源端阻抗很低、末端是高阻容性负载属于典型的阻抗不匹配波形上会看到上冲、下冲和台阶。常见的缓解手段有三个在驱动器输出端串一只22Ω到33Ω的小电阻做源端匹配把总线走线尽量做短并保证有完整的参考平面降低边沿速率某些系列带斜率控制。这三招里串阻是最便宜也最有效的代价是牺牲一点点上升沿速度。4. 把三态门落到板子上的完整实操流程4.1 选型单向缓冲、双向收发还是锁存选型的第一步是问自己一个问题**数据的流向是固定的还是可变的**固定单向用244或541这类单向缓冲器就够了成本低、控制简单。方向可变比如MCU和外设互为读写方就得上245这样的双向收发器多一根DIR线但换来灵活性。第二步问**数据需不需要保持**如果总线上有多个设备分时使用而某个设备的输出在它失权之后还需要维持一段时间比如地址总线在数据周期内要保持有效那就不能只用纯缓冲器得用带锁存的373或者带触发器的374。它们的输出使能同样可以拉到高阻但内部先把数据锁住即使输入端变了输出端仍然是旧值。这个锁存三态的组合是老式微处理器系统里地址锁存的标准做法。第三步才是看电平和速度。5V系统内部LS系列便宜好用需要和3.3V器件对接优先考虑HCT系列它的输入门槛是CMOS的VIH约2.0V但输出摆幅接近轨到轨正好做5V到3.3V的下行转换。更高速的场合看LVC、ALVC、LVT这些系列它们支持更低的电源电压和更快的边沿很多还带5V容忍输入和总线保持功能。实操心得选型时我习惯先把使能极性这一列圈出来再看其他参数。因为极性搞反是成本最低但最难查的错误之一而且往往在板子回来之后才暴露。养成在原理图上给每个使能网络标注有效电平的习惯能省掉很多返工。4.2 使能信号的互锁与死区设计三态总线设计里最核心的一条纪律是任何时刻最多只能有一个驱动器处于使能状态。这条纪律靠人脑记忆是靠不住的必须落到逻辑上。做法通常有两层。第一层是地址译码的天然互斥。用译码器比如138产生片选信号理论上一次只有一个输出有效前提是译码器输入不会出现非法组合。如果译码器的输入来自多路复用或者可能变化的总线就得考虑输入变化瞬间产生短暂多选的可能必要时用带使能的译码器或者加一级寄存器把译码输入锁住。第二层是显式的死区控制。当使能信号来自软件或者状态机时切换动作之间必须插入关断窗口。用一段简单的逻辑就能表达这个思路/* 总线使用权切换的三步走核心是先关后开 */ void bus_switch_to(int new_owner) { bus_oe_a 0; /* 先关掉当前驱动器 */ bus_oe_b 0; /* 确保所有驱动器都关断 */ delay_ns(50); /* 死区覆盖最慢的关断时间并留裕量 */ switch (new_owner) { case OWNER_A: bus_oe_a 1; break; case OWNER_B: bus_oe_b 1; break; default: break; /* 无人使用总线保持高阻 */ } }这段代码看着简单但有两个细节值得抠。一是死区时长的确定不能拍脑袋写50ns应该取所有器件里最慢的tPHZ或tPLZ再乘一个1.5到2的安全系数。二是关断动作要包含所有驱动器而不是只关当前这个。因为如果之前的代码有bug漏关了一个只关当前这个并不能恢复正确性反而会把问题掩盖到下一次。更严格的做法是用硬件互锁把各个驱动器的使能信号两两做逻辑与的约束比如用74系列的逻辑门搭一个任意一个有效时其余全被封锁的电路。虽然多几颗小芯片但在安全相关的场合这个代价是值得的因为软件跑飞时硬件互锁仍然有效。4.3 上电、复位与热插拔瞬间的状态处理有一个阶段特别容易被忽略上电和复位期间。这时候控制器还没开始跑代码GPIO处于默认状态通常是高阻输入。如果使能信号直接接到这种GPIO上那上电后到程序初始化之间使能信号就是悬空的。TTL输入悬空在多数情况下会被内部结构拉高LS系列输入级有弱上拉效果对低有效的使能来说就是关断运气好没事但对高有效的使能来说就是打开总线瞬间多一个驱动器。稳妥的做法是给每个使能网络加一只下拉电阻低有效使能或上拉电阻高有效使能阻值取4.7kΩ到10kΩ确保在控制器未接管之前总线处于全部关断的安全态。这只电阻的代价极小但能消掉一整类上电异常。热插拔的场景更严苛。当一块子板带着三态驱动器插到已经上电的总线上时插入瞬间的电源斜率和地弹都可能让使能信号短暂误动作。这时候要考虑子板的使能端在自身电源建立之前必须保持关断可以用RC延时或者专门的复位芯片来实现连接器上应该把地和电源针做得比信号针长先接地通电、后接信号必要时在接口上加串联限流电阻或者总线开关比如模拟开关芯片把带电插拔的冲击限制住。4.4 未用通道、悬空输入与去耦多通道的三态器件通常有富余通道比如244有8路但你可能只用了5路。剩下的三路怎么办正确做法是把未用通道的输入端接到固定电平地或者电源输出端悬空不管。输入端接固定电平是为了避免输入级在门槛附近徘徊造成内部振荡和额外的电源电流。这点对CMOS器件尤其重要CMOS输入悬空时上下管可能同时半导通静态电流会明显增大。TTL输入虽然天生倾向于被拉高但噪声环境下仍不保险还是接死最省心。同样重要的还有使能端不能悬空。原因跟上面一样但那根线往往走得很长、连到控制器中间容易被干扰。如果确实需要它悬空时保持某个状态就用电阻拉死。去耦电容是另一个每次都被提起、每次都被偷懒的点。多路输出同时翻转时的瞬态电流是叠加的8路一起从高翻到低瞬时灌入地线的电流可能上百毫安。如果芯片电源引脚附近没有就近的0.1µF陶瓷电容电源上会出现明显的塌陷和振铃严重时会让芯片内部逻辑误判。我的习惯是每颗芯片一只0.1µF贴得越近越好过孔越短越好系统级再补一两颗10µF的钽电容或陶瓷电容做低频储能。4.5 实测记录使能沿与关断沿的波形分析最后分享一段我最近在调一块并行接口板时的实测记录用来说明看波形和看手册的差距。测试对象是一颗244输入是1MHz方波使能信号用另一路信号源给示波器四通道同时抓输入、使能、输出和总线。把使能沿放慢到20ns/格观察几个现象很清楚。第一输出从高阻态切到高电平时波形不是一步到位的而是先快速冲到3V左右然后有一个小的台阶再爬到4.5V以上。原因就是上升沿本身由两部分组成一部分是驱动器上管把输出顶起来另一部分是总线电容通过外部上拉慢慢补。第二关断时输出不是立刻变成一条直线而是先掉到一个中间值然后慢慢漂移漂移的方向由周围漏电流和探头负载决定用10k下拉一挂就掉到底。第三使能信号和输出之间有一段明显的延迟跟手册上的tPZH对得上。这次测试还发现了一个手册上不会写的问题使能信号和输入信号的走线在板上有一段平行距离过长使能翻转时在输入线上耦合出一个几十毫伏的尖峰。虽然不足以造成误动作但如果输入信号本来就是慢边沿的信号这个尖峰就可能在门槛附近被放大。解决办法是把两根线拉开距离或者在使能线上串一只小电阻减慢它的边沿。这种靠实测发现、靠布局解决的问题是纯看手册永远遇不到的。5. 三态门和TTL电平串口是两回事5.1 TTL电平串口说的只是电平不是逻辑门搜索热词里usb转ttl485转ttlttl电平这些指向的是一个完全不同的技术领域串口通信的电平标准。串口本身是UART协议定义的是时序和帧格式而TTL电平描述的是这些信号用什么电压表示0和1。TTL电平串口的规则很简单空闲时线上是高电平起始位是低电平0V到0.4V算逻辑02.4V到5V算逻辑13.3V系统对应地调整。这跟三态门有什么关系关系在于电平标准和逻辑器件是两件可以独立讨论的事。你用不用三态器件跟信号是不是TTL电平无关。一块只用UART和很少几个外设的板子可能一颗三态器件都不需要但它上面跑的仍然是标准的TTL电平串口。反过来一条三态并口总线上传的信号也完全可以是TTL电平的。混为一谈的后果是想解决串口不通的问题却在研究图腾柱输出结构想解决总线冲突的问题却在检查波特率。真要做一个区分可以这样理解TTL电平是电压约定三态门是器件功能。前者回答0和1长什么样后者回答这根线谁在说话、什么时候闭嘴。两个问题都重要但不是同一个问题。5.2 485收发器三态思想最成功的落地案例如果只能挑一个例子说明三态门的产业价值我会选RS-485收发器。以MAX485、SP3485这类芯片为例内部结构可以分成三块一个差分驱动器、一个差分接收器、一套控制逻辑。驱动器有一个**DEDriver Enable引脚接收器有一个REReceiver Enable**引脚通常这两个引脚是互补控制的——发送时打开驱动器、关掉接收器接收时反过来。驱动器被DE关闭时A、B两根差分线就进入高阻。这一点是整个485总线能挂32个甚至128个节点的物理基础一条总线上只有被允许发言的那个节点在驱动差分线其余全部高阻谁也不干扰谁。如果驱动器不是三态的两个节点同时说话就会直接把对方的差分对短路芯片很快就会过热损坏。这里有个特别容易踩的坑DE的切换时机。UART发完最后一个字节之后最后一个位的移出还需要时间如果软件一写完发送寄存器就立刻拉低DE最后一个位可能还没发出去就被掐断接收端收到的是截断的帧。正确做法是等发送完成标志TCTransmit Complete置位之后再关DE而不是等发送寄存器空TXE。这个区别在很多嵌入式新手写485代码时都会忽略表现为大部分数据正常、偶尔最后一字节出错极其难查。另外485总线在所有节点都关断的那个瞬间差分线上的电压是不确定的如果接收端的门限正好被噪声击中就会收到一个假的起始位。所以485总线上通常要加失效安全偏置fail-safe biasing用几只电阻在一对差分线上建立一个小的固定差分电压让空闲态被明确识别为逻辑1。这个思路跟三态并口总线上加下拉电阻是完全同源的。5.3 光耦、USB转TTL模块与输出使能的区别再聊两个经常被拿来和三态门比较的东西。先说光耦。以6N137这类高速光耦为例它有个使能引脚功能上看起来很像三态门的输出使能。但仔细看手册会发现一个关键差异6N137的使能端关断时输出不是高阻而是被强制到一个固定的高电平。这个设计是为了让多片光耦的输出能安全地接到同一个逻辑输入端而不产生浮空但它和三态门的松手是两回事。所以如果你的目的是让某个设备从总线上消失用光耦的使能端替代三态门是不行的因为它仍然在驱动那根线只是驱动的是固定电平。再说USB转TTL模块。这类模块的核心是一颗USB转串口桥片比如CH340、CP2102、FT232等它把USB协议翻译成UART时序输出的就是TTL电平的串口信号。模块上通常还有一颗电平指示LED和几个排针。它的输出引脚是标准的推挽输出不是三态输出桥片内部可能有输入模式下的高阻但那是引脚复用不是总线三态。所以如果你拿一个USB转TTL模块去接一条多设备共享的三态总线指望它能接上去但不干扰那是想错了。正确的做法是让模块只做监听把它的接收端接到总线上发送端不接同时总线本身的驱动器必须全部关断才有干净的波形可看。这一点在做总线协议分析时特别重要——很多人把分析仪的输入直接并到总线上如果分析仪输入阻抗不够高或者它的地线接法不当就会给总线增加额外负载看到的波形和真实情况不一样。5.4 找调试串口触点的方法论串口相关的搜索里有一大类是某个设备主板上的调试口触点在哪。这类问题的答案千差万别但方法论是通用的我把它整理成一套可复用的流程你拿到任何一块陌生主板都能照着走。第一步先找地。用万用表蜂鸣档黑表笔接在已知的金属屏蔽罩或者电源负极上红表笔逐个点候选触点能响的就是地。地是最容易确认的因为大面积铺铜的面几乎是地。第二步找电源。确认了地之后在触点附近找电压稳定在3.3V或5V的引脚那通常是供电。要小心的是有些板子的调试口只引出TX、RX、GND三根VCC并不引出所以不要指望一定有四针。第三步用示波器看开机波形。这一步是决定性的。把探头接到候选信号脚地夹接到刚才确认的地然后给板子上电。如果这个脚在开机后几百毫秒内出现一串密集的、幅度在0到3.3V之间跳变的波形那基本可以确认是调试输出俗称TX。串口的空闲态是高电平所以你会看到一串高电平中的负脉冲序列。第四步确认波特率。常见的调试串口波特率是115200也有9600、57600、1500000等。快速判断的办法是用示波器量一个位宽115200对应约8.68µs9600对应约104µs。用示波器的光标一卡波特率就出来了比一个个试快得多。第五步接线要交叉。设备的TX接你的接收端设备的RX接你的发送端地必须共。这也是标题里共地这件事反复被强调的原因不共地的情况下两边的高电平参考点不同信号幅度可能完全跑偏看起来就像完全没反应。注意在做这类测量时务必先确认待测点的电压范围。如果误把调试探头接到高于3.3V的电路上可能直接打坏桥片。保险的做法是先用万用表确认直流电平在安全范围内再接示波器。6. 常见问题与排查技巧实录6.1 总线发烫、电流飙升冲突的定位流程总线冲突的典型症状有三个芯片局部发烫、电源电流比预期高出一截、总线电压卡在中间值。三个症状往往同时出现只要观察到两个就该按冲突去查。定位流程我一般这样走。先断开所有驱动器只留一个。方法是把除一个之外的使能信号全部强制拉死低有效的拉低高有效的接高。如果此时电流回到正常值、总线电压正常说明冲突确实来自多个驱动器同时在开。然后逐个恢复每恢复一个测一次电流哪一次电流跳上去问题就出在那个通道的使能逻辑上。接下来查极性。把嫌疑通道的使能网络从器件引脚一直追到控制器确认有效电平有没有搞反。特别要检查中间有没有反相器有没有上拉下拉改变了默认状态。这一步能解决八成问题。如果极性没问题就查时序。用示波器双通道同时抓两个使能信号看有没有重叠的有效窗口。注意示波器探头的延迟差异最好用同一型号的两根探头。如果看到几百皮秒的重叠那基本就是软件切换太快或者缺死区。最后一种比较隐蔽的情况是上电期间冲突。断电重上电用示波器抓上电过程看两个使能信号在电源建立过程中的变化。如果它们在某个时间段同时有效那就得加上电默认态处理。6.2 高阻态读数飘怎么判断是真故障高阻态读数不确定是正常现象麻烦的是怎么区分正常的高阻和驱动级真的坏了。判断方法可以分三层。第一层用10k电阻加载法。在测量点和地之间并一只10kΩ电阻。如果电压明显掉到低位说明该点处于高阻如果电压纹丝不动说明有强驱动或者强上拉在起作用。这个方法快、准我几乎每次都用。第二层做功能验证而不是静态测量。让系统正常跑起来在使能有效期间测量该通道输出是否是标准的0/5V方波边沿是否干净。如果使能期间输出正常关断期间浮空那这个通道就是好的。静态去测一个本来就应该浮空的引脚得不到有用信息。第三层对比法。如果同一颗芯片上有多个相同通道把嫌疑通道和已知正常的通道在相同条件下对比。驱动能力下降、边沿变缓、低电平偏高这些都可能是输出级退化的信号。芯片被冲突烧伤之后往往不是完全失效而是驱动能力偷偷下降这种半死不活的状态最难查对比法最有效。6.3 使能极性、门控电平和CMOS/TTL互连的坑踩过的坑里有两类特别典型值得单独说。第一类是极性错误在原型阶段被掩盖。很多开发板在焊接时用了错误的默认上拉导致使能信号在悬空时恰好是关断状态一切正常等到正式板子把上拉改成下拉或者控制器上电速度变了问题才暴露。防这个坑的唯一办法是在原理图上写明每个使能的默认态和有效电平并且做上电时序审查。第二类是跨电平域的互连。典型的组合是5V的TTL输出接3.3V的CMOS输入。TTL输出的高电平保证值是2.4V而3.3V CMOS的VIH通常按0.7×VCC算也就是2.31V看起来只差0.09V非常危险。实测中LS输出高电平往往能到3.4V左右所以大多数情况能用但这属于靠运气在跑。稳妥方案有两个用HCT系列做接口它的输入门槛是2.0V、输出摆幅接近轨到轨或者用专门的电平转换器件。反方向3.3V CMOS输出接5V TTL输入通常没问题因为3.3V输出高电平约3.2V远高于TTL的2.0V门槛但要注意某些3.3V器件的输出不是5V容忍的接上5V系统会被灌电流。还有一点容易被漏掉使能信号本身的电平标准。如果使能信号来自3.3V控制器而三态器件是5V的LS系列尽管2.0V的门槛能识别3.3V的高电平但在噪声环境里裕量并不宽。稳妥做法是用HCT系列或者给使能信号加一级电平转换别让唯一一个使能信号成为整个系统的可靠性短板。6.4 一张速查表把这些年遇到的典型症状和对应处理整理成一张表方便现场翻查症状表现最可能原因优先检查项处理方式总线电压卡在1.2~1.8V两个驱动器同时使能两个使能信号的重叠窗口加死区修互锁逻辑芯片局部发烫、电流偏高输出级冲突导通使能极性、上电默认态拉死默认态改互锁关断后读数在1~2V漂移高阻态浮空正常用10k下拉复测加下拉或总线保持无需修板上电瞬间偶尔死机使能未定义导致冲突使能网络是否有默认拉加4.7k~10k上下拉边沿变缓、时序余量变小上拉过大或容性负载重RC时间常数、走线长度减小上拉加源端串阻高速翻转时波形振铃阻抗不匹配走线长度与上升时间串22~33Ω缩短走线未用通道处发热输入悬空致内部半导通未用输入是否接固定电平接死到地或电源多设备总线偶发误读切换死区不足最慢器件的关断时间重新计算死区并留1.5~2倍裕量我个人在实际操作中的体会是三态门这东西故障率不高但故障表现极具迷惑性。它不像短路会冒烟、不像断路会完全没信号它给出的是一堆看起来还行但就是不对的现象电压似高非高、数据偶尔错一位、芯片温温的不烫也不凉。应对这类问题的核心思路是把总线当前归谁驱动这件事当成一个显式的状态来管理而不是靠默认行为去猜。最后再分享一个小技巧在调试并行总线的早期我习惯在总线的关键几根线上各焊一个测试点并且在测试点旁边预留一个可选的下拉焊盘。这个焊盘平时不焊一旦遇到总线浮空引起的怪问题焊一只10k上去就能立刻把问题区间缩小一半——是浮空引起的还是驱动引起的。这个小小的预留救过我很多次时间。
返回列表