您好!
我是代表我负责一个项目的团队发布此帖子、该项目涉及使用 MEMS 麦克风(SPH0641LU4H-1)录制超声波声音以及使用 PCM3180将 PDM 转换为 I2S 音频输出。 我在运行 Ubuntu 服务器的 Raspberry PI 0 2 W 上读取 I2S 数据。 我认为麦克风已成功输出 PDM 数据、并且我已根据数据表中的应用图验证了 PCMD3180连接。 我似乎在记录垃圾的数据从麦克风,不知道如何进行。
我的理论是、PCM3180芯片的设置脚本存在问题。 这其中一部分是由于数据表中的潜在矛盾导致的。 请参阅下图、其中建议在设置过程中覆盖保留的寄存器位。
附件是我编写的设置脚本:
#!/bin/sudo bash
# PCMD3180启动顺序
#将 GPIO 引脚4置为低电平
sudo gpioset gpiochip0 4=0
睡眠0.5
回波"正在启动 PCDM3180启动顺序..."
回波"将 SHDNZ 引脚切换为高电平..."
sudo gpioset gpiochip0 4=1
回波"PCMD3180..."
ECHO "正在启用 i2c 总线的调试选项。。。"
ECHO "正在发送0x81到 P0_R2、设置内部 Areg..."
i2cset -y 1 0x4C 0x02 0x81
休眠1#等待1秒钟以便寄存器初始化
#将 PCMD3180设置为音频主设备
#将 GPIO1配置为 MCLK 输入
回显"将 GPIO1配置为 MCLK 输入。。。"
i2cset -y 1 0x4C 0x21 0xA0
#将设备配置为主设备,MCLK=MCLK 12 MHz
回显"将 PCMD3180配置为音频总线主控。。。"
i2cset -y 1 0x4C 0x13 0x80
# FS = 192k、BCLK = 6.144 MHz、BCLK/FSYNC 比率= 64
回波"采样率= 192kHz、BCLK = 12.288 MHz、 BCLK/FSYNC 比率= 128..."
i2cset -y 1 0x4C 0x14 0x62
#将设备配置为 I2S 模式
i2cset -y 1 0x4C 0x07 0x40
#通过 I2C 写入 P0_R60将 CH1_INSRC 配置为数字 PDM 输入
回显"将 CH1_INSRC 配置为数字 PDM 输入。。。"
i2cset -y 1 0x4C 0x3C 0x40
#通过 I2C 写入 P0_R65将 CH2_INSRC 配置为数字 PDM 输入
回显"将 CH2_INSRC 配置为数字 PDM 输入。。。"
i2cset -y 1 0x4C 0x41 0x40
#通过 I2C 写入 P0_R70将 CH3_INSRC 配置为数字 PDM 输入
#echo "Configuring CH3_INSRC as Digital PDM Input..."
#i2cset -y 1 0x4C 0x46 0x40
#通过 I2C 将 CH4_INSRC 配置为数字 PDM 输入写入 P0_R75
#echo "Configuring CH4_INSRC as Digital PDM Input..."
#i2cset -y 1 0x4C 0x4B 0x40
#i2cdump -y 1 0x4c
#通过 I2C 写入 P0_R34将 PDMCLK_GPO1配置为 PDMCLK
回显"将 PDMCLK_GPO1配置为 PDMCLK..."
i2cset -y 1 0x4C 0x22 0x41
#通过 I2C 写入 P0_R35将 PDMCLK_GPO2配置为 PDMCLK
回显"将 PDMCLK_GPO2配置为 PDMCLK..."
i2cset -y 1 0x4C 0x23 0x41
#通过 I2C 写入 P0_R36将 PDMCLK_GPO2配置为 PDMCLK
#echo "Configuring PDMCLK_GPO3 as PDMCLK..."
#i2cset -y 1 0x4C 0x24 0x41
#通过 I2C 写入 P0_R37将 PDMCLK_GPO3配置为 PDMCLK
#echo "Configuring PDMCLK_GPO4 as PDMCLK..."
#i2cset -y 1 0x4C 0x25 0x41
#通过 I2C 将 PDMIN1_GPI1和 PDMIN2_GPI2配置为 PDMIN1和 PDMIN2写入 P0_R43
回显"将 PDMIN1_GPI1和 PDMIN_GPI2配置为 PDMIN1和 PDMIN2..."
i2cset -y 1 0x4C 0x2B 0x40
#通过 I2C 将 PDMIN3_GPI3和 PDMIN4_GPI4配置为 PDMIN3和 PDMIN4写入 P0_R44
#echo "Configuring PDMIN_GPI3 and PDMIN_GPI4 as PDMIN3 and PDMIN4..."
#i2cset -y 1 0x4C 0x2C 0x67
#通过 I2C 写入 P0_R115来启用输入 Ch1-8
回波"正在启用 PDM 输入通道1..."
i2cset -y 1 0x4C 0x73 0xC0
#通过 I2C 写入 P0_R116将 ASI 输出 Ch1输入到 CH-8插槽
回波"正在启用 ASI 输出通道1..."
i2cset -y 1 0x4C 0x74 0xC0
#通过 I2C 配置频率为768kHz 的 PDMCLK 写入 P0_R31
回波"将麦克风切换到低功耗模式(PDMCLK = 0.768 MHz)..."
i2cset -y 1 0x4C 0x1F 0x42
#通过 I2C 为 PDM 转换器和 PLL 加电写入 P0_R117
回波"正在为 PLL 时钟发生器和 PDM 转换器供电..."
i2cset -y 1 0x4C 0x75 0x60
#睡眠1
#将 PDMCLK_DIV 从768kHz 更改为3.072 MHz
回波"将麦克风转换到超声波模式(PDMCLK = 3.072 MHz)..."
i2cset -y 1 0x4C 0x1F 0x40
下面是一个 i2cdump 输出、显示设置脚本运行后每个寄存器的状态:
这里是从 PCMD3180传输到 RPi 的 SDOUT、FSYNC 和 BCLK 信号的示波器输出。
顶部的 SDOUT
底部的 FSYNC:6.2v 峰峰值、包含噪声。 约5.2us 周期
底部- 5.8MHz 上的 BCLK、6.2V 峰峰值
除此之外、我正在尝试使用 Linux arecord 命令将 I2S 数据输出到.wav 文件中。 此时我迷路了、不知道如何继续解决此问题。 如有任何帮助,将不胜感激。