MX6DL SSI1 声音异常

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

MX6DL SSI1 声音异常

27,786 Views
2570624484
Contributor II

IMX6DL SSI1 接口  配置 ,SND_SOC_DAIFMT_DSP_A | SND_SOC_DAIFMT_IB_NF |  SND_SOC_DAIFMT_CBS_CFS; 

与BT的PCM通信经常失真,变调或声音变模糊,如何确认SSI1 一侧无问题?期待你的回复。

Labels (1)
0 Kudos
21 Replies

27,349 Views
2570624484
Contributor II

BT 一侧已经外接到他们的DSP测试,100多次无异常,怀疑是SSI一侧有问题,异常的时候,读写SSI1 的PCM的节点,声音都有异常

0 Kudos

27,349 Views
weidong_sun
NXP TechSupport
NXP TechSupport

Hi,

  当您在I2S接口上使用BT PCM语音时,请把BT端的PCM配置为Master 模式,CPU端的I2S配置为Slave模式。即:让BT PCM提供Bitclock / LRCLK给到CPU端。

  语音模糊(如果不是线路噪声干扰)的原因,有可能是clock没有对准,或者说误差较大。

您试试看。

如果是线路噪声干扰,那么可以在I2S的线上对地接10pF左右的电容,可以改善许多。

When you use BT PCM voice on the I2S interface, configure the PCM on the BT side as Master mode and the I2S on the CPU side as Slave mode. That is to say, let BT PCM provide Bitclock / LRCLK to CPU.
The reason for speech blurring (if not for line noise interference) may be that clock is not aligned, or that the error is large.


Try it, please!

伟东

27,349 Views
2570624484
Contributor II

HI Wigros Sun,非常感谢你的回复。现在已经改为SOC作为从,BT 作为主,还是会出现概率性失真,声音变调。因为BT 产商将自己的模块飞线出去测试无法复现问题,认为是我方SOC导致。

您说到 ,如果是线路噪声干扰,那么可以在I2S的线上对地接10pF左右的电容,可以改善许多。请问这个是在数据线上加的电容?还是 SYNCClk BITCLK 和数据线上都要对地接10pF左右的电容?期待你的回复。

0 Kudos

27,349 Views
weidong_sun
NXP TechSupport
NXP TechSupport

Hello Luoliang,

    先用示波器测量一下 BLCK和LRCLK,看看波形是否正常,如果有干扰,那么这2根线对地加10pF电容。TXD和RXD也是相同的操作方法。

     即有干扰,就电容滤波。

First, measure the BLCK and LRCLK with an oscilloscope to see if the waveform is normal. If there is interference, then the two wires add 10pF capacitance to the ground. TXD and RXD are the same methods of operation.
If there is interference, capacitive filter is used.

Have a nice day!

BR,

Weidong

0 Kudos

27,349 Views
2570624484
Contributor II

ssi.png

附件farend.wav 为正常时的文件, farend(1).wav为异常时的文件

0 Kudos

27,349 Views
weidong_sun
NXP TechSupport
NXP TechSupport

Hello Liang,

   你的怀疑是有道理的,从波形看你遇到的问题不是干扰造成的。但是要这样考虑,对CPU来说,PCM的发送和接收,如果同时进行的话,那么你BT 端PCM给出来的时钟和同步信号,CPU端的收和发都使用这个时钟和同步信号。也就是收和发使用相同的时钟。pcm_write,即CPU的PCM发送出了问题,说明它和时钟好像不同步了。但是,pcm_read是对的,说明CPU PCM接收RXD和时钟是同步的。

   所以你要计算一下播放速率和接收速率是不是相同的。

伟东

0 Kudos

27,349 Views
2570624484
Contributor II

HI,Weidong,若果是IMX6 内部时钟无法和BT时钟同步了,我该如何分析内部时钟问题?还请给一些建议。再次感谢。。

0 Kudos

27,349 Views
weidong_sun
NXP TechSupport
NXP TechSupport

Hello Liang,

    你可以这样做一下测试: 对TXD和RXD分别做单向测试。BT端TXD关闭,不发数据给CPU。那么,CPU播放时,会从CPU PCM_TXD发出给BT_PCM_RXD,看此时是否正确。

伟东

0 Kudos

27,348 Views
2570624484
Contributor II

HI :伟东

我们做了一个这个样的测试,把SOC改为主,然后把SOC的TXD和RXD短接,让SOC的发送直接被SOC收到,也会大概率的遇到失真现象。我们的版本 Android7.1 内核 4.10 版本 硬件imx6QDL ,如下测试脚本,期待你的解答,非常感谢。

#!/system/bin/sh
echo "rm -rf record001.wav"
rm -rf /data/record001.wav
echo "tinycap record001.wav -D 2 -d 0 -r 8000 -c 1 -b 16 &"
tinycap /data/record001.wav -D 2 -d 0 -r 8000 -c 1 -b 16 &
sleep 0.001
echo "tinyplay  PCM_8KHZSIN.wav  -D 2  -d 0 &"
tinyplay  /data/PCM_8KHZSIN.wav  -D 2  -d 0 &
1567145751(1).png
附件为录音文件和播放文件
0 Kudos

