|
在开发声音的输入输出的程序时,我遇到过很多次左右声道反转的问题。就是说原本的左声道变成了右声道,右声道变成了左声道。下面是我的根据经验的解决办法。
DSP 和ADC或DAC之间的通信通常采取IIS模式。帧同步信号和时钟信号都由外部提供。先以字长为32bit的IIS mode为例,如果左右声道的数据都为32bit的长整型数,则一帧的长度是64bit,也就是说一帧有64个时钟周期。前32个时钟周期时,帧同步信号 为低电平,后32个时钟周期为高电平。
McBSP在时钟的上升缘或者下降缘检测帧同步信号和数据信号(具体是上升缘还是下降缘通过设置 PCR寄存器的CLKXP和CLKRP来决定)。由于当帧同步信号为低电平的时候象征着一帧的开始,因此PCR中的FSXP和FSRP需要设置为 ACTIVE LOW。在时钟缘时,McBSP若检测到帧同步信号为低电平,就知道是一帧开始了。在此后的时钟缘若McBSP检测到帧同步信号为高电平,则开始准备检测 下一个帧同步信号。 我用DMA从McBSP获取数据,正常情况下获取的数据的顺序是LRLRLR….,左右声道反转,意味着接收到的信号变 成了RLRLRL….。为什么会这样呢,我猜测在McBSP启动的时候如果检测到帧同步信号为低电平则立即开始进行数据传输。因此若McBSP启动时帧同 步信号恰好为低电平,则它不一定能够接收到完整的一帧数据,这样就造成了左右声道反转。我解决办法就是先将McBSP设置为GPIO模式,读取帧同步信 号,当帧同步信号变为高电平的时候,启动McBSP传输。这样在帧同步信号为高电平时McBSP被启动,它就能够接收到下一帧完整的数据了。
|