This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TAC5111:双通道 PDM 在 I2S 上录制单通道静音

Guru**** 2765795 points

Other Parts Discussed in Thread: TAC5111

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/1602682/tac5111-dual-channel-pdm-recording-one-channel-silent-on-i2s

器件型号: TAC5111

您好、

我们将在 i.MX8M Plus 的新设计中使用 TAC5111。

为了进行播放、我们有 1 个模拟扬声器、其放大器连接到 OUT1P/OUT1M。

为了进行录音、我们在引脚 GPIO2(时钟)和 GPIO1(数据)上有 2 个 PDM 麦克风。
麦克风配置为交替时钟相位。 这通过连接双通道示波器并在每个相位期间看到脉冲来确认。

与 CPU 的接口是针对 I2S 配置的、对于本问题、我们在每个通道 16 位的速率下进行记录。  编解码器相应地通过 amixer 命令进行配置、对于 2 通道数字 PDM 输入:

amixer -c 0 sset 'IN1 Source Mux' 'PDM'
amixer -c 0 sset 'IN2 Source Mux' 'PDM'
amixer sset 'ASI_TX_CH1_EN' cap
amixer sset 'ASI_TX_CH2_EN' cap
amixer sset 'PDM1 Digital' 255

# must record in S16_LE format to avoid driver bugs
amixer sset 'PDM Clk Divider' '1.4112 MHz or 1.536 MHz'
arecord -D hw:0,0 -c 2 -r 48000 -f S16_LE -d 15 rec.wav

因为我们运行的是 NXP 供应商内核版本 6.6 、所以我们使用的编解码器驱动程序 git.ti.com/.../ 的标题为“使驱动程序与内核版本 5.15 兼容“。

我们发现录制的文件在第二个通道上具有静音状态、只有一个通道具有有效的波形。 事实上,单通道录音是通过在录音时播放音乐,然后回放录制的文件确认的。

我们使用示波器测量 I2S 信号:FCLK 为 48kHz、BCLK 为 1.536MHz。
但是、数据(DOUT 引脚)在 FCLK 为高电平时保持低电平、即未处于高电平状态 FCLK、编解码器不会通过 I2S 发送数据到 CPU(请参阅下面的测量结果 — 由于 GND 悬空,因此略有噪声):

audio1.png

为什么会这样、我们如何配置编解码器以将第二个通道数据从 PDM 麦克风发送到 I2S?

有关以下参考器件树片段:

/ {
	sound-tac5111 {
		/*
		 * TAC5111 Codec on i.MX8 SAI3 with 4-wire i2s interface.
		 *
		 * - SoC generates MCLK for Codec at 24.576
		 *   (avoids clock drift between SoC and Codec)
		 * - SoC is bitclock and frame master
		 * - I2S interface width max. S32_LE
		 * - Codec GPIO1 & GPIO2 with dual PDM microphone
		 * - Codec OUT1P/OUT1M differential mono output
		 *   routed to speaker through amplifier
		 *
		 */
		compatible = "simple-audio-card";
		simple-audio-card,format = "i2s";
		simple-audio-card,name = "Analog";
		simple-audio-card,bitclock-master = <&cpu_dai>;
		simple-audio-card,frame-master = <&cpu_dai>;

		simple-audio-card,widgets =
			"Line", "Line In",
			"Line", "Line Out";

		simple-audio-card,routing =
			"DIN1", "Line In",
			"DIN2", "Line In",
			"Line Out", "OUT1";

		cpu_dai: simple-audio-card,cpu {
			sound-dai = <&sai3>;
			/* TODO: clock rate? */
			/* ensure mclk is generated by SoC for Codec */
			//system-clock-direction-out;
			/* force 32-bit slots */
			//dai-tdm-slot-num = <2>;
			//dai-tdm-slot-width = <32>;
		};

		codec_dai: simple-audio-card,codec {
			sound-dai = <&codec>;
			/* this ensures codec set_sysclk call-back executes */
			system-clock-frequency = <24576000>;
			mclk-fs = <512>;
		};
	};
};

&i2c2 {
	codec: audio-codec@50 {
		compatible = "ti,tac5111";
		reg = <0x50>;
		#sound-dai-cells = <0>;
		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_codec>;
		interrupts-extended = <&gpio4 21 IRQ_TYPE_EDGE_FALLING>;
		avdd-supply = <&v_3_3>;
		iovdd-supply = <&v_3_3>;
		/*
		 * configure gpio functionality on gpio pins:
		 * - GPIO1: pdm data input
		 * - GPIO2: pdm clock output
		 * - GPO1:  chip irq output
		 */
		ti,gpios-func = <1>, <4>, <3>;
		/*
		 * select pdm input pins for channels 1/2 & 3/4:
		 * - ch0/1: gpio1
		 * - ch2/3: not used
		 */
		ti,pdm-input-pins = <1>, <0>;
		/* configure gpi1 as cclk input */
		ti,gpi1-func = <2>;
		/*
		 * configure MICBIAS and VREF to fix driver probe error:
		 * [    8.570840] tac5x1x-codec 1-0050: Fail to get verf E:-22
		 *
		 * Yet bindings clearly state to that these are powered down if "node" (read property) omitted:
		 * - "If node is omitted then MicBias is powered down."
		 * - "If node is omitted then VREF is powered down."
		 * This board does not use them ...
		 */
		ti,vref = <0>;
		ti,micbias-vg = <3>;
		/* configure gpi(o) drive:
		 * - GPIO1: floating, i.e. output buffer disabled
		 * - GPIO2: push-pull, i.e. active low & active high (PDM clock)
		 * - GPO1:  open-drain, i.e. active low & high impedance
		 */
		ti,gpios-drive = <0>, <1>, <3>;
		ti,gpa-gpio = <0>;
		ti,gpa-threshold = <75>, <186>;
	};
};
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Josua、

    我们能否检查 PASS_TX_CH1 和 PASI_TX_CH2 寄存器 (Book0、Page0、寄存器 30 和 31) 的设置:

    这些寄存器的默认值为:

    0x20 - TDM 时隙 0 / I2S 左时隙 0

    0x21 - TDM 时隙 1 / I2S 左时隙 1

    要获取第二个通道数据、需要将寄存器 31 从 0x21 更改为 0x30(对应于 I2S 右时隙 0)。

    谢谢。此致、

    Lakshmi Narasimhan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在记录之前检查 PASI_TX_CH[12]_CFG:

    # page register, need page 0
    # i2cget -f -y 1 0x50 0x00
    0x00
    # PASI_TX_CH1_CFG
    # i2cget -f -y 1 0x50 0x1E
    0x20
    # PASI_TX_CH2_CFG
    # i2cget -f -y 1 0x50 0x1F
    0x30


    记录时再次检查 — 值不变:
    # page register, need page 0
    # i2cget -f -y 1 0x50 0x00
    0x00
    # PASI_TX_CH1_CFG
    # i2cget -f -y 1 0x50 0x1E
    0x20
    # PASI_TX_CH2_CFG
    # i2cget -f -y 1 0x50 0x1F
    0x30


    这已经符合预期。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Josua、

    您能否在录制时共享寄存器转储?

    谢谢。此致、

    Lakshmi Narasimhan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我在之前的消息中记录之前和录制期间都已经分享过。 这些值是相同的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Josua、

    我知道寄存器 0x1E 和 0x1F 的值相同。

    我要求提供所有配置寄存器的寄存器转储(通过 i2cdump 命令获取)、以检查其他配置是否可能不匹配。

    谢谢。此致、

    Lakshmi Narasimhan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    对! 以下是 i2cdump、可以在记录和执行过程中使用:

    # i2cdump -f -y 1 0x50
         0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
    00: 00 00 00 00 00 15 35 00 00 00 10 41 33 02 00 60    .....?5...?A3?.`
    10: 52 80 00 04 00 00 00 00 40 00 70 00 00 00 00 10    R?.?....@.p....?
    20: 02 03 04 05 06 07 00 00 00 10 02 03 04 05 06 07    ??????...???????
    30: 00 00 00 00 42 00 00 20 00 00 00 00 00 00 00 00    ....B.. ........
    40: 00 00 11 54 00 00 00 00 00 00 00 00 2e 00 00 00    ..?T............
    50: 04 00 a1 80 00 04 00 a1 80 00 00 a1 80 00 00 a1    ?.??.?.??..??..?
    60: 80 00 00 00 20 20 20 c9 80 c9 80 20 20 20 c9 80    ?...   ????   ??
    70: c9 80 18 18 00 00 00 a0 00 00 80 00 c0 10 c8 00    ????...?..?.???.
    80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    # arecord -D hw:0,0 -c 2 -r 48000 -f S16_LE -d 40 >/dev/null &
    [1] 418
    # Recording WAVE 'stdin' : Signed 16 bit Little Endian, Rate 48000 Hz, Stereo
    
    # i2cdump -f -y 1 0x50
         0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
    00: 00 00 01 00 00 15 35 00 00 00 10 41 33 02 02 60    ..?..?5...?A3??`
    10: 52 80 00 04 00 00 00 00 40 00 40 00 00 00 00 10    R?.?....@.@....?
    20: 02 03 04 05 06 07 00 00 00 10 02 03 04 05 06 07    ??????...???????
    30: 00 00 00 00 42 00 00 20 00 00 00 00 00 00 50 00    ....B.. ......P.
    40: 82 00 11 54 00 00 00 00 00 00 00 00 2e 0c 00 00    ?.?T.........?..
    50: 04 00 a1 80 00 04 00 a1 80 00 00 a1 80 00 00 a1    ?.??.?.??..??..?
    60: 80 00 00 00 20 20 20 c9 80 c9 80 20 20 20 c9 80    ?...   ????   ??
    70: c9 80 18 18 00 00 80 a0 a0 80 f8 00 c0 10 79 00    ????..?????.??y.
    80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Josua、

    CH_EN 寄存器 (0x76) 设置为 0x80、表示仅启用通道 1。

    您能否尝试将此引脚设置为 0xC0(以启用通道 1 和 2)、看看这是否解决了问题?

    谢谢。此致、

    Lakshmi Narasimhan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Lakshmi:

     CH_EN 寄存器位 6 确实解决了问题。
    我必须在开始录制命令后进行设置、因为 Linux 驱动程序控制该寄存器并始终设置 0x80。

    下面捕获的波形示例显示了我启用第二个通道的情况:

    启用通道时(请参阅左侧的高峰值)、存在奇怪的伪影、我需要调整`ti、gpa-threshold =<75>、<75>;`Ω。
    静音频道 2 的中心问题已经解决,谢谢!

    但是、最好有一个 Linux 驱动程序补丁来正确解决问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Josua、

    感谢您确认上述设置解决了该问题。 我将提供此观察结果作为反馈、以便它也能在驾驶员中修复。

    由于问题已解决、我将关闭此主题。

    谢谢。此致、

    Lakshmi Narasimhan