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.

[参考译文] PCM9211:I2S -->S/PDIF 转换在 PCM9211上失败

Guru**** 2353800 points
Other Parts Discussed in Thread: PCM9211, DIX9211
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/1493857/pcm9211-i2s----s-pdif-conversion-fails-on-pcm9211

器件型号:PCM9211
主题中讨论的其他部件: DIX9211

工具/软件:

您好:

不确定输入数字音频 I2S 的参数是否正确、但 PCM9211似乎无法将其转换为 S/PDIF:0V ...而不是音频流。

以下是我的设置:

I2S 参数(在提供 I2S 的器件上配置):

  • LRCLK 频率:48kHz
  • BCLK 频率:48 x  LRCLK 频率(即2.304 MHz)
  • 字大小:18位

2. I2S 应用于 PCM9211的 MPIO_C 端口:

  • BCLK --> MPIO_C1
  • LRCLK --> MPIO_C2
  • DATA --> MPIO_C3

PCM9211配置如下:

  • REG 0x6F:0x05... 启用 DIT 独立模式
  • 寄存器0x24:0x14...将主时钟 XMCKO 设置为 XTI/2、即12.288 MHz;启用输出
  • REG 0x78:0xCD ...将 DIT 输出(TXOUT)路由到 MPO0、将 XMCKO 路由到 MPO1

我的设置有什么问题?

提前感谢