27,348 Views
weidong_sun
NXP TechSupport
NXP TechSupport

这个波形和之前你提供的波形,好像不太一样:一个是CPU RX正常(录音),现在是RX异常(也是录音)。我这里无法复现你遇到的问题,你的板子上有没有codec,如果有codec试试播放和录音是不是也有问题。

伟东

0 Kudos

27,347 Views
2570624484
Contributor II

HI, 伟东您好。非常感谢你的回答。我周末调研了一下,看了你们以前kernel提的patch,我觉得我遇到的问题和你你们的版本之前的遇到问题应该是一样的,你之前有一个BUG,SDMA在处理双FIFO的时候有个BUG,会swap,这个和我的现象一样的,后来的Patch修改了这个问题,请确认这个问题。我觉得我的sdma的固件是老的,我下载了那个版本的最新的固件比较,发现更改正好是那个patch修改的地方。请帮忙确认。附件为我的sdma patch,请尽快帮忙确认,很急。谢谢了。还有几个疑问,1)SDMA的固件用的到底是哪一个,dts 描述用的是fsl,sdma-ram-script-name = "imx/sdma/sdma-imx6q.bin"; ,但发现你们提交记录却是sdma-imx6q.bin.ihex?2)如何升级SDMA的固件,如何保证固件是升级成功的?linux-imx.git - i.MX Linux Kernel 

0 Kudos

27,347 Views
weidong_sun
NXP TechSupport
NXP TechSupport

Hi Liang,

   SDMA 固件在/firmware/imx/sdma/路径下,这是linux内核souce路径,你只要把原来的文件覆盖掉,就是升级了。或者你按照patch直接打上去。

weidong@ubuntu:~/disk2/linux-imx-4.9.88/firmware/imx/sdma$ ls
sdma-imx6q.bin        sdma-imx6q.bin.gen.S  sdma-imx7d.bin        sdma-imx7d.bin.gen.S
sdma-imx6q.bin.gen.o  sdma-imx6q.bin.ihex   sdma-imx7d.bin.gen.o  sdma-imx7d.bin.ihex
weidong@ubuntu:~/disk2/linux-imx-4.9.88/firmware/imx/sdma$

伟东

0 Kudos

27,348 Views
2570624484
Contributor II

HI, 伟东您好。非常感谢你的回答。我想我找到规律了,附件为我上传的好的数据和有问题的数据,你要是以16进制打开,可以发现,错误的数据和正常的的数据就是四列交换了,我研究了一下imx6 的SSI fifo ,他是交换从两个FIFO 的 拿数据到TXSR ,如果第一次拿错了,后面是不是就每两列错误一次?。我们是单通道数据,而贵司的驱动代码默认都是给双通道使用,双通道数据肯定无法复现这个问题了。 我本想改代码fsl_ssi.c在SSI 1 的情况下,关闭双FIFO,可是实验下来,发现数据丢的很多,我改的可能还有问题 fsl_ssi_imx_probe中根据是ssi是1 情况,让他不设置ssi_private->use_dual_fifo = true;

如下:if(ssi_private->ssi_index==1){
    dprintk("[SSI]: don't use_dual_fifo if ssi_index==1\n");
 }else{
 ret = of_property_read_u32_array(np, "dmas", dmas, 4);
   if (ssi_private->use_dma && !ret && dmas[2] == IMX_DMATYPE_SSI_DUAL) {
    ssi_private->use_dual_fifo = true;
    /* When using dual fifo mode, we need to keep watermark
     * as even numbers due to dma script limitation.
     */
    ssi_private->dma_params_tx.maxburst &= ~0x1;
    ssi_private->dma_params_rx.maxburst &= ~0x1;
    dprintk("[SSI]: use_dual_fifo is true \n");
   }
  }

还请老师帮忙解答下。如何关闭双FIFO,只是使用一个FIFO即可,或者双FIFO如何在单通道上更好的工作?。项目马上量产,期待你的回答。

0 Kudos

27,348 Views
2570624484
Contributor II

HI 伟东,改成这样就是不使用双FIFO了,我测试一次可以正常工作,还需要大量测试。请你确认下,这个就是改成1个FIFO使用吗?另外,在帮忙确认单通道使用双FIFO是否有我遇到的问题?

&ssi1 {
 dmas = <&sdma 37 1 0>,
        <&sdma 38 1 0>; 
 ssi,index = <1>;
 fsl,mode = "i2s-master";
 status = "okay";
};

0 Kudos

27,348 Views
2570624484
Contributor II

HI ,HI 伟东基于 &ssi1 {
 dmas = <&sdma 37 1 0>,
        <&sdma 38 1 0>; 
 ssi,index = <1>;
 fsl,mode = "i2s-master";
 status = "okay";
};这个修改,短接RXD,TXD ,发送正弦波数据,还是会出现数据有问题,每次开完机测测一次,出现了一次波形不对,6次没抓到数据,其他情况都是正常。

0 Kudos

27,348 Views
2570624484
Contributor II

如图正常数据为正常波形,1567244519(1).png

0 Kudos

