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.

[参考译文] CC3200MOD:I2S 在禁用和启用后出现失真

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/837252/cc3200mod-i2s-has-distortions-after-disabling-and-enabling

器件型号:CC3200MOD

您好!

我通过 CC3200 ind DMA Ping Pong 模式上的 I2S 接口从 SD 卡播放.WAV 文件。
为了延长电池使用寿命、我现在必须在没有音频播放时禁用 I2S、
因为放大器将进入睡眠模式。

当 I2S 首次初始化且 WAV 文件播放时、无论音频流持续多长时间、一切都能正常工作。
但当 I2S 再次被禁用并使能时、TH E SOUND 有很多失真、例如滴答噪声。

我发送的数据与禁用 I2S 之前的数据相同。
 初始时、我通过以下方式激活 I2S 功能:
 

MAP_PRCMPeripheralClkEnable (PRCM_I2S、PRCM_RUN_MODE_CLK);//启用外设时钟
MAP_PRCMPeripheralReset (PRCM_I2S);

UDMAChannelSelect (UDMA_CH5_I2S_TX、NULL);//初始化 I2S 的 UDMA 

 这是我用于启用 I2S 的代码:
 

HWPinMapping::SetI2SClk (此-> ClkPin);
HWPinMapping::SetI2SSX (此-> SXPin);
HWPinMapping::SetI2STXData (此->数据引脚);

MAP_I2SIntRegister (I2S_base、此->中断调度程序);
MAP_I2SIntEnable (I2S_base、I2S_INT_XDATA);
MAP_I2SSerializerConfig (I2S_base、I2S_DATA_LINE_0、I2S_SER_MODE_TX、 I2S_INACT_LOW_LEVEL);

MAP_I2STxFIFOEnable (I2S_BASE、16、1);
MAP_PRCMI2SClockFreqSet (此->位时钟);
MAP_I2SConfigSetExpClk (I2S_base、此->位时钟、此->位时钟、I2S_SLOT_SIZE_16 | I2S_PORT_DMA);
I2SIntClear (I2S_BASE、 I2S_INT_XDATA);
MAP_I2SEnable (I2S_BASE、I2S_MODE_TX_ONLY); 

此代码用于禁用 I2S

MAP_I2SDisable (I2S_base);
MAP_I2SIntDisable (I2S_base、I2S_INT_XDATA);
MAP_I2SIntUnregister (I2S_base);
MAP_I2SIntClear (I2S_base、 I2S_INT_XDATA);
MAP_I2STxFIFODisable (I2S_base);
UDMAStopTransfer (UDMA_CH5_I2S_TX | UDMA_PRI_SELECT);
UDMAStopTransfer (UDMA_CH5_I2S_TX | UDMA_ALT_SELECT);

HWPinMapping:::SetClkPin (此)
HWPinMapping::SetPulldown (此-> SXPin);
HWPinMapping::SetPulldown (此-> DataPin); 

我已经尝试了所有我想到的东西、但无法解决...
启用或禁用 I2S 是否存在任何已知问题、或者在启用/禁用后是否必须清除某个寄存器?

我还尝试了 MAP_PRCMPeripheralReset (PRCM_I2S);但也没有显示任何有效。


此致。

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

    您好!

    我将其发送给了一名相关的工程师。 我们会尽快回复您。 请多多包涵。

    谢谢、

    PM

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

    您好!

    您能否探测 I2S 线路并查看要发送的数据?

    此外、您能否尝试仅禁用 I2S、然后重新启用而不重新设置中断? 还可以尝试仅禁用 I2S 时钟并重新启用它。

    最棒的

    Vince  

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

    您好、Vince、

    经过进一步调查后、我发现了问题。

    禁用/启用 I2S 后、我使用主缓冲器中的第一个数据块启动 DMA、
    备用缓冲器中的第二个块、其余块在 ISR 中完成。
    问题甚至是我停止了 DMA、pingpong 仍然使用它停止的块、
    这意味着、如果禁用前最后一个发送的块是主缓冲器、
    它开始使用备用缓冲器进行传输。

    在我的案例中、这会导致整个传输的开关块。

    现在、我在初始化 DMA 时传输两个零块、并在 ISR 在线设置真实数据块。
    这样、无论首先读取哪个缓冲区、顺序都是正确的。
    这两个零块在开始时非常短、以至于它们非常明显。

    也许您知道如何将 DMA 设置为从主缓冲区开始、但我的解决方案已经准备就绪、可以满足我的需求。

    此致。