[技术问答] hc32l073 的 i2s DMA功能不正常

[复制链接]
1477|6
 楼主| Sam131208 发表于 2023-12-4 17:20 | 显示全部楼层 |阅读模式
本帖最后由 Sam131208 于 2023-12-5 10:32 编辑

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

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

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

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

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

  23.     Dma_ClrStat((en_dma_channel_t)stream->dma);
  24.     Dma_Enable();                                  //ʹÄÜDMA
  25.     Dma_EnableChannel((en_dma_channel_t)stream->dma);          //ʹÄÜDmaCh1
  26.         
  27.     I2S_Cmd((M0P_I2S_TypeDef *) stream->dev, ENABLE);
  28.     I2s_ConfDma((M0P_I2S_TypeDef *) stream->dev, I2S_LDMA_EN, ENABLE);
  29. }


只是个新人- 发表于 2023-12-4 17:41 | 显示全部楼层
需要技术支持可以联系  135  5425  6038(+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?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

131

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部