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要这么设计——很多软件层面的妥协,其实都是硬件限制逼出来的。
可可精品资料库