Beagleboneblack 将I2S话筒与BeagleBone Black接口

Beagleboneblack 将I2S话筒与BeagleBone Black接口,beagleboneblack,microphone,microprocessors,Beagleboneblack,Microphone,Microprocessors,我正在尝试将I2S麦克风()与BeagleBone Black接口。我遵循了文章()的建议,能够按照文章中的建议更新设备树和Linux内核 设备树的I2S组件(用于麦克风)作为dtsi包含在主设备树源中。dtsi的内容如下所示 &am33xx_pinmux { mcasp1_pins: mcasp1_pins { pinctrl-single,pins = < /* sink must enable rece

我正在尝试将I2S麦克风()与BeagleBone Black接口。我遵循了文章()的建议,能够按照文章中的建议更新设备树和Linux内核

设备树的I2S组件(用于麦克风)作为dtsi包含在主设备树源中。dtsi的内容如下所示

&am33xx_pinmux {
        mcasp1_pins: mcasp1_pins {
             pinctrl-single,pins = <
                /* sink must enable receivers */
                0x1a0 0x23
                /* P9_42 mcasp1_aclkx - bit clock */
                0x1a4 0x23
                /* P9_27 mcasp1_fsx - frame sync */
                0x1a8 0x23
                /* P9_41 mcasp1_axr0 - i2s input */
             >;
        };
};

&mcasp1 {
        #sound-dai-cells = <0>;
        pinctrl-names = "default";
        pinctrl-0 = <&mcasp1_pins>;
        status = "okay";
        op-mode = <0>;
        tdm-slots = <2>;
        num-serializer = <4>;
        serial-dir = < /* 1 TX 2 RX 0 unused */
                2 0 0 0
                >;
        rx-num-evt = <1>;
        tx-num-evt = <1>;
};

/ {
        pcm5102a: pcm5102a {
                #sound-dai-cells = <0>;
                compatible = "ti,pcm5102a";
                status = "okay";
        };

        sound1: sound@1 {
                compatible = "simple-audio-card";
                simple-audio-card,name = "PCM5102a";
                simple-audio-card,format = "i2s";
                simple-audio-card,bitclock-master = <&sound1_master>;
                simple-audio-card,frame-master = <&sound1_master>;
                simple-audio-card,bitclock-inversion;

                simple-audio-card,cpu {
                        sound-dai = <&mcasp1>;
                };

                sound1_master: simple-audio-card,codec {
                #sound-dai-cells = <0>;
                sound-dai = <&pcm5102a>;
                clocks = <&mcasp1_fck>;
                clock-names = "mclk";
                };
        };
};
然而,每当我尝试录制音频时,我都无法获得任何音频数据。音频文件已形成,但无论我尝试录制音频多长时间,文件大小始终为44字节。显然,文件中没有数据

使用arecord命令录制会产生如下错误

arecord -d 10 -Dhw:0,0 -f dat audio.wav
Recording WAVE 'audio.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Stereo
arecord: pcm_read:2032: read error: Input/output error
此外,每当我尝试用示波器连接时钟(MCAP1_ACLKR(位时钟)-P9_42)时,我都看不到任何脉冲。该引脚上似乎没有正确的时钟信号。如何调试和修复此问题

有什么想法吗


Parag

您提供的链路中使用的PCM1864板生成自己的时钟并在主模式下运行。但是,您使用的麦克风需要总线主机生成位时钟和帧同步信号才能工作

am33xx处理器的McASP模块可以生成这些信号,但可能需要对驱动程序/设备树进行一些修改

mcasp信号可以映射到BeagleBone板上的以下引脚(由生成)。注意,此处使用的设备是mcasp0,而不是mcasp1。我假设TI使用的是不同版本的beagle bone,它的MCAS1连接到IO头

