NXP MCU 技术论坛
直播中

李泽坚

8年用户 1429经验值
私信 关注
[问答]

PCM3168A SAI音频输入/输出无法同时工作怎么解决?

我可以录制音频,但无法播放音频。
我补充说”FSL,SAI-异步" to the sai0 node, but that didn't seem to allow both to work at the same time.  If I probe the ADC lines, I never see a BCLK or LRCLK signals when the cpu is the master, but I do see signals when the 编 解码 器 is the master.
What am I doing wrong?  Here's my device tree below:
播放正常,捕获不工作:
sound_card: sound-card {        compatible = "simple-audio-card";        simple-audio-card,name = "PCM3168A";        simple-audio-card,aux-devs = <&>;        simple-audio-card,widgets =                        "Speaker", "Channel1out",                        "Speaker", "Channel2out",                        "Speaker", "Channel3out",                        "Speaker", "Channel4out",                        "Speaker", "Channel5out",                        "Speaker", "Channel6out",                        "Speaker", "Channel7out",                        "Speaker", "Channel8out",                        "Microphone", "Channel1in",                        "Microphone", "Channel2in",                        "Line", "Channel3in",                        "Line", "Channel4in",                        "Microphone", "Channel5in",                        "Microphone", "Channel6in";        simple-audio-card,routing =                        "Channel1out", "AOUT1L",                        "Channel2out", "AOUT1R",                        "Channel3out", "AOUT2L",                        "Channel4out", "AOUT2R",                        "Channel5out", "AOUT3L",                        "Channel6out", "AOUT3R",                        "Channel7out", "AOUT4L",                        "Channel8out", "AOUT4R",                        "Channel1in", "AIN1L",                        "Channel2in", "AIN1R",                        "Channel3in", "AIN2L",                        "Channel4in", "AIN2R",                        "Channel5in", "AIN3L",                        "Channel6in", "AIN3R";        simple-audio-card,dai-link@0 {                        format = "left_j";                        bitclock-master = <&snd_cpu>;                        frame-master = <&snd_cpu>;                        mclk-fs = <512>;                        snd_cpu: cpu {                                        sound-dai = <&sai0>;                                        clocks = <&mclkout0_lpcg 0>;                                        dai-tdm-slot-num = <8>;                                        dai-tdm-slot-width = <32>;                        };                        pcm3168_dac: 编 解码 器 {                                        sound-dai = <&pcm3168a 0>;                                        dai-tdm-slot-num = <8>;                                        dai-tdm-slot-width = <32>;                        };        };        simple-audio-card,dai-link@1 {                        format = "left_j";                        bitclock-master = <&mic_cpu>;                        frame-master = <&mic_cpu>;                        mclk-fs = <512>;                        mic_cpu: cpu {                                        sound-dai = <&sai0>;                                        clocks = <&mclkout0_lpcg 0>;                                        dai-tdm-slot-num = <8>;                                        dai-tdm-slot-width = <32>;                        };                        pcm3168_adc: 编 解码 器 {                                        sound-dai = <&pcm3168a 1>;                                        dai-tdm-slot-num = <8>;                                        dai-tdm-slot-width = <32>;                        };        };};
Capture Working(捕获工作)和 Playback (播放不工作):
simple-audio-card,dai-link@0 {                format = "left_j";                bitclock-master = <&snd_cpu>;                frame-master = <&snd_cpu>;                mclk-fs = <512>;                snd_cpu: cpu {                                sound-dai = <&sai0>;                                clocks = <&mclkout0_lpcg 0>;                                dai-tdm-slot-num = <8>;                                dai-tdm-slot-width = <32>;                };                pcm3168_dac: 编 解码 器 {                                sound-dai = <&pcm3168a 0>;                                dai-tdm-slot-num = <8>;                                dai-tdm-slot-width = <32>;                };};simple-audio-card,dai-link@1 {                format = "left_j";                bitclock-master = <&pcm3168_adc>;                frame-master = <&pcm3168_adc>;                mclk-fs = <512>;                mic_cpu: cpu {                                sound-dai = <&sai0>;                                clocks = <&mclkout0_lpcg 0>;                                dai-tdm-slot-num = <8>;                                dai-tdm-slot-width = <32>;                };                pcm3168_adc: 编 解码 器 {                                sound-dai = <&pcm3168a 1>;                                dai-tdm-slot-num = <8>;                                dai-tdm-slot-width = <32>;                };};
SAI0 节点:
&sai0 {        #sound-dai-cells = <0>;        assigned-clocks = <&clk IMX_SC_R_AUDIO_PLL_0 IMX_SC_PM_CLK_PLL>,                        <&clk IMX_SC_R_AUDIO_PLL_0 IMX_SC_PM_CLK_SLV_BUS>,                        <&clk IMX_SC_R_AUDIO_PLL_0 IMX_SC_PM_CLK_MST_BUS>,                        <&sai0_lpcg 0>;        assigned-clock-rates = <786432000>, <49152000>, <12288000>, <49152000>;        pinctrl-names = "default";        pinctrl-0 = <&pinctrl_sai0>;        FSL,SAI-异步;        status = "okay";};pinctrl_sai0: sai0grp {        fsl,pins = <                IMX8QM_SPI0_CS1_AUD_SAI0_TXC            0x0600004c        // BCKDA                IMX8QM_SPI2_CS1_AUD_SAI0_TXFS                        0x0600004c        // LRCKDA                IMX8QM_SPI0_SDI_AUD_SAI0_RXD                        0x0600004c        // DOUT1                IMX8QM_SPI0_SDO_AUD_SAI0_TXD                        0x0600006c        // DIN1                IMX8QM_SPI0_SCK_AUD_SAI0_RXC                        0x0600004c        // BCKAD                IMX8QM_SPI0_CS0_AUD_SAI0_RXFS                        0x0600004c        // LRCKAD        >;};
I2C 节点:
// Audio Codec (8-channel output, 6-channel input)pcm3168a: audio-编 解码 器@44 {        compatible = "ti,pcm3168a";        reg = <0x44>;        reset-gpios = <&lsio_gpio4 24 GPIO_ACTIVE_LOW>;        clocks = <&mclkout0_lpcg 0>;        clock-names = "scki";        clock-frequency = <24576000>;        assigned-clocks = <&clk IMX_SC_R_AUDIO_PLL_0 IMX_SC_PM_CLK_PLL>,                <&clk IMX_SC_R_AUDIO_PLL_0 IMX_SC_PM_CLK_SLV_BUS>,                <&clk IMX_SC_R_AUDIO_PLL_0 IMX_SC_PM_CLK_MST_BUS>,                <&mclkout0_lpcg 0>;        assigned-clock-rates = <786432000>, <49152000>, <24576000>, <49152000>;        #sound-dai-cells = <1>;        VDD1-supply = <®_3v3>;        VDD2-supply = <®_3v3>;        VCCAD1-supply = <®_5v0>;        VCCAD2-supply = <®_5v0>;        VCCDA1-supply = <®_5v0>;        VCCDA2-supply = <®_5v0>;        pinctrl-names = "default";        pinctrl-0 = <&pinctrl_编 解码 器_clk &pinctrl_audio_reset>;};
                                                                                                                                                                                                                                                                                                        

回帖(1)

李超

2025-4-16 18:01:33

针对PCM3168A SAI音频输入/输出无法同时工作的问题,以下是逐步解决方案:




1. 主从模式冲突排查



  • 问题核心:当CPU作为主设备(Master)时,编解码器(PCM3168A)的ADC无法检测到BCLK/LRCLK信号,但编解码器作为主设备时正常。这表明主从模式配置冲突。

  • 解决方案

    • 统一主从模式:确保SAI接口在同一时间只有一个主设备。若编解码器作为主设备,则CPU需配置为从设备;反之同理。

    • 设备树调整:在sound-card节点中,明确指定frame-masterbitclock-master,确保收发方向的主从一致性。





2. 设备树配置修正


修改设备树中的simple-audio-card配置,明确主从角色。例如:


sound_card: sound-card {
    compatible = "simple-audio-card";
    status = "okay";

    // Playback配置:编解码器为主,CPU为从
    simple-audio-card,link@0 {
        format = "i2s";
        cpu {
            sound-dai = <&sai0>;
            dai-tdm-slot-num = <2>;
            // CPU作为从设备
            dai-format = "i2s";
        };
        codec {
            sound-dai = <&pcm3168a 0>;
            // 编解码器作为主设备
            frame-master = <&pcm3168a>;
            bitclock-master = <&pcm3168a>;
        };
    };

    // Capture配置:编解码器为主,CPU为从
    simple-audio-card,link@1 {
        format = "i2s";
        cpu {
            sound-dai = <&sai0>;
            dai-tdm-slot-num = <2>;
            // CPU作为从设备
            dai-format = "i2s";
        };
        codec {
            sound-dai = <&pcm3168a 1>;
            // 编解码器作为主设备
            frame-master = <&pcm3168a>;
            bitclock-master = <&pcm3168a>;
        };
    };
};



3. 异步模式与时钟配置



  • 启用异步时钟:在SAI节点中添加fsl,sai-asynchronous允许收发使用独立时钟,但需确保时钟源正确。

  • 检查时钟树:确认SAI的时钟父源(如音频PLL)和分频系数是否支持所需采样率。例如:
    &sai0 {
      compatible = "fsl,imx-sai";
      pinctrl-names = "default";
      pinctrl-0 = <&pinctrl_sai0>;
      fsl,sai-asynchronous; // 启用异步模式
      assigned-clocks = <&clk IMX8MM_CLK_SAI1>;
      assigned-clock-parents = <&clk IMX8MM_AUDIO_PLL1_OUT>;
      assigned-clock-rates = <24576000>; // 根据采样率调整
      status = "okay";
    };




4. 编解码器寄存器配置验证



  • 硬件模式设置:确认PCM3168A的MODE引脚和寄存器配置,确保其主从模式与设备树一致。

    • 若编解码器为主设备,检查其是否输出BCLK/LRCLK到CPU。

    • 若编解码器为从设备,检查其是否接收来自CPU的时钟信号。





5. 信号检测与硬件排查



  • 示波器检测

    • 当CPU为主设备时,检查SAI的BCLK/LRCLK引脚是否有信号输出。

    • 确认引脚复用(pinctrl)配置正确,时钟引脚未被其他功能占用。


  • DMA与中断:确保Playback和Capture的DMA通道独立且无冲突。




6. 其他潜在问题



  • 时隙对齐:检查dai-tdm-slot-numdai-tdm-slot-width是否与编解码器配置匹配。

  • 电源管理:确认编解码器的供电和复位信号稳定,避免部分电路未正常工作。




通过以上步骤调整后,重新编译设备树并加载测试。若问题依旧,建议结合内核日志(dmesg)和示波器信号分析进一步排查时钟与数据传输问题。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分