我正在尝试连接I2S麦克风(https://www.adafruit.com/product/3421)和BeagleBone黑色。我遵循了文章(http://www.ti.com/lit/an/sprac97/sprac97.pdf),并且能够按照文章中的建议更新设备树和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";
};
};
};最后的设备树(从am335x-boneBlack.dtb反编译而来)是附加的here。包括上述TI文件中规定的管脚在内的McASP条目(mcasp1_pins)位于第1077行。
我还按照文档中的建议,用一个新的驱动程序pcm5102编译了内核。最后,我看到arecord命令的输出中列出了驱动程序。
root@arm:/sys/class/gpio# arecord -l
**** List of CAPTURE Hardware Devices ****
card 0: PCM5102a [PCM5102a], device 0: davinci-mcasp.0-pcm5102a-hifi pcm5102a-hifi-0 []
Subdevices: 1/1
Subdevice #0: subdevice #0然而,每当我尝试录制音频时,我都得不到任何音频数据。音频文件已形成,但无论我尝试录制音频多长时间,文件大小始终为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此外,每当我尝试将时钟(MCASP1_ACLKR (位时钟)- P9_42)连接到我的示波器时,我看不到任何脉冲。看起来这个针脚上没有合适的时钟信号。我能做些什么来调试和修复这个问题?
有什么想法吗?
Parag
发布于 2019-05-07 22:57:24
您提供的链路中使用的PCM1864板生成自己的时钟,并在主模式下工作。但是,您正在使用的麦克风需要总线主控器生成位时钟和帧同步信号才能运行。
am33xx处理器的McASP模块可以生成这些信号,尽管可能需要对驱动程序/设备树进行一些修改。
mcasp信号可以映射到BeagleBone板上的以下引脚(由TI's pinmux tool生成)。注意,这里使用的设备是mcasp0,而不是mcasp1。我假设TI使用的是另一个版本的beagle骨骼,它将mcasp1连接到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 */
>;根据the datasheet of the processor,接收器(ahclkr、aclkr、fsr)的时钟信号可以被设置为独立于发射器的时钟信号而运行,并且可以根据需要指定分频器。用于提供时钟信号的引脚将需要设置为PIN_OUTPUT。
在我看来,当与默认时钟设备树插入here一起使用时,beagle board here提供的覆盖会从系统时钟派生时钟。您可能想要尝试一下这个。
https://stackoverflow.com/questions/49587466
复制相似问题