打印
[技术问答]

hc32l073 的 i2s DMA功能不正常

[复制链接]
611|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Sam131208|  楼主 | 2023-12-4 17:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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 | 只看该作者
需要技术支持可以联系  135  5425  6038(+V)

使用特权

评论回复
板凳
duo点| | 2023-12-7 15:03 | 只看该作者
确保I2S的硬件连接正确。特别注意I2S的时钟信号和数据信号的连接。

使用特权

评论回复
地板
duo点| | 2023-12-7 15:04 | 只看该作者
检查DMA的中断配置及I2S和DMA的配置

使用特权

评论回复
5
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,测试正常,再发出来吗?

使用特权

评论回复
6
chenjun89| | 2023-12-8 18:45 | 只看该作者
对照例程在检查一下代码吧

使用特权

评论回复
7
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?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

91

帖子

0

粉丝