2、CEC硬件基础:CEC总线物理层、CEC信号电平与时序、CEC硬件接口设计要点

各位工程师朋友,咱们今天聊聊CEC的硬件基础。说实话,很多做软件的朋友觉得CEC就是发几个命令,但我在项目里吃过不少硬件的亏——信号反射、电平不匹配、时序踩边,这些问题一旦出现,排查起来相当痛苦。所以这一章,咱们把物理层、电平时序、接口设计这几个硬骨头啃下来。

2.1 CEC总线物理层:一根线,一个世界

CEC总线物理上就是一根线。对,你没看错,整个HDMI链路里那么多信号,CEC就独占一根线。这根线叫CEC Line,它是个半双工的总线结构。

我习惯把CEC总线想象成一群人围坐一圈,手里都拿着一个话筒。谁想说话,先看看话筒是不是空闲的。空闲了,就拿起来说。说完了,放回去。这就是CEC的“单线多主”机制。

具体到电气特性:

  • 总线电压:标称3.3V逻辑电平,但实际允许范围是2.7V到3.6V
  • 上拉电阻:典型值27kΩ,接在HDMI源端设备内部
  • 总线电容:单设备不超过50pF,整条总线不超过700pF
  • 最大节点数:理论上15个,但实际超过10个就容易出问题

关键点:CEC是开漏输出结构。设备只能把总线拉低,不能主动拉高。拉高是靠上拉电阻完成的。这个特性决定了CEC的仲裁机制——谁先拉低,谁就赢得总线。

我在一个智能家居项目中遇到过一个问题:客厅的电视和回音壁通过CEC联动,但偶尔会死机。排查到最后发现,回音壁的CEC引脚内部上拉电阻和电视的27kΩ上拉并联,等效电阻只有13.5kΩ,导致总线驱动电流过大,信号畸变。嗯,这就是物理层设计没做好的典型。

2.2 CEC信号电平与时序:别踩边

CEC的时序要求其实挺严格的。说白了,它就是个低速串行协议,但正因为低速,很多人不重视时序,结果通信不稳定。

先看电平标准:

参数 最小值 典型值 最大值
输入低电平(VIL) -0.3V - 0.8V
输入高电平(VIH) 2.0V - 3.6V
输出低电平(VOL) - 0.4V 0.6V
输出高电平(VOH) 2.7V 3.3V 3.6V

你想想看,输入低电平最高0.8V,输出低电平最高0.6V。这意味着什么?意味着接收端有0.2V的噪声容限。在3.3V系统里,这个容限其实不算大。我曾经在一条长HDMI线缆上测到过1V的共模噪声,CEC直接罢工。

再看时序参数,这是重点:

  • 位周期:2.4ms ± 0.2ms(标称)
  • 起始条件:总线拉低至少3.6ms
  • 逻辑0:拉低1.5ms,释放0.9ms
  • 逻辑1:拉低0.6ms,释放1.8ms
  • 帧间隔:至少2.5ms

避坑指南:我曾经用软件模拟CEC时序,结果发现定时器精度不够,位周期偏差超过0.5ms。有些电视的CEC接收端比较严格,直接忽略我的命令。后来我改用硬件定时器,问题解决。所以,如果你用MCU模拟CEC,务必用硬件定时器,别用软件延时。

为什么会这样?因为CEC的时序容限其实很窄。位周期2.4ms,允许误差只有±0.2ms,也就是8.3%。对于软件循环延时来说,这个精度在中断频繁的系统里很难保证。

2.3 CEC硬件接口设计要点

好了,理论说完了,咱们聊聊实际设计。这部分我踩过的坑最多,分享出来希望大家少走弯路。

2.3.1 电平转换

CEC是3.3V逻辑,但很多MCU是5V或者1.8V的。电平转换是必须的。我推荐用分立MOS管搭建的电平转换电路,而不是专用芯片。为什么?成本低、灵活、而且CEC速度不高,完全够用。

// 典型CEC电平转换电路(双向)
// MCU侧(3.3V)          HDMI侧(3.3V)
// GPIO ----[10kΩ]----+---- CEC Line
//                     |
//                    [2N7002]
//                     |
//                    GND
// 
// 注意:这个电路是双向的,不需要方向控制

警告:不要直接用5V的GPIO直连CEC线!我见过有人这么干,结果把HDMI源端的CEC收发器烧了。CEC引脚通常没有5V耐压能力。

2.3.2 ESD保护

CEC线是暴露在外的,HDMI插拔时会产生静电。不加ESD保护,芯片很容易挂。我建议在CEC线上加一个双向TVS管,击穿电压选3.6V或5V的。

嗯,这里要注意:TVS管的结电容不能太大。CEC总线总电容限制是700pF,一个TVS管如果结电容50pF,15个设备就是750pF,直接超标。所以选型时优先选低结电容的型号,比如<1pF的。

2.3.3 上拉电阻的选择

标准是27kΩ,但这不是的。我做过一个实验:

上拉电阻 总线上升时间 最大总线长度 适用场景
10kΩ ~1.5μs ~5m 短距离、多设备
27kΩ ~4μs ~10m 标准场景
47kΩ ~7μs ~15m 长距离、少设备

我个人习惯用27kΩ作为起点,如果总线设备超过8个,我会换成10kΩ。但要注意,上拉电阻越小,驱动电流越大,功耗也越大。CEC是常开总线,功耗问题在电池供电设备里需要权衡。

2.3.4 布局布线建议

最后说几个布局布线的要点:

  • CEC线尽量短,不要超过30cm(板内走线)
  • 远离时钟信号和高速数据线(比如HDMI的TMDS线)
  • 如果必须跨分割,加一个0Ω电阻或磁珠
  • 每个设备的CEC引脚附近放一个100nF去耦电容

总结一下:CEC硬件设计其实不复杂,但细节决定成败。电平转换、ESD保护、上拉电阻、布局布线,这四个点做好了,CEC通信就稳了八成。剩下的两成,是软件的事,咱们后面章节再聊。

我记得有一次帮客户排查CEC问题,他们的产品在实验室测试一切正常,到了客户家里就间歇性失灵。最后发现是HDMI线太长(15米),而且和电源线绑在一起走线。CEC信号被电源线上的共模噪声干扰了。解决方案很简单:换一根屏蔽好的HDMI线,或者加一个CEC信号中继器。但如果你在设计阶段就考虑到这些,根本不会有这种问题。

好了,这一章的内容就到这里。硬件基础打牢了,后面讲软件协议栈的时候,你才能理解为什么CEC要这么设计——很多软件层面的妥协,其实都是硬件限制逼出来的。


可可精品资料库