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.

[参考译文] SRC4382:I2C 写入问题

Guru**** 2470720 points
Other Parts Discussed in Thread: SRC4382, SRC4392

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

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/1227635/src4382-i2c-write-issue

部件号:SRC4382
主题中讨论的其他器件: SRC4392

我在通过 I2C 写入 SRC4382寄存器时遇到了一个奇怪的问题。

要配置寄存器、我要使用 i2c-tools 应用。
第一次写入到页选择寄存器0x7f 0x00 (用于配置控制和状态寄存器)

读回该寄存器、该值对应于配置的值(同样、如果页选择值 配置为不同于0x00的值)

之后、我向寄存器0x01写入0x3F 值以退出断电状态。

读回该寄存器时、该值保留为0x00。

所有寄存器都发生该问题、除了0x7F 和0x00 (数据表中的  寄存器已声明为保留寄存器)。

您对原因有什么了解吗?我可以检查什么?
我已经研究了 I2C 总线、似乎这不是 I2C 信号上的任何模拟或协议问题。

NB:I2C 总线以40KHz 的频率运行。

谢谢

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

    您好,感谢您与我们联系。 您的 I2C 总线正常、处于范围内。 关于断电和复位、数据表内容如下:

    复位初始化时、SRC4382的所有功能块默认为断电状态、SPI 或 I 2 C 主机接口和相应的控制寄存器除外。 然后、用户可以将 SRC4382编程为所需的配置、然后利用控制寄存器0x01中的相应位将所需的功能块从断电状态释放。

    因此 、基于上述、应使用以下顺序来初始化 SRC4382。

    1.接通电源并进行外部复位。

    2.写入第0页上除寄存器0x01外的所有控制寄存器

    3.应用 MCLK,以及端口 A 和 B 所需的任何音频时钟

    4.写入第0页上的寄存器0x01、为所需的块上电。

    可以是示例代码  

    #主设备重置 SRC (48kHz)

    #第0页=控制的默认值

    #写至第0页

    W E0 7F 00

    d 100

    W E0 01 80    #寄存器01、位7 = 1复位为默认值

    d 100         #延迟0.1秒以允许部件重置

    W E0 01 00    #寄存器01、位7 = 0、用于正常操作

    d 100

    五颗星   为所有寄存器添加所有指令、然后使用 reg 01启用所需的函数块、例如  

    ...

    W E0 03 20  # I²S 端口 A:时钟从器件、24位音频 MSB、接收器输出信号-而非 SRC
    W E0 04 00  # I²S 端口 A:MCLK 源= MCLK;MCLK 频率= 128x LRCLK (除128x 外的 MCLK 频率、仅用于主模式运行)

    ...

    ...

    **** 然后启用所需的块。 等等  

    w E0 01 37 //打开 SRC、接收器、发送器、I²S 端口 A

    此致、

    Arash

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

    你好,谢谢你的回复。 我对寄存器回读的可能性有点困惑。
    出于什么原因、读回寄存器(在写入之后)内容似乎处于默认值?
    请参阅下面的屏幕截图:外部复位后、我读取所有寄存器值(它们处于默认值)
    之后我写入您建议的寄存器、但在接下来的寄存器转储中、值没有改变。 我不认为这是正常的行为、对吧? 此外、似乎在对寄存器进行编程后、SRC4382不会检测到 AES 输入(LOCK 和 READY LED 熄灭)
    注意:我需要在主模式下使用 SRC4382并且只接收、这样我就不会在 I2S 端口"A"上应用任何外部信号(我希望有 SRC4382输出 I2S 信号)。

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

    您好!

    如果您可以更改页码并可以读回、则 I2C 正常工作、 以 确认您是否正在写入寄存器、您可以监控 I2C 信号并验证正在 发生确认。

    我认为您很可能仍然要将寄存器重置为其默认配置。 请确保不要意外重置寄存器。 同时切换到另一页、并尝试在其他页上写入和读取、看看会发生什么情况。

    下面是一个完整的示例脚本、用于初始化应该可以正常工作的器件(我假设您的 IC 地址正确)

    1.接通电源并进行外部复位。

    2.写入第0页上除寄存器0x01外的所有控制寄存器

    3.应用 MCLK,以及端口 A 和 B 所需的任何音频时钟

    4.写入第0页上的寄存器0x01、为所需的块上电。

    5.通过将寄存器0x08、页0、的 TXBTD 位置1来禁用 DIT 缓冲区传输。

    6.将0x02写入寄存器0x7F 以将第2页设置为活动页。

    7.根据需要将数据写入第2页上的 DIT C 和 U 缓冲区。

    8.将0x00写入地址0x7F 以将第0页设置为活动页。

    9.通过将寄存器0x08、页0中的 TXBTD 位设置为0来启用 DIT 缓冲区传输。
    这将使用写入第2页寄存器的数据更新 DIT TA 缓冲区。

    实现上述功能的示例:

    1.外部复位

    2.在第0页设置控制寄存器(始终先设置寄存器地址、然后设置数据[十六进制的所有值])

    w e0 7f 00 //设置寄存器页0
    w e0 03 20 // I²S 端口 A:时钟从器件、24位音频 MSB、来自接收器的输出信号-不是来自 SRC
    w e0 04 00 // I²S 端口 A:MCLK 源= MCLK;MCLK 频率= 128x LRCLK (除128x 外的 MCLK 频率、仅用于主模式运行)
    w e0 07 00 //时钟启动输出;发送器 MCLK 分频器=> FPGA CLK / 128
    w e0 09 01 //通过 SPI 更新发送器通道状态
    w e0 0d 00 //接收器输入=> RX1、参考 CLK RXCKI (外部)
    w e0 0E 00 //如果没有时钟,接收器静音,外部超时钟 引脚、CLK 分频器= 4
    //根据数据表确定的接收器 PLL 参考时钟(表4、S.60)
    w e0 0F 22.
    w e0 10 00
    w e0 11 00
    //
    w e0 2D 02 // SRC Source ==接收器,参考 CLK FPGA 的架构

    3.启用时钟(MCLK、帧同步、采样时钟)

    4. w e0 01 37 //打开 SRC、接收器、发送器、I²S 端口 A


    以下是步骤5至9的脚本:


    w e0 08 08 //禁用 DIT 缓冲器传输

    w e0 7f 02 //将页面设置为2

    w e0 2e ee //在第2页的寄存器2e 中写入 ee

    w e0 2f ff //将 ff 写入第2页上的寄存器2f

    w e0 7f 00 //将页面改回0

    w e0 08 00 //启用 DIT 缓冲器传输

    w e0 7f 02 //切换回第2页

    r e0 2e 01 //回读第2页上的寄存器2e

    r e0 2f 01 //回读第2页上的寄存器2f

    w e0 7f 00 //将页面设置为 PAGE 0

    此致、

    Arash

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

    尊敬的 Arash:

    谢谢你的解释,但我仍然有问题... I2C 事务正确(ACK 到达)。  
    读回任何寄存器(0x7F 除外)都会返回0x00、即使之前写入了不同的值也是如此。
    寄存器0x7F 按预期工作(更改该值后读回正确的值)。  监测所有 I2C 事务显示读取/写入命令没有问题。 看起来不会在内部更新寄存器。 硬件连接中可能会出现一些错误? 连接错误或时钟丢失?

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

    大家好、Giuseppe、  

    我  使用 EVM 测试了一个随机脚本(见下文附件)、并且能够 正确写入和读取多个寄存器。 我附上了脚本 、以防您想与脚本一起拍摄。  在此测试中、我仅为器件通电、并通过 I2C 和 PPC3工具发送 I2C 命令。

    脚本为 SRC4392_STATUS_I2C.txt:  

    e2e.ti.com/.../SRC4392_5F00_STATUS_5F00_I2C.txt

    由于您已确认 I2C 会发送确认、并且您可以更改寄存器0x7f、 在我看来 I2C 工作正常。

    您是否曾尝试过使用 PPC3进行器件编程(我使用过它、您可以从 TI.com 免费获取)、  

     最后、您是否更换了 器件、只是为了验证它不是器件问题?   


     此致、

    Arash