pinctrl-single,pins = <
        AM33XX_IOPAD(0x9ac, PIN_INPUT_PULLDOWN | MUX_MODE0) /* (A14) mcasp0_ahclkx.mcasp0_ahclkx */
        AM33XX_IOPAD(0x99c, PIN_INPUT_PULLDOWN | MUX_MODE0) /* (C12) mcasp0_ahclkr.mcasp0_ahclkr */
        AM33XX_IOPAD(0x990, PIN_INPUT_PULLDOWN | MUX_MODE0) /* (A13) mcasp0_aclkx.mcasp0_aclkx */
        AM33XX_IOPAD(0x994, PIN_INPUT_PULLDOWN | MUX_MODE0) /* (B13) mcasp0_fsx.mcasp0_fsx */
        AM33XX_IOPAD(0x9a0, PIN_INPUT_PULLDOWN | MUX_MODE0) /* (B12) mcasp0_aclkr.mcasp0_aclkr */
        AM33XX_IOPAD(0x9a4, PIN_INPUT_PULLDOWN | MUX_MODE0) /* (C13) mcasp0_fsr.mcasp0_fsr */
        AM33XX_IOPAD(0x998, PIN_INPUT_PULLDOWN | MUX_MODE0) /* (D12) mcasp0_axr0.mcasp0_axr0 */
        AM33XX_IOPAD(0x9a8, PIN_INPUT_PULLDOWN | MUX_MODE0) /* (D13) mcasp0_axr1.mcasp0_axr1 */
    >;
pinctrl单个,引脚=<
AM33XX_IOPAD(0x9ac,引脚输入下拉| MUX_MODE0)/*(A14)mcasp0_ahclkx.mcasp0_ahclkx*/
AM33XX_IOPAD(0x99c,引脚输入下拉| MUX_MODE0)/*(C12)mcasp0_ahclkr.mcasp0_ahclkr*/
AM33XX_IOPAD(0x990,引脚输入下拉| MUX_MODE0)/*(A13)mcasp0_aclkx.mcasp0_aclkx*/
AM33XX_IOPAD(0x994,引脚输入下拉| MUX_MODE0)/*(B13)mcasp0_fsx.mcasp0_fsx*/
AM33XX_IOPAD(0x9a0,引脚输入下拉| MUX_MODE0)/*(B12)mcasp0_aclkr.mcasp0_aclkr*/
AM33XX_IOPAD(0x9a4,引脚输入下拉|多路复用模式)/*(C13)mcasp0_fsr.mcasp0_fsr*/
AM33XX_IOPAD(0x998,引脚输入下拉| MUX_MODE0)/*(D12)mcasp0_axr0.mcasp0_axr0*/
AM33XX_IOPAD(0x9a8,引脚输入下拉| MUX_MODE0)/*(D13)mcasp0_axr1.mcasp0_axr1*/
>;
根据本发明,接收机的时钟信号(ahclkr、aclkr、fsr)可以被设置为独立于与发射机的时钟信号同步地运行,并且可以根据需要指定分频器。用于提供时钟信号的引脚需要设置为引脚输出

在我看来,beagle board提供的覆盖,当与默认时钟设备树插入一起使用时,从系统时钟派生时钟。你可能想试试这个

我面临着同样的“输入/输出错误”问题,尽管是使用USB麦克风。奇怪的是,在运行“arecord”几次(2或3次)后,它的工作方式与预期的一样。运气好吗?
pinctrl-single,pins = <
        AM33XX_IOPAD(0x9ac, PIN_INPUT_PULLDOWN | MUX_MODE0) /* (A14) mcasp0_ahclkx.mcasp0_ahclkx */
        AM33XX_IOPAD(0x99c, PIN_INPUT_PULLDOWN | MUX_MODE0) /* (C12) mcasp0_ahclkr.mcasp0_ahclkr */
        AM33XX_IOPAD(0x990, PIN_INPUT_PULLDOWN | MUX_MODE0) /* (A13) mcasp0_aclkx.mcasp0_aclkx */
        AM33XX_IOPAD(0x994, PIN_INPUT_PULLDOWN | MUX_MODE0) /* (B13) mcasp0_fsx.mcasp0_fsx */
        AM33XX_IOPAD(0x9a0, PIN_INPUT_PULLDOWN | MUX_MODE0) /* (B12) mcasp0_aclkr.mcasp0_aclkr */
        AM33XX_IOPAD(0x9a4, PIN_INPUT_PULLDOWN | MUX_MODE0) /* (C13) mcasp0_fsr.mcasp0_fsr */
        AM33XX_IOPAD(0x998, PIN_INPUT_PULLDOWN | MUX_MODE0) /* (D12) mcasp0_axr0.mcasp0_axr0 */
        AM33XX_IOPAD(0x9a8, PIN_INPUT_PULLDOWN | MUX_MODE0) /* (D13) mcasp0_axr1.mcasp0_axr1 */
    >;