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.

[参考译文] TLV320AIC3256:难以读取 miniDSP-D 系数寄存器

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

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/1368221/tlv320aic3256-difficulty-reading-minidsp-d-coefficient-registers

器件型号:TLV320AIC3256

工具与软件:

尊敬的 TI:

我正在参与一个将 ESP32-S3微型模块与 TLV320AIC3256配合使用的项目。 一般情况下、工作做得很好。 我可以将 PurePath 生成的项目下载到 AIC3256、项目运行良好。 当我尝试将系数写入 miniDSP-D 时、一切都运行正常。 请注意、我使用自适应模式、并开发了一种算法来使两个系数组都保持最新。 现在、我将尝试回读系数。 具体来说、我已将 specANA_TI_V1配置为 VU 仪表、并希望从中读取 VU 值。 我已经 在 TLV320AIC3256EVM-U 板上测试了 specANA_TI_V1作为 VU 仪表、它运行正常。 我已经通过 I2C 端口将我的项目(板/固件)连接到 PurePath Studio、并且确保 PurePath 能够读取我电路板上的 VU 系数。 但是、当我尝试使用 ESP32-S3读取系数时、得到的数据不正确。 (看起来我读取的是第0x00页、而不是第0x2D 页)。

基本算法如下:

  1. 插拔 miniDSP-D 缓冲器
  2. 选择 VU 系数页面  
  3. 选择 VU 系数开始寄存器
  4. 读回四个字节。

我连接了一个 Saleae 并跟踪了 ESP32-S3事务:我可以验证 I2C 总线上确实存在不正确的数据。 我还使用 PurePath Studio I2C 存储器工具生成了 Saleae 跟踪、以交换缓冲区并回读系数。 它可以正常工作、但似乎要做的远不止必要。 然而、有一点确实很突出:它并不是单次读取 VU 系数的四个字节、而是为每个 I2C 读取设置地址、然后每次读取一个字节。 为什么会这样呢? 从我的读数来看、似乎在 AIC3256 I2C 读取/写入中有一个自动递增函数。

我现在的计划是在 ESP32-S3上尽可能地复制 PurePath Studio 过程。 但我不知道为什么这是必要的。 是否有某种文档概述了如何从 AIC3256进行系数读取? 也许有人可以看看我的 Saleae 轨迹,告诉我为什么需要每一个交易——在某些情况下,PurePath Studio 在做什么?

感谢您的帮助。