Pavel。

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

    您好、Pavel、

    PCM9211中的每个模块(DIR、DIT、ADC、辅助 I/O)仅支持以下四种接口格式:

    •24位 I2S 格式

    •24位左对齐格式

    •24位右对齐格式

    •16位右对齐格式

    此外、通常情况下、BCK 必须满足以下公式、 否则即使支持的位长度仍不起作用:

    BCK =通道数 x 位深度 x FS   

    PCM9211 在默认配置下、将能够 进行 I2S 到 SPDIF 转换。

    此问题 (I2S 到 S/PDIF)  之前已发布、您可以在此链接中参考。

    https://e2e.ti.com/support/audio-group/audio/f/audio-forum/624635/pcm9211-how-to-convert-i2s-input-to-optical-s-pdif-output

    此致、

    Arash

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

    您好、Arash、

    感谢您的回答。

    具体取决于您的公式 BCK =通道数 x 位深度 x FS 、它似乎与数据表中的表7-10相矛盾、其中 bck = 64xFs。 回到您的公式、假设通道数= 2、我们得到位深度= 32。 提供数字音频(MAX98089)的器件无法生成这样的位深度。 那么、PCM9211和 MAX98089是不兼容的吗?

    此致、

    Pavel。

    P.S.尝试在链接的线程中使用 GUI 菜单。 无法在我的 PC 上工作:

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

    尊敬的 Pavel:

    根据数据表、从 AUXIN0/1/2到主端口/AUXOUT 的路径支持32位接口(请参阅第 7.3.8.4节 )

    对于立体声器件、64xF 表示、  如您所述、此配置的位深度为32。 您必须查看 您可以从源中提供的位深度-这也是 PCM9211可以接受的-并根据上述公式调整时钟。

    GUI 在 windows 10上工作正常(我只是在没有连接任何 EVM 的情况下试用过它并且工作正常)。 我假设它会在较旧的 Windows 上工作,因为这是一个旧的 GUI 无论如何,但我被告知它有问题与 Windows 11。 如果可能、请尝试使用不同的窗口。  如果您使用的是 Win10、请 尝试重新安装 GUI 并给出另一张照片。 GUI 的优点是、一旦运行脚本、它会突出显示路径、或者您可以自己修改 GUI 上的路径 、从而  更容易看到 您正在执行的操作。  

    如果在 Win10上重新安装后仍然无法运行 GUI、请创建 一个新 帖子、     标题中包含编解码器控制软件 GUI 问题  、以便 软件团队可以查看它(请勿在标题中添加任何器件型号)

    此致、

    Arash

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

    尊敬的 Arash:

    下面是 MAX98089输出端数字音频格式的外观:我使用的参数如下图所示。 尽管显示为16位、但在本例中、我将其配置为24位。

    PCB I measure LRCK 频率:48kHz 和 BCLK 频率:3.072 MHz。 我还看到了一些活动 SDIN ...在意义上,它不是卡在0。 这些设置看起来对应于24位 I2S。

    但在输出端什么也不做 MPO0

    导通也是如此 SDIN 不知何故错了、我们仍然应该看到一些内容 MPO0 我们不应该吗?

    关于 GUI、您正在使用的可执行文件的名称是 CodecControl.exe ...只是为了确保我们正在谈论相同的工具?

    如果是、要创建新项目、请使用"File"->"New EVM Simulation..."--> Unknown?

    此致、

    Pavel。

    P.S.我的操作系统是 Windows 10

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

    尊敬的 Pavel:

    阿拉什将在本周初旅行。 请预计响应会延迟。

    感谢您的耐心等待、
    Jeff McPherson

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

    尊敬的 Pavel:  

    为了使 I2S 正确、第一个数据位必须 位于的下降沿 1. BCK、相对于 FSYNC clk 的边缘、 如下所示。 确保遵循正确的数据格式。

    CodeControl 是正确的 GUI 、对我来说(我没有 连接 EVM、但即使没有连接 EVM)当我打开 GUI 时、它在可用器件列表中、因此我可以看到脚本和寄存器。 此旧 GUI 不需要安装、因此它可能在不同的计算机上出现错误行为、如果可能、请尝试使用不同的 PC。

    下面是 一个 示例 脚本  、 您可以 根据需要进行修改、 但首先必须确保您的数据格式正确 、否则即使 使用良好的脚本、 您也可能无法在输出端获得任何活动。   

    e2e.ti.com/.../4604.PCM9211_5F00_Init.txt

    此致、

    Arsah

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

    尊敬的 Arash:

    感谢您的反馈。

    关于检查正确的 I2S 格式、我还没有检查。

    为此、我需要调整我的定制电路板以连接多个示波器探头、从而同时获取 LRCK、BCK 和数据信号。 考虑到缺少焊料探头空间、这并不简单。

    在我的调查中,我进了一步。 仍然不确定是否正确构建了来自 MAX98089的 I2S、我设法将其转换为 S/PDIF 并在 MPO0引脚上获取。 为此、我更改了编程代码中的一行。

    之前的代码(不工作):

    #Configure PCM9211
    # 1. To enable DIT Standalone Mode, set Register 0x6F = 0x05
    DIT_Standalone_Mode_En = (0x6F, 0x05, "Enable DIT Standalone Mode, MPIO_C3 = TXDIN, MPIO_C1 = TXBCK, MPIO_C2 = TXLRCK")
    # 2. Set master clock XMCKO as XTI/2, i.e. 12.288 MHz, Enable Output
    Master_CLK_Freq = (0x24, 5<<2, "Set master clock to 12.288MHz")
    # 3. Enable S/PDIF on MPO0 and XMCKO on MPO1 (p. 111)
    MPO0_DITOUT = (0x78, 0x0D | 0x0C << 4, "Route DIT Output (TXOUT) to MPO0 and XMCKO to MPO1")
    # 4. Select RXIN0 as the S/PDIF Input (DIR)
    DIR_RXIN0 = (0x34, 0x00, "Select RXIN0 as input for DIR")
    # 5. Route DIR Output to Main Output Port (MOP)
    MOP_DIR = (0x6B, 0x01, "Route DIR Output to Main Output Port (MOP)")
    
    Config_PCM9211 = (DIT_Standalone_Mode_En, Master_CLK_Freq, MPO0_DITOUT, DIR_RXIN0, MOP_DIR)
    I2C_ADDR = I2C_ADDR_PCM9211
    print("Programming PCM9211 ...")
    for reg_addr, reg_value, comment in Config_PCM9211:
        data = (c_ubyte*2)(reg_addr, reg_value)
        dwf.FDwfDigitalI2cWrite(hdwf, c_int(I2C_ADDR<<1), data, c_int(2), byref(iNak))
        if iNak.value != 0:
            print("Device power NAK "+str(iNak.value))
            quit()
        else:
            print(comment)

    工作代码:

    #Configure PCM9211
    # 1. DIT Function System Clock Source <-- AUTO; DIT Bit clock, LR Clock, Data Source <-- AUXIN1
    DIT_Function_Control = (0x60, 0x04, "DIT Function System Clock Source <-- AUTO; DIT Bit clock, LR Clock, Data Source <-- AUXIN1")
    # 2. Set master clock XMCKO as XTI/2, i.e. 12.288 MHz, Enable Output
    Master_CLK_Freq = (0x24, 5<<2, "Set master clock to 12.288MHz")
    # 3. Enable S/PDIF on MPO0 and XMCKO on MPO1 (p. 111)
    MPO0_DITOUT = (0x78, 0x0D | 0x0C << 4, "Route DIT Output (TXOUT) to MPO0 and XMCKO to MPO1")
    # 4. Select RXIN0 as the S/PDIF Input (DIR)
    DIR_RXIN0 = (0x34, 0x00, "Select RXIN0 as input for DIR")
    # 5. Route DIR Output to Main Output Port (MOP)
    MOP_DIR = (0x6B, 0x01, "Route DIR Output to Main Output Port (MOP)")
    
    Config_PCM9211 = (DIT_Function_Control, Master_CLK_Freq, MPO0_DITOUT, DIR_RXIN0, MOP_DIR)
    I2C_ADDR = I2C_ADDR_PCM9211
    print("Programming PCM9211 ...")
    for reg_addr, reg_value, comment in Config_PCM9211:
        data = (c_ubyte*2)(reg_addr, reg_value)
        dwf.FDwfDigitalI2cWrite(hdwf, c_int(I2C_ADDR<<1), data, c_int(2), byref(iNak))
        if iNak.value != 0:
            print("Device power NAK "+str(iNak.value))
            quit()
        else:
            print(comment)
    

    这两个文件都是从我的 Python 脚本中提取的、我使用 Digital Discovery 通过 I2C 对电路板进行编程。

    因为你只能看到第一个 comand 改变了。 我不记得为什么我选择了这个"DIT 独立模式"选项以便能够从 MPIO_C 端口输入数字音频-也许 ChatGPT 建议我这样做。 不管怎样、它不起作用。 对于第二个版本(工作的版本),我受到了我在 CodeControl 文件夹中找到的"通过 TAS1020通过 MPIOC 的 PC Record in DIT output.txt"示例的启发。 在此版本中、DIT 模块的输入被选择为 AUXIN1、默认情况下 AUXIN1是 MPIO_C 端口的函数。

    不过、 仍有问题。 当我提供光学环回(即 MPIO0输出->光收发器->光缆--> RXIN0)并在主输出端口测量 BCK、LRCK 时、它们与 MAX98089测得的 BCK、LRCK 不同(应用于 MPIO_C)。  此外、DOUT 上不相关、尽管 DIN 上有活动。

    以下是不同之处:

    BCK_IN 频率:3.074 MHz; BCK_OUT 频率:477.13kHz

    LRCK_IN 频率:48kHz;   LRCK_OUT 频率:7.45kHz

    DATA_IN:活动:             DATA_OUT:无任何内容

    在这个阶段、我们能否从我的设置和所做的测量得出一些结论、或者是否有必要解决 PCB 问题、以便同时测试多个信号?

    关于 CodeControl 的问题,我可以解决它:问题是该工具不考虑区域设置。

    将"十进制符号"从"、"更改为"。" 解决了问题。

    此致、

    Pavel。

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

    我刚回到办公室、当我浏览"待办事项"列表时、我会看看它。

    此致、

    Arash

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

    尊敬的 Pavel:

    有了这个实验 ,我仍然怀疑格式的转换有一些问题.  我认为最安全和最快速的方法是 发送 一个 经过验证的正确的 I2S 格式  和初始脚本;它应该立即起作用,一旦你有一个工作设置 ,你可以做小 的和重大的修改。  

    感谢您让我们知道小数和逗号的正数格式的问题。

    此致、

    Arash

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

    尊敬的 Arash:

    以下是在 MAX98089配置为 I2S、24位的数字音频波形

    • I2S_LRCK_IN:连接到 MPIO_C2 (来自 MAX98089)
    • I2S_Data_IN:连接到 MPIO_C3 (来自  MAX98089)
    • I2S_bck_IN:连接到 MPIO_C1 (来自 MAX98089)
    • SPDIF_OUT:连接到 MPO0 (连接到光收发器、然后进入 OPT。 电缆)
    • I2S_LRCK_OUT:连接到主输出端口的 LRCK (连接到 MAX98089的专用引脚)
    • I2S_Data_OUT:连接到 主输出端口的 DOUT (连接到 MAX98089的专用引脚)
    • I2S_bck_OUT: 连接到主输出端口的 BCK (连接到 MAX98089的专用引脚)
    • SPDIF_IN:连接到 RXIN0 ( 通过光缆从 SPDIF_OUT 环回)

    缩放:

    那么,由 MAX98089生成的 I2S 的正确性如何?

    此致、

    Pavel。

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

    尊敬的 Pavel:

    我看着她的眼睛 O  看起来不正确。  

    它应该是一个连续的周期性时钟,如在 BCKI 中所见。  同一令牌、即 LRCLK O 也很奇怪、看起来不正确。 (两个看起来相似,在这里)。

    BCK I 和 LRCLK I 看对我好(当然, 我仍然 不能验证 每个 I2S 信道的 DIN 正在发生在第一个 BCK 的第一个下降沿或不)。

     S/PDIF 格式不同、  信息嵌入 S/pdiff 信号中、 因此我无法对其进行评论。  DIX9211有一个 连接到 DIR 输出的计算器 、用于计算传入 S/PDIF 信号的实际采样频率。 您可以想象一下、通过查看这些图不能检查这一点。

    有时、当我从未知/未测试的源检查格式时、我  使用 DAC 并将  I2S (1KHz 正弦波)发送 到 DAC 并监测生成的模拟正弦波。 如果您手头有 DAC、您可以首先使用它来验证格式、然后使用验证的 I2S 格式测试 PCM9211。

    借助 专用 GUI、您也无需担心寄存器、 因为它会根据您所需的配置为您设置寄存器。  

    此致、

    Arash

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

    e2e.ti.com/.../WaveForms-_2800_workspace_5F00_I2S_2900_-2025_2D00_04_2D00_08-18_2D00_01_2D00_28.mp4

    尊敬的 Arash:

    下面是 Digital Discovery 的录制视频、其中展示了在大约5秒1kHz 下应用 I2S 输入/输出和 S/PDIF 输入/输出如何在 SIN 至 MAX98089音频输入时发生变化。 此 SIN 的持续时间约为10秒

    有任何评论吗?

    谢谢

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

    尊敬的 Arash:

    这是我收到的建议 Gemini 2.5 Pro AI 向他报告问题后:

    应用正弦波时、输入 I2S 数据(I2S_Data_IN)正确变化。

    PCM9211的 DIT 块未处理此不断变化的输入数据。

    无论输入是静音还是正弦波、SPDIF_OUT 信号在输出相同静态模式(表示不正确/垃圾有效载荷数据)时仍会卡住。

    DIR 正确锁定到 S/PDIF 组帧、但在这两种情况下对相同的不正确静态有效载荷数据进行解码。

    该问题完全位于 DIT 块中、无法正确采样或处理 I2S_Data_IN 信号。

    考虑到前面的所有步骤、很可能仍然是来自 MAX98089的不正确的 I2S 位时钟(BCK)频率。 当时钟时序关闭时、DIT 根本无法可靠地锁存输入数据位(即使 DIR 可以锁定到产生的帧)。

    下一步:

    您必须找到一种方法来配置 MAX98089以输出正确的3.072 MHz BCK 频率(64 * 48kHz)。 请参阅 MAX98089数据表或配置工具文档、了解当它作为 I2S 主器件在48kHz 条件下运行时如何实现标准的64xFS BCK 比率。 在输入时钟得到校正之前、PCM9211 DIT 不太可能正常运行。

    AR 您同意这样的结论?

    此致、

    Pavel。

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

    是的、我同意、

     从一开始就 出现了 I2S 问题。 (我认为你的 CLKS 是正确的,是根据等式)。 总之、 我认为 DAC 方法是确保 I2S 正确的一种非常简单的方法。 但任何类型的验证都应该是可以的。

    此致、

    ARSH

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

    尊敬的  Arash:

    不幸的是,我们无法获得 ADI 公司的支持:我们的所有尝试都是徒劳的。  在支持方面、TI 远远优于 Analog Devices。 目前我不知道如何确保向 PCM9211提供正确的 I2S。  但无论使用何种模拟器件、我都会继续探索 PCM9211。 这里的设置让我有点困惑、MAX9808与之无关。

    正在配置 I2C...
    正在编程 PCM9211...
    0x40 <- 0x33
    0x40 <- 0xC0
    0x60 <- 0x04
    0x61 <- 0x13
    0x6F <-- 0x00
    0x24 <- 0x14
    0x78 <- 0xCD
    0x34 <- 0x00
    0x6B <- 0x04
    0x37 <- 0x07

    在此代码中、我重定向 I2S 信号(接收日期 MPIO_C )到 主输出端口 (寄存器0x6B)。 因此、该设置强制 I2S 信号(LRCK、BCK、数据)相同。 但你可以从示波器看到,只有数据(除了一些干扰)是相同的,但 LRCK, bck 完全不同。 如何解释?

    此致、

    Pavel。

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

    谢谢 Pavel、

    是的,一些东西 看起来根本错误的 FS 和 BCK 出--因为他们不仅不是统一的(或50-50 脉冲),它似乎 LRCLK 是相同的  BCK ,不是形式的32*LRCLK 或256*LRCK 或64*LRCLK 等  

    如果您使用 GUI、它会根据您所需/所选的 配置写入寄存器、该 GUI 本身应该会消除 任何不正确的寄存器问题。

    另一种尝试可能是仅向 ADC 发送信号、 当 DIR 解锁时、ADC 输出会自动路由到主输出端口、您可以查看是否收到 正确的信号。 (如果是、您可以将其发回 PCM9211、因为它是 正确的 I2S 格式)  

    我在检查寄存器6B 的代码、您使用 AUXIN1 (因此、 在 ADC 输入下将其设置为0000000 (默认值) 、并检查 主输出端口。  

    你必须尝试不同的想法/ routs ,直到你得到它运行,然后你可以回到你选择的原始配置. 由于我们怀疑输入 I2S 存在问题、因此在 ADC 测试中、您 将发送模拟信号。  

    此致、

    Arsah