Sam131208 发表于 2023-12-4 17:20

hc32l073 的 i2s DMA功能不正常

本帖最后由 Sam131208 于 2023-12-5 10:32 编辑

   hc32l073 的 i2s DMA功能完全没有反应。 配置的引脚没有信号,DMA中断也没有进入。

static void start_dma(struct i2s_stream_t *stream, const void *src, uint16_t blk_size)
{
    stc_dma_cfg_t stcDmaCfg;

    Sysctrl_SetPeripheralGate(SysctrlPeripheralDma,TRUE);      //´ò¿ªDMAʱÖÓ

    DDL_ZERO_STRUCT(stcDmaCfg);                              //½á¹¹Ìå±äÁ¿ÖµÇåÁã
    stcDmaCfg.enMode =DmaMskBlock;                           //Ñ¡Ôñ¿é´«Êä
    stcDmaCfg.u16BlockSize = 0x01;                           //¿é´«Êä¸öÊý
    stcDmaCfg.u16TransferCnt = blk_size;                     //¿é´«Êä´ÎÊý£¬Ò»´Î´«ÊäÊý¾Ý´óСΪ ¿é´«Êä¸öÊý*BUFFER_SIZE
    stcDmaCfg.enTransferWidth = DmaMsk16Bit;                   //´«ÊäÊý¾ÝµÄ¿í¶È£¬´Ë´¦Ñ¡Ôñ×Ö(16Bit)¿í¶È
    stcDmaCfg.enSrcAddrMode = DmaMskSrcAddrInc;                //Ô´µØÖ·×ÔÔö
    stcDmaCfg.enDstAddrMode = DmaMskDstAddrFix;                //Ä¿µÄµØÖ·×ÔÔö
    stcDmaCfg.enDestAddrReloadCtl = DmaMskDstAddrReloadEnable; //½ûÖ¹ÖØÐ¼ÓÔØ´«ÊäÄ¿µÄµØÖ·
    stcDmaCfg.enSrcAddrReloadCtl = DmaMskSrcAddrReloadEnable;//½ûÖ¹ÖØÐ¼ÓÔØ´«ÊäÔ´µØÖ·
    stcDmaCfg.enSrcBcTcReloadCtl = DmaMskBcTcReloadEnable;   //½ûÖ¹ÖØÐ¼ÓÔØBC/TCÖµ
    stcDmaCfg.u32SrcAddress = (uint32_t)src;                                    //Ö¸¶¨´«ÊäÔ´µØÖ·
    stcDmaCfg.u32DstAddress = (uint32_t)(void*)&((M0P_I2S_TypeDef *) stream->dev)->DRL;//Ö¸¶¨´«ÊäÄ¿µÄµØÖ·
    stcDmaCfg.enRequestNum = DmaI2S1LeftTrig;                  //ÉèÖÃΪÈí¼þ´¥·¢
    stcDmaCfg.enTransferMode = DmaMskOneTransfer;            //dma´«ÊäÒ»´Î£¬DMAC´«ÊäÍê³ÉʱÇå³ýCONFA:ENSλ
    stcDmaCfg.enPriority = DmaMskPriorityFix;                  //¸÷ͨµÀ¹Ì¶¨ÓÅÏȼ¶£¬CH0ÓÅÏȼ¶ > CH1ÓÅÏȼ¶
    Dma_InitChannel((en_dma_channel_t)stream->dma, &stcDmaCfg);

    Dma_EnableChannelIrq((en_dma_channel_t)stream->dma);       //´«Êä³É¹¦Íê³Éʱ²úÉúÖжÏ
    EnableNvic(DMAC_IRQn,IrqLevel3,TRUE);         //NVIC¶ÔÓ¦DMACÖжÏλʹÄÜ   

    Dma_ClrStat((en_dma_channel_t)stream->dma);
    Dma_Enable();                                  //ʹÄÜDMA
    Dma_EnableChannel((en_dma_channel_t)stream->dma);          //ʹÄÜDmaCh1
      
    I2S_Cmd((M0P_I2S_TypeDef *) stream->dev, ENABLE);
    I2s_ConfDma((M0P_I2S_TypeDef *) stream->dev, I2S_LDMA_EN, ENABLE);
}

只是个新人- 发表于 2023-12-4 17:41

需要技术支持可以联系13554256038(+V)

duo点 发表于 2023-12-7 15:03

确保I2S的硬件连接正确。特别注意I2S的时钟信号和数据信号的连接。

duo点 发表于 2023-12-7 15:04

检查DMA的中断配置及I2S和DMA的配置

Sam131208 发表于 2023-12-8 15:57

duo点 发表于 2023-12-7 15:04
检查DMA的中断配置及I2S和DMA的配置
DMA中断功能正常(改用软件触发正常进入中断)。
DMA触发修改为定时器触发,用TIM2发出48KHz触发,DMA正常工作,但是只有时钟信号,SD信号和WS信号没有输出。能说明I2S配置没有问题吧。另外,I2S配置,基本和例程一样。只是增加I2s_ConfDma()函数的使用。
   如果你是技术支持, 可以在例程(HC32L07x_DDL_Rev1.2.0\example\i2s\i2s_i2c1_play_44k1)里面修改为DMA,测试正常,再发出来吗?

chenjun89 发表于 2023-12-8 18:45

对照例程在检查一下代码吧

Sam131208 发表于 2023-12-16 17:22

chenjun89 发表于 2023-12-8 18:45
对照例程在检查一下代码吧

哪个例程?你可以测试下你的例程? 如果是I2S中断例程,我测试也ok。 如果是其它外设的DMA例程。也没问题。
然而,I2S的DMA就没有例程。
我不确定小华的I2S用DMA是否需要第三方(TIM)的触发。 从其它MCU的使用经验来说,是不需要其它辅助的, 本身I2S就提供了触发时序。但是在我的测试中并不能正常使用DMA。
正常来说,SDK中应该提供I2S的DMA使用例程,但实际上没有。我不清楚是否I2S有硬件bug,或者某些问题,导致你们的工程师也搞不定使用DMA来传输I2S?
页: [1]
查看完整版本: hc32l073 的 i2s DMA功能不正常