画板子的时候,I2S走线我一般都尽量短,主控和Codec挨着放,几厘米搞定,图个安稳。但有时候真没办法——结构限制,主控和音频芯片就是得分家,FPC排线一拉就是十几二十厘米。
前阵子帮一个客户看问题,他的板子就是这样。录出来的声音偶尔“咔”一下,不频繁,但很烦。示波器一戳BCLK,波形上有个明显的“台阶”。一般会问“是不是Codec坏了”,我说不是,是I2S走线太长了。
这篇文章就把我遇到过的I2S长线问题、排查方法和补救措施整理一下,希望对你有用。

一、长线会带来哪几个麻烦?
麻烦1:信号反射,波形上出现“台阶”
PCB上的走线阻抗通常设计在50-100Ω,但主控GPIO的输出内阻很低,也就十几欧。阻抗一不匹配,信号就会反射。长线反射更明显,BCLK上可能出现一个“台阶”——不高不低,接收端误以为多了一个时钟边沿,数据就错位了。
麻烦2:边沿变缓,数据来不及建立
走线的电容加上接收端的输入电容,会把方波的边沿拉长。接收端需要在时钟边沿之前数据就稳定好,边沿太缓可能导致数据还没准备好就被锁存,最高位出错,听感上就是“咔咔”杂音。
麻烦3:串扰和EMI
I2S三根线平行走很长距离,BCLK会干扰SDATA,数据错乱。长线还像天线,EMI测试大概率超标。
二、试过有用的几招
1. I2S线上串电阻(最常用)
在驱动端串一个电阻,让驱动内阻+串联电阻≈走线阻抗,反射就被压下去了。通常先用22-47Ω起步,长线可以加大到68Ω甚至100Ω。之前有一个项目走线25cm,47Ω还有过冲,换成82Ω波形干净很多。代价是边沿会缓一点,只要不违反建立时间就OK。
2. 加个缓冲器“重振”信号
如果主控驱动能力本来就弱,串联电阻后边沿太缓,可以在驱动端加一个单路缓冲门,比如74LVC1G07。驱动端先缓冲,再串联电阻走线。BOM成本允许的话,也可以用LVDS发送器转差分,抗干扰好很多。
3. 线束选型有讲究
长线尽量用双绞线或者屏蔽线。接收端对地可以并一个小电容(10-20pF),能滤掉一些高频毛刺,但不能太大,否则边沿更缓。

三、硬件改不动了,软件还能挣扎一下
有时候板子已经量产了,没法改硬件。可以试试这两招:
I2S长线问题,说大不大,说小不小。碰到过冲、台阶,先看串联电阻;边沿太缓,考虑加缓冲器;软件微调只能锦上添花,不能雪中送炭。
你在调试I2S的时候遇到过什么怪问题?欢迎留言。 |