27,348 Views
weidong_sun
NXP TechSupport
NXP TechSupport

Hi liang,

    如果是单声道数据,而发送方式是立体声方式(2个FIFO)发出去,不是不可以,但是意为着BCLK要增加一倍,帧同步也要增加一倍。

   而当你调整为单声道(1个FIFO)发出去的时候,反而是对的的数据,那么说明BCLK和帧同步和数据对应上了。所以,你可以用这个方式去做。

   但是,建议你增加一个fifo_num这样的成员在device tree的节点里。然后,在fsl_ssi_probe()函数里,获取这个节点设置,在函数fsl_ssi_imx_probe()调用之前,获取。如果fifo_num==1,那么ssi_private->use_dual_fifo=false。

 ssi,index = <1>; 表示使用i.mx6dl中的SSI1,cpu内有3个SSI,分别为SSI1/SSI2和SSI3。这里表示使用SSI1,它不是用1个FIFO的意思。

另外,你最好别用RXD---TXD连接的方式进行测试,这个结果不好说明是对的还是不对的。你就用你的板子测试,就行。

伟东

0 Kudos

27,348 Views
2570624484
Contributor II

HI, 伟东您好。非常感谢你的回答。还有些疑问,

1)sdma-imx6q.bin.ihex这个应该只是配置文件(类似配置一些通路),SDMA应该还有自己的固件,SDMA的固件你们应该出厂就会下载了吧(这部分的固件和sdma-imx6q.bin.ihex 的匹配是否有问题,如何确定这个固件是最新的)?我替换了sdma-imx6q.bin.ihex,这个文件,结果短接RXD 和TXD还是可以发现某些列被替换了,数据是完整的,我觉得这种规律的数据颠倒和sdma搬运有关系吧?这部分的规律交换,你那里可以给一个解释?

  2)您说,你最好别用RXD---TXD连接的方式进行测试,这个结果不好说明是对的还是不对的。

          这部分为啥不能这样测试,现在配置的的模式,TXD在上升沿发送数据,RXD在下降沿接受数据,时钟部分同步也不会出问题,按道理是可以做自测内部SOC的工作状态的稳定性的?是否可以详详细说明,不可以测试的原因?因为我需要剥离出去外界的影响,或者提供其他测试方法?

3)我按照你的方式,增加一个fifo,其实必须要在&ssi1 {
 dmas = <&sdma 37 1 0>,
        <&sdma 38 1 0>; 
 ssi,index = <1>;
 fsl,mode = "i2s-master";
 status = "okay";
};增加dmas = <&sdma 37 1 0>,
        <&sdma 38 1 0>;  这个部分,因为SDMA驱动里会根据37 和38 后面的数字判断是否是双FIFO还是一个FIFO,我看了你们以前的Git 记录,之前在一个fifo的时候用的是 1 IMX_DMATYPE_SSI_SP  ;22 IMX_DMATYPE_SSI_DUAL,同样fsl_SSI.c也会根据这个值设置成一个fifo,我改成 上面以后,测试时钟和同步 数据都可以出来,但还是概率性的数据错误。实在无法解释了?

0 Kudos

27,349 Views
2570624484
Contributor II

HI ,Weidong非常感谢你的回复 ,关于这个问题,我如何验证IMX6 这一侧无问题呢?这个问题困扰太久了。期待您的解答。

0 Kudos

27,349 Views
2570624484
Contributor II

非常感谢你的回复,我可能表述还是有点不清。我分几种况来说,1)出现异常时时,播放pcm和录pcm其实都出问题了,两个声音都是异常的,2)如果我把pcmwrite注释掉,问题无法复现,

3)附件的波形图都是出现异常时的pcmread数据 我有个疑问,您说的计算播放和录音的速率是否相同?不太清楚如何计算,可以细说吗?期待你的回复!

-原始邮件-

发件人: "weidong.sun"<admin@community.nxp.com>

发送时间: 2019年8月22日(星期四) 晚上9:56

收件人: "lou liang"<2570624484@qq.com>;

主题: Re: - Re: MX6DL SSI1 声音异常

NXP Community

Re: MX6DL SSI1 声音异常

reply from Wigros Sun in i.MX Processors - View the full discussion

Hello Liang,

你的怀疑是有道理的,从波形看你遇到的问题不是干扰造成的。但是要这样考虑,对CPU来说,PCM的发送和接收,如果同时进行的话,那么你BT 端PCM给出来的时钟和同步信号,CPU端的收和发都使用这个时钟和同步信号。也就是收和发使用相同的时钟。pcm_write,即CPU的PCM发送出了问题,说明它和时钟好像不同步了。但是,pcm_read是对的,说明CPU PCM接收RXD和时钟是同步的。

所以你要计算一下播放速率和接收速率是不是相同的。

伟东

Reply to this message by replying to this email, or go to the message on NXP Community

Start a new discussion in i.MX Processors by email or at NXP Community

Following Re: MX6DL SSI1 声音异常 in these streams: Inbox

This email was sent by NXP Community because you are a registered user.

You may unsubscribe instantly from NXP Community, or adjust email frequency in your email preferences

0 Kudos