【随笔记】山景芯片的异步时钟引起积累性误差问题
问题简介
有个项目,主控需要将多路音频通过 I2S 传给山景芯片,然后借助山景芯片 USB 接口通过 UAC 协议传送给 PC 或其他 ARM 平台。
设计之初,主控作为 I2S 主机,山景芯片作为 I2S 从机,同时也作为 USB Audio 设备,可接入到 PC 或者其他的 ARM 平台。
我实现之后,在通过长时间传输测试,发现 UAC 总是快过 I2S,这就会导致 UAC 无可用数据传输,影响 PC 所录音频的完整性。
问题解决
问题的根本原因是因为 UAC 和 I2S 的时钟源不是同源,是异步时钟,因此长时间传输会出现积累性误差,导致两者速度不匹配。
一、主控作为 I2S 从机,山景芯片作为 I2S 从机,同时也作为 USB Audio 设备
I2S 时钟由山景芯片提供,这一步可以降低误差率,但仍没有彻底解决。
二、在山景芯片内,根据 I2S 缓冲的数据量大小,动态微调 I2S 的时钟频率
实现思路,当 I2S 缓冲区数据量很少接近下限值时,调快 I2S 时钟频率,当 I2S 缓冲区量很多接近上限时,调慢 I2S 时钟频率。
需要注意的是,要在不同平台下多实测,PC 的微调频率较低,ARM Android 平台的微调频率幅度较高。
调整 I2S 时钟频率接口:Clock_AudioPllClockAdjust(PLL_CLK_2, 0, 2);
问题总结
解决的原理是通过微调 I2S 的时钟,从而控制 I2S 的传输速度,来适应 UAC 的传输速度,从而将两端数据流传输速度达到动态平衡。
这种异步时钟带来的积累性误差问题解决方法,可以根据项目实际情况,在其他芯片上应用,不局限于山景,也不局限 I2S 和 UAC。