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.

[参考译文] TLV320AIC3106:在运行时写入寄存器

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

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/1037913/tlv320aic3106-write-to-registers-at-runtime

器件型号:TLV320AIC3106
主题中讨论的其他器件:TMS320C6748OMAP-L138REG102

您好!

我有一个与我打开的另一个主题相关的问题:

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/1031331/tmdslcdk6748-pop-noises-on-example-usb_devaudio_lcdkomapl138_c674x

我正在使用 USB 音频示例来实现我们的音频处理算法、但首先我必须消除示例中的噼啪噪声。 产生噼啪噪声的原因是 USB 时钟与编解码器时钟之间的同步不良

我正在尝试实现 一个与线程中提到的 SysCtlI2SMClkAd正义(int iMClkAd正义)相似的函数。 但是、该函数使用过时的宏并定义 驱动程序中不再存在的宏。

我的想法是在编解码器内搜索 PLL 的当前值、并在每个 USB 回调迭代中稍微改变它们、这与 SysCtlI2SMClkAdJust 函数的描述相似。 但我尝试使用编解码器的 i2c 实现它(如 CodecRecWrite 或 CodecRegRead)、我不确定这是不是正确的实现方式。 您能给我一些关于此问题的提示吗?

提前感谢、

Jpom

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

    您好!

    在数据表的10.3.2节中、开始讨论如何从时钟生成不同音频格式的音频接口。

    https://www.ti.com/lit/ds/symlink/tlv320aic3106.pdf?ts=1632170828749&ref_url=https%253A%252F%252Fwww.ti.com%252Fproduct%252FTLV320AIC3106

    最好了解时钟的生成方式、下面还有一个 Excel 工作表、用于计算时钟和设置。

    一旦理解了这一点、就可以使用第10:6节中的寄存器映射读取或写入相应的寄存器设置。

    这是标准 I2C 接口、如果您需要、以下用户指南中还提供了有关如何配置 IC 的示例:

    https://www.ti.com/lit/ug/slau855/slau855.pdf?ts=1632171100734&ref_url=https%253A%252F%252Fwww.ti.com%252Fproduct%252FTLV320AIC3106

    此致。

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

    您好!

    感谢您的回答。 Excel 非常有用。

    我已经读取了时钟生成部分、我理解我必须巧妙地修改 PLL 值(J、D、P、R)以更改采样率。 我的问题与编解码器的 I2C 通信有关。 I2C 已在函数 I2CCodecIfInit 中初始化并打开:

    void I2CCodecIfInit (unsigned int baseAddr、unsigned int intCh、
    unsigned int slaveAddr)

    I2C_Params i2cParams;
    I2C_HwAttrs McASP_i2c_cfg;
    I2C_slaveAddr =(uint32_t) slaveAddr;
    I2C_init();

    I2C_Params_init (&i2cParams);
    i2cParams.transferMode = I2C_MODE_BLOCKING;

    I2C_socGetInitCfg (I2C_MCBSP_instance、&McASP_i2c_cfg);

    /*如有必要,修改默认 I2C 配置*/
    McASP_i2c_cfg.enableIntr=false;
    /*设置默认的 I2C init 配置*/
    I2C_socSetInitCfg (I2C_MCBSP_instance、&McASP_i2c_cfg);
    I2C_Handle_globb = I2C_open (I2C_MCBSP_instance、&i2cParams);

    I2C 通信打开后、我知道我可以使用 I2C 函数从寄存器发送和读取数据。  下面是我无法接受的内容、我可以通过 USB 回调调用这些 I2C 函数吗? 我们的想法是在每次回调时读取 J、D、P、R 的实际值并略微更改采样率值、然后再次写入这些寄存器。

    我看到、例如、读取寄存器102、我从它获得复位值(0x02)、而不是写入值(0x08)、因此我应该无法读取 J、D、R、P 的实际值。 这是我不能得到的。  

    感谢您的 tme

    日文

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

    您好!

    由于有多个寄存器页、您需要指定事务的页。

    我附上了一个在第0页的寄存器6中写入值5到"J"时的事务示例。

    您可以探测 I2C 线路并像所连接的那样检查事务。

    e2e.ti.com/.../I2C-Example.pptx

    此致。

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

    您好!

    由于此器件有多个寄存器页、因此您需要在寄存器本身后面指定页码。

    我在下面附上了一个交易示例、其中向 J 写入了值5。

    e2e.ti.com/.../0257.I2C-Example.pptx

    尝试探测 I2C 线路、以确保格式和事务正确。

    此致。

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

    您好!

    再次感谢您的回答。 我在读取寄存器之前尝试选择了页面、但读取的值仍然不正确。

    顺便说一下,在我的编解码器(aic3106)寄存器6中,是用于 D 值,而不是 J

    我认为问题可能在其他地方。

    此致、

    日文

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

    您好!

    相应地更改寄存器、因为我提供的是 I2C 事务的一个示例。

    您希望使用示波器/分析仪(如 Saleae)查看 I2C 信号、并确保格式正确、并且器件会按照我在上面提供的内容对事务进行应答。 然后、您可以从此处了解交易是否成功。

    此致。

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

    您好!

    感谢您的回答。 我尝试读取信号、但在示波器中看不到任何内容。 我将使用示例(CodecRegWrite 或 CodecRegRead)中提供的相同函数在寄存器中进行写入/读取、该示例使用 I2C 库来执行事务。 我仍然认为问题是我调用这些函数时、I2C 事务应该是正确的。

    此致、

    日文

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

    您好!

    我不熟悉  TMS320C6748器件、但从 AIC3106侧看、这些是 I2C 事务、如果命令配置正确、您应该会在示波器中看到 I2C 跟踪。 让我将此事分配给  TMS320C6748的徐建中、他最初为您提供了此部分的帮助。

    此致。

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

    Jpom、您好!

    如果您不知道、OMAP-L138 PDK 中有 I2C 示例项目。 您可能需要查看 C6748 DSP 上的 I2C 编程示例。  

    此致、

    _________

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

    您好!

    再次感谢。 我阅读了这些示例、但仍然无法理解代码的区别。

    假设我们要从 AIC3106读取寄存器102。

    使用处理程序 I2C_Handle_globb 初始化并打开 I2C、然后在主模式下工作、我们可以:


    unsigned char writebuf[1];
    I2C_Transaction i2cTransaction;

    regAddr = AIC31_P0_REG102 ;//我们要读取寄存器102 (例如)

    slaveData[0]= regAddr;

    //此处,我们必须发送 I2C 消息,其中 i2c 从机的地址作为'Address'字段,寄存器地址作为数据

    writebuf[0]= slaveData[0];  

    //我们使用默认值初始化事务
    I2C_TransactionInit(&i2cTransaction);

    // 1. 首先、我们设置要发送的 I2C 消息

    //使用从地址覆盖默认地址
    i2cTransaction.slaveAddress = I2C_slaveAddr;

    //将寄存器地址写入从器件
    i2cTransaction.writeBuf =(uint8_t *)&writebuf[0];

    //要写入的字节数
    i2cTransaction.writeCount = 1;

    //读取 缓冲区以存储从器件的应答
    i2cTransaction.readBuf =(uint8_t *)&slaveData[0];

    //从从从器件读取一个字节
    i2cTransaction.ReadCount = 1;  

    // 2. 发送 I2C 消息
    i2C_transfer (I2C_Handle_globb、&i2cTransaction);

    很抱歉、所有代码和示例都是这样做的。 我需要有关如何处理 i2c 交易的更多详细信息。 我仍然认为在 USB 回调中设置这个时会出现问题(此时我无法直接使用 I2C 函数、因为处理程序已在 codec_if.c 文件中声明、所以我使用 CodecRegWrite 和 Read 函数)

    此致、

    日文

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

    您好!

    我意识到我的实施是正确的。 问题是、由于 MCASP_MASTER 定义、编解码器未按我的预期用作主器件。 因此、它从未为采样率设置这些值。 因此、寄存器中的值是复位值。 现在、我尝试将编解码器用作主器件、以便我可以在运行时调整 PLL。

    您可以关闭该主题、感谢您的帮助!

    此致、

    日文

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

    尊敬的 JP:

    感谢您的更新。 我将关闭该线程。

    此致、

    _________