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.

[参考译文] TLV320ADC3140:TLV320ADC3140、具有 TI AM625 SoC、四通道模拟 CAN't RECORD

Guru**** 2460850 points
Other Parts Discussed in Thread: TLV320ADC3140

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

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/1293258/tlv320adc3140-tlv320adc3140-with-ti-am625-soc-4ch-analog-can-t-record

器件型号:TLV320ADC3140

大家好、

我们的产品采用 TLV320ADC3140编解码器。 我们希望使用 TDM 模式录制4Ch 模拟麦克风。

但是、我们始终记录失败、并显示以下消息:

ACRECORD:PCM_READ:2221:读取错误:输入/输出错误

ALSA 记录命令:

# arecord -f dat -t wav -c 4 4ch.wav

这个编解码器 MCLK、BCLK、FCLK 是从一个时钟发生器输入的。

示波器测量信号分别为24.576MHz、3.072MHz 和48kHz。

CPU 端正在使用 MCASP2。 AXR5通过 tlv320adc3140的 SDOUT 进行 Rx 连接。

ACLKX、AFSX 也是来自时钟发生器的输入。

ACLKX= 3.072MHz。

AFSX = 48kHz

下面是我的设备树:

&main_pmx0 {
    mcasp2_pins_default: mcasp2-pins-default {
        pinctrl-single,pins = <
            AM62X_IOPAD(0x0178, PIN_INPUT, 2) /* (AC20) RGMII2_TD3.MCASP2_ACLKX */
            AM62X_IOPAD(0x0174, PIN_INPUT, 2) /* (AD21) RGMII2_TD2.MCASP2_AFSX */
            AM62X_IOPAD(0x0184, PIN_INPUT, 2) /* (AE23) RGMII2_RD0.MCASP2_AXR2 */
            AM62X_IOPAD(0x0164, PIN_OUTPUT, 2) /* (AA19) RGMII2_TX_CTL.MCASP2_AXR4 */
            AM62X_IOPAD(0x0168, PIN_INPUT, 2) /* (AE21) RGMII2_TXC.MCASP2_AXR5 */
        >;
    };
};

/* Redefine rgmii2 pins avoid pinctrl conflict */
&main_rgmii2_pins_default {
    pinctrl-single,pins = <
        AM62X_IOPAD(0x188, PIN_INPUT, 0) /* (AB20) RGMII2_RD1 */
        AM62X_IOPAD(0x18c, PIN_INPUT, 0) /* (AC21) RGMII2_RD2 */
        AM62X_IOPAD(0x190, PIN_INPUT, 0) /* (AE22) RGMII2_RD3 */
        AM62X_IOPAD(0x180, PIN_INPUT, 0) /* (AD23) RGMII2_RXC */
        AM62X_IOPAD(0x17c, PIN_INPUT, 0) /* (AD22) RGMII2_RX_CTL */
        AM62X_IOPAD(0x16c, PIN_OUTPUT, 0) /* (Y18) RGMII2_TD0 */
        AM62X_IOPAD(0x170, PIN_OUTPUT, 0) /* (AA18) RGMII2_TD1 */
    >;
};

&main_i2c2 {
    status = "okay";
    pinctrl-names = "default";
    pinctrl-0 = <&i2c2_pins_default>;
    clock-frequency = <400000>;

    tlv320adc3140: audio-codec@4c {
        status = "okay";
        #sound-dai-cells = <0>;
        compatible = "ti,tlv320adc3140";
        reg = <0x4c>;
        pinctrl-names = "default";
        pinctrl-0 = <&audio_mic_rst_pins_default>;

        ti,mic-bias-source = <0>;
        ti,pdm-edge-select = <1 1 1 1>;
        ti,gpio-config = <10 0>;
        ti,gpi-config = <0 0 0 0>;

        ti,gpo-config-1 = <0 0>;
        ti,gpo-config-2 = <0 0>;
        ti,gpo-config-3 = <0 0>;
        ti,gpo-config-4 = <0 0>;
        ti,slot-mapping = <0 1 2 3>;
        ti,asi-tx-driver = <0>;

        reset-gpios = <&main_gpio1 6 GPIO_ACTIVE_HIGH>;
    };
};