奥地利广播电视公司

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

    您好、ACV:

    在我进行研究时、您可以在 Saleae 上共享您的 I2C 事务吗? 对于错误数据是否有任何明显的模式(例如数据出现按 x 地址移动)、是否全部为0、是否是垃圾数据?

    谢谢。
    J·麦克弗森

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

    e2e.ti.com/.../6232.ti.zip

    这些截图使用 PurePath Studio 中的 TI I2C 存储工具通过 I2C 读取电路板。 这些是工作事务...

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

    e2e.ti.com/.../rev_2D00_c_5F00_swap_2600_read.zip

    下面是我尝试交换缓冲区的代码(看起来有效)并读取四个字节(看起来无效)。

    设置对我来说似乎是正确的。 我做错了什么?

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

    尊敬的 Anthony:

    我想把目光投向了您的代码。 我已经将它翻译成了下面的脚本。 我的解读是否正确? 我看到2C 和2D 之间有很多页交换、但写入这些寄存器的次数不多。 似乎您想要从2D 页读取缓冲区、但没有对该缓冲区进行写入操作。 只在页2C 中进行写入。

    交换读取(ESP32-S3)
    W 0x30 00 2C #页更改为2C
    R 0x30 01 01 #返回0x06
    W 0x30 00 2C #页更改为2C
    W 0x30 01 07 #
    W 0x30 00 2D #页更改为2D
    R 0x30 40 04 #返回0x80、0x00、0x00、0x00
    W 0x30 00 2C #页更改为2C
    R 0x30 01 01 #returns 0x04
    W 0x30 00 2C #页更改为2C
    W 0x30 01 05 #
    W 0x30 00 2D #页更改为2D
    R 0x30 40 04 #返回0x80、0x00、0x00、0x00
    W 0x30 00 2C #页更改为2C
    R 0x30 01 01 #返回0x06
    W 0x30 00 2C #页更改为2C
    W 0x30 01 07 #
    W 0x30 00 2D #页更改为2D
    R 0x30 40 04 #返回0x80、0x00、0x00、0x00

    即使仔细查看 PPS 的 rev-c_swap 序列、我也看不出交换发生的位置。 我看到切换页面和几次写入、但没有类似于交换整个缓冲区的内容。 您可以帮助您澄清一下希望在这些代码序列中发生交换的地方吗?

    谢谢!
    J·麦克弗森

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

    # swap
    w 0x30 00 2C # page change to 2C 
    r 0x30 01 01 # read DAC Adaptive Filter Configuration Register (returns 0x06) 
    w 0x30 00 2C # page change to 2C (not required)
    w 0x30 01 07 # or in DAC Adaptive Filter Buffer Switch control bit
    
    # read coefficient 0x002c -- this is page 0x2d, register 0x40 
    w 0x30 00 2D # page change to 2D (select coefficient page)
    r 0x30 40 04 # returns 0x80, 0x00, 0x00, 0x00 (Read coefficient)
    
    # swap
    w 0x30 00 2C # page change to 2C
    r 0x30 01 01 # read DAC Adaptive Filter Configuration Register (returns 0x04)
    w 0x30 00 2C # page change to 2C
    w 0x30 01 05 # or in DAC Adaptive Filter Buffer Switch control bit
    
    # read coefficient 0x002c -- this is page 0x2d, register 0x40 
    w 0x30 00 2D # page change to 2D
    r 0x30 40 04 # returns 0x80, 0x00, 0x00, 0x00
    
    # swap
    w 0x30 00 2C # page change to 2C
    r 0x30 01 01 # returns 0x06
    w 0x30 00 2C # page change to 2C
    w 0x30 01 07 # or in DAC Adaptive Filter Buffer Switch control bit
    
    # read coefficient 0x002c -- this is page 0x2d, register 0x40 
    w 0x30 00 2D #page change to 2D
    r 0x30 40 04 #returns 0x80, 0x00, 0x00, 0x00
    

    我已将您的脚本注释注释。 以下是工作原理:

    此代码显示了 三个完整的交换/读取迭代。 由于这是 VU 仪表、因此我希望定期读取 VU 数据。

    第一个操作是交换。 这需要四个 I2C 事务:代码读取 DAC 自适应滤波器配置寄存器(0x2C)或 DAC 自适应滤波器缓冲区开关控制位(0x01)中的、并将字节写回  DAC 自适应滤波器配置寄存器 (0x2C)。 有一个冗余写入用于选择 DAC 自适应滤波器配置寄存器。

    第二个操作是读取。 这将处理两个 I2C 事务:代码从 DAC 系数存储器中读取系数0x2C。 请注意、这是一个系数。 它的地址必须转换为 I2C 页/寄存器对。 在本例中为页:0x2D 和寄存器0x40。 选择页和寄存器后、代码将读取这四个字节。 此数据不正确。 我希望它是 VU 数据、而不是常数0x80 0x00 0x00。

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

    尊敬的 Anthony:

    感谢您的解释。 它现在是有道理的。 如何确保在尝试读取之前等待到下一帧边界?

    我还注意到在 i2c 图中、PPS 的代码正在使用启动/停止读取、即每次读取一个字节的系数。 但您的代码正在尝试在一个事务中读取整个系数。 这也会调用读取寄存器0x51、这很奇怪。 在我处理事务解码时、您的控制器是否可以使用启动/停止读取模式而不是顺序读取模式? 我知道这听起来很奇怪、通常顺序读取更好、但我认为我们应该尽量接近 PPS、因为它看起来工作正常。

    此致、
    J·麦克弗森

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

    Jeff、

    我已经解决了这个问题。

    我添加了几个函数来读取越来越多的数据、并且我意识到读取工作正常。 问题与多个线程访问同一外设有关。 目前、该代码无法防止 多个线程同时访问 AIC3256。

    感谢您的帮助!

    奥地利广播电视公司