过快,无法正常播放音乐"/>
IMX6Q输出音频过快,无法正常播放音乐
某方案采用MCU控制TEF6638芯片输出音频,SOC侧仅输出音频信号(I2S格式)。
根据硬件方案,SOC侧只需要提供提供I2S音频信号,同时只能通过SOC侧来提供时钟,所以在确认了I2S引脚配置之后,要先将音频时钟方向做修改
修改imx-tef6635.c中的imx_audmux_config函数
static int imx_audmux_config(int slave, int master)
{unsigned int ptcr, pdcr;slave = slave - 1;master = master - 1;/* SSI1 MASTERED BY PORT 3 ,mx6 sipply pcm clock。*/ptcr = MXC_AUDMUX_V2_PTCR_SYN;pdcr = MXC_AUDMUX_V2_PDCR_RXDSEL(master);mxc_audmux_v2_configure_port(slave, ptcr, pdcr);ptcr =MXC_AUDMUX_V2_PTCR_SYN |MXC_AUDMUX_V2_PTCR_TFSDIR | MXC_AUDMUX_V2_PTCR_TFSEL(slave) |MXC_AUDMUX_V2_PTCR_TCLKDIR |MXC_AUDMUX_V2_PTCR_TCSEL(slave);pdcr = MXC_AUDMUX_V2_PDCR_RXDSEL(slave);mxc_audmux_v2_configure_port(master, ptcr, pdcr);return 0;
}
ALSA 音乐播放过快问题
在开发阶段发现I2S可以输出信号,但是由于速率过快无法正常播放,达到20M左右。所以逐步检查配置。
1、 对比自己设备和其他设备的时钟设置,发现初始化的时候没有对应的时钟配置过程
2、 在tef6638_data结构中添加mx6_sabresd_tef6638_init函数
3、 修改imx-tef6638中的imx_tef6638_hw_params,添加正确的snd_soc_dai_set_sysclk
//设置该SSI的时钟频率
snd_soc_dai_set_tdm_slot //设置TDM,如果不做设置,LRCK信号没有
switch (channels) {case 2:snd_soc_dai_set_tdm_slot(cpu_dai, 0xfffffffc, 0xfffffffc, 2, 32);break;case 1:snd_soc_dai_set_tdm_slot(cpu_dai, 0xfffffffe, 0xfffffffe, 2, 32);break;default:return -EINVAL;}
//设置CPU侧I2S format
snd_soc_dai_set_fmt//设置DAI format
dai_format = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_IF |SND_SOC_DAIFMT_CBS_CFS;
ret = snd_soc_dai_set_fmt(cpu_dai, dai_format);
//设置I2S时钟及分频系数
//snd_soc_dai_set_clkdiv
//函数参数为:dai: DAI div_id: DAI specific clock divider ID div: new clock divisor.
snd_soc_dai_set_clkdiv(cpu_dai, IMX_SSI_TX_DIV_PM, 4);
//设置I2S时钟基准
//snd_soc_dai_set_sysclk
//由soc输出时钟,clk为SSP系统时钟,频率为clk
sample_rate=params_rate(params);
clk = sample_rate*64*4;
ret=snd_soc_dai_set_sysclk(cpu_dai,IMX_SSP_SYS_CLK,clk,SND_SOC_CLOCK_OUT);
完成设置后可以正常输出播放音频所需要的时钟信号。
更多推荐
IMX6Q输出音频过快,无法正常播放音乐
发布评论