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);
}
需要技术支持可以联系13554256038(+V) 确保I2S的硬件连接正确。特别注意I2S的时钟信号和数据信号的连接。 检查DMA的中断配置及I2S和DMA的配置 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
对照例程在检查一下代码吧
哪个例程?你可以测试下你的例程? 如果是I2S中断例程,我测试也ok。 如果是其它外设的DMA例程。也没问题。
然而,I2S的DMA就没有例程。
我不确定小华的I2S用DMA是否需要第三方(TIM)的触发。 从其它MCU的使用经验来说,是不需要其它辅助的, 本身I2S就提供了触发时序。但是在我的测试中并不能正常使用DMA。
正常来说,SDK中应该提供I2S的DMA使用例程,但实际上没有。我不清楚是否I2S有硬件bug,或者某些问题,导致你们的工程师也搞不定使用DMA来传输I2S?
页:
[1]