&tlv320_mclk {
    clock-frequency = <24576000>;
};

&mcasp1 {
    status = "disabled";
};

&mcasp2 {
    status = "okay";
    #sound-dai-cells = <0>;

    pinctrl-names = "defualt";
    pinctrl-0 = <&mcasp2_pins_default>;

    op-mode = <0>;
    tdm-slots = <4>;
    //assigned-clock-rates = <24576000>;

    num-serializer = <6>;
    serial-dir = <
            0 0 1 0 1 2
    >;

    tx-num-evt = <32>;
    rx-num-evt = <32>;
};

&codec_audio {
    /delete-property/ simple-audio-card,widgets;
    /delete-property/ simple-audio-card,routing;
    simple-audio-card,format = "i2s";
    simple-audio-card,widgets = "Microphone", "Mic";
    simple-audio-card,routing =
        "MIC1P", "Mic",
        "MIC1M", "Mic",
        "MIC2P", "Mic",
        "MIC2M", "Mic",
        "MIC3P", "Mic",
        "MIC3M", "Mic",
        "MIC4P", "Mic",
        "MIC4M", "Mic";
    //mclk-fs = <512>;

    simple-audio-card,bitclock-master = <&sound_cpu>;
    simple-audio-card,frame-master = <&sound_cpu>;

    sound_cpu: simple-audio-card,cpu {
        sound-dai = <&mcasp2>;
        clocks = <&tlv320_mclk>;
        dai-tdm-slot-num = <4>;
        dai-tdm-slot-width = <32>;
        dai-tdm-slot-rx-mask = <1 1 1 1>;
    };

    simple-audio-card,codec {
        sound-dai = <&tlv320adc3140>;
        dai-tdm-slot-num = <4>;
        dai-tdm-slot-width = <32>;
        dai-tdm-slot-tx-mask = <1 1 1 1>;
    };
};

记录时、下面是 i2c 寄存器。

是否有任何内容出错?

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

    请提供以下信息

    内核版本、以及在哪里下载了驱动程序代码、 测量 bitclk 和 ws clk 以及示波器、然后上传波形。

    浏览音频信号的重要寄存器设置。 某些寄存器设置似乎没有问题。

    R0x7:0x44、似乎用于 I2S、16位、它应为0x04

    根本原因似乎不同于 record -f dat,dat 表示48kHz,16位,立体声,远离4插槽 tdm 要求。

    还有一点、您是否还可以共享原理图? 某些寄存器设置在很大程度上取决于硬件连接。

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

    Linux 内核版本为6.1.33、来自 AM62 09_00_00_03 SDK

    这是 原理图。

    更新寄存器转储、Devicetree 设置关于 simple-audi-CARD、format "I2S"->"DSP_B"(适用于 tdm 模式)

    R0x7寄存器更改为0x00  

    我有疑问:

    1、根据我们的硬件布局设计,谁应该是简单音频卡、位时钟主控和 简单音频卡、帧主控的大师?

    mcasp2? tlv320adc3140? 或者不需要同时设置属性?

    提供时钟波形需要一些时间。 在这里、首先提供 clk 设置。

    这里是波形

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

    根据您在 devicetree 中的设置

    simple-audio-card、bitclock-master =<&sound_cpu>;
    simple-audio-card、frame-master =<&sound_cpu>;

    主设备是平台。 为什么不设置 DSP-A?

    那么为什么  R0x7不设置为0x04? 进行调整? 时钟似乎是 I2S、32位、3.072MHz 和48kHz。

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

    我不确定 devicetree 设置中有关  simple-audio 卡、frame-master 和 simple-audio 卡、bitclock-master 的信息。

    应该设置 CPU 还是编解码器? 还是两者都不需要设置?

    是否应该设置为 DSP-A?
    R0x7 
    根据简单音频卡格式而定。 设置为 DSP-A、R0x7将为0x00。

    我们的时钟设置适用于16位48k 通道。 因此 BCLK =通道编号* 48K * 16位= 3.072MHz。

    但我不知道为什么不能记录。

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

    关于平台设置、请咨询平台供应商。

    正如我之前所指出的、您使用了错误的参数来 arecord 命令。 我相信您获得的驱动程序代码只支持基本功能,您将添加一些代码来满足您的要求。 16位、r0x7应为0x04。

    这是 TLV320ADC3140的数据表、产品信息和支持| TI.com

    希望这可以帮助您。

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

    谢谢你的答复。

    我认为问题在于器件树设置和 McASP。

    4个模拟麦克风输入-> tlv320adc3140 -> SDOUT -> TI-AM625 mcasp2 AXR5

    我尝试输入命令: arecord -f dat -t wav -c 8 file.wav

    它不会打印任何错误消息。

    但没有数据、文件大小始终为44KB。

    我们需要4通道、命令应该为"arecord -f dat -t wav -c 4 file.wav"。 我错了吗?  

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

     请使用此命令设置"arecord -r 48000 -t wav -f S16_LE -c 4 file.wav"

    -f dat 表示立体声

    数据为零的原因是音频数据还没有进入系统缓冲区。

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

    好!  

    我检查了 pinctrl-map、发现我的 mcasp2 pinctrl 名称错误

    器件2b20000.audio-controller
    状态默认值
    类型 MUX_GROUP (2)
    控制器件 f4000.pinctrl
    组 mcasp2引脚-默认值
    功能 mcasp2引脚-默认

    并且使用  "arecord -r 48000 -t wav -f S16_LE -c 4 file.wav"已录制文件。

    但是文件不是数据。

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

    再次转储寄存器

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

    此处的寄存器

    我已在器件树中更改了编解码器作为主器件。

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

    也共享 devicetree  

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

    &main_pmx0 {
        mcasp2_pins_default: mcasp2-pins-default {
            pinctrl-single,pins = <
                AM62X_IOPAD(0x0178, PIN_INPUT, 2) /* (AC20) RGMII2_TD3.MCASP2_ACLKX */
                AM62X_IOPAD(0x0174, PIN_INPUT, 2) /* (AD21) RGMII2_TD2.MCASP2_AFSX */
                AM62X_IOPAD(0x0184, PIN_INPUT, 2) /* (AE23) RGMII2_RD0.MCASP2_AXR2 */
                AM62X_IOPAD(0x0164, PIN_OUTPUT, 2) /* (AA19) RGMII2_TX_CTL.MCASP2_AXR4 */
                AM62X_IOPAD(0x0168, PIN_INPUT, 2) /* (AE21) RGMII2_TXC.MCASP2_AXR5 */
            >;
        };
    };
        
    
    &mcasp2 {
        status = "okay";
        #sound-dai-cells = <0>;
    
        pinctrl-names = "default";
        pinctrl-0 = <&mcasp2_pins_default>;
    
        op-mode = <0>;
        tdm-slots = <4>;
        //assigned-clock-rates = <24576000>;
    
        //num-serializer = <6>;
        serial-dir = <
            0 0 1 0
            1 2 0 0
            0 0 0 0
            0 0 0 0
        >;
    
        tx-num-evt = <32>;
        rx-num-evt = <32>;
    };
    
    &codec_audio {
        /delete-property/ simple-audio-card,widgets;
        /delete-property/ simple-audio-card,routing;
        simple-audio-card,format = "dsp_a";
        simple-audio-card,widgets = "Microphone", "Mic";
        simple-audio-card,routing =
            "MIC1P", "Mic",
            //"MIC1M", "Mic",
            "MIC2P", "Mic",
            //"MIC2M", "Mic",
            "MIC3P", "Mic",
            //"MIC3M", "Mic",
            "MIC4P", "Mic";
            //"MIC4M", "Mic";
        mclk-fs = <512>;
    
        ///delete-property/simple-audio-card,bitclock-inversion;
        ///delete-property/simple-audio-card,bitclock-master;
        ///delete-property/simple-audio-card,frame-master;
        simple-audio-card,bitclock-master = <&sound_master>;
        simple-audio-card,frame-master = <&sound_master>;
    
        sound_cpu: simple-audio-card,cpu {
            sound-dai = <&mcasp2>;
            clocks = <&tlv320_mclk>;
            dai-tdm-slot-num = <4>;
            dai-tdm-slot-width = <16>;
            dai-tdm-slot-rx-mask = <1 1 1 1>;
        };
    
        sound_master: simple-audio-card,codec {
            sound-dai = <&tlv320adc3140>;
            clocks = <&tlv320_mclk>;
            dai-tdm-slot-num = <4>;
            dai-tdm-slot-width = <16>;
            dai-tdm-slot-tx-mask = <1 1 1 1>;
        };
    };
    
    

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

    您能将示意图与 ADC 一起发送给我吗? 我看不到它  

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

    这里是 ADC 侧

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

    您是否以差分方式耦合信号?

    信号是交流 耦合还是直流耦合?

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

    MIC 为单端

    IN1M 至 GND

    我认为问题与 mcasp2和 tlv320adc3140都是从属方有关

    根据产品要求、时钟发生器 Si5351B 自启动后输出 MCLK/BCLK/FCLK。

    因此、我不知道如何配置 devicetree。

    麦克风1侧

       

    连接到 ADC

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

    这是一个单端交流耦合应用。

    第一步、请检查麦克风信号是否到达 ADC 引脚。 要执行此操作、请在移动电话中通过您的电子管发出1kHz 音调、并靠近麦克风。 然后使用示波器测量 ADC 输入引脚上的直流电压。 您应该会在直流电平上看到一个1kHz 的信号。

    作为第二步、BCLK 和 LRCK 信号的来源在哪里?

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

    1. MIC 已连接至 ADC,

    我们正在使用 TLV320ADC3140对 AM62 SK EVM 进行测试。

    2.来自外部时钟发生器 IC 的 BCLK、LRCLK。

    今天、我们的团队从客户和 TI 获得了一些补丁。

    此补丁适用于自定义原型。

    补丁让 McASP 可以接收 extclk、而 devicetree 需要将 McASP 设置为主控方。

    此设置让 McASP 强制低于设置

    案例 SND_SOC_DAIFMT_BC_FC:
    /*编解码器是时钟和帧主器件*/
    McASP_CLR_BITS (McASP、Davinci_MCASP_ACLKXCTL_REG、ACKXE);
    McASP_CLR_BITS (McASP、Davinci_MCASP_TXFMCTL_REG、AFSXE);

    McASP_CLR_BITS (McASP、Davinci_MCASP_ACLKRCTL_REG、ACKRE);
    McASP_CLR_BITS (McASP、Davinci_MCASP_RXFMCTL_REG、AFSRE);

    /* BCLK */
    CLEAR_BIT (PIN_BIT_ACLKX、&McASP->Pdir);
    CLEAR_BIT (PIN_BIT_ACLKR、&McASP->Pdir);
    /*帧同步*/
    CLEAR_BIT (PIN_BIT_AFSX、&McASP->Pdir);
    CLEAR_BIT (PIN_BIT_AFSR、&McASP->Pdir);

    McASP->BCLK_MASTER = 0;
    中断;

    所以、这里只有一个方面。

    我们需要将 TLV320ADC3140配置为从器件、DOUT 应输出 TDM 数据。

    现在、下面是 i2c 寄存器表。

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

    e2e.ti.com/.../TEST_5F00_4ch_5F00_single_5F00_ended.cfg

    我包含一个具有适用于4通道单端 ADC 的 I2C 设置的文件。 请检查

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

    我们取得了创纪录的成功。

    根本原因: 某些返工会导致电路板损坏并更改 McASP 寄存器  

    感谢大家的帮助!

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

    很棒