-
F460的I2S的问题?连接ES8388.
学习了例程i2s_record_and_play。有几个地方没看懂。 void BSP_WM8731_TransCompleteCallBack(void) { if (0U != u8TransCompleteFlag) { BSP_WM8731_Play(&u32TransBuf[1][0], BSP_WM8731_DMA_BLK_LEN); u8TransCompleteFlag = 0U; } else { BSP_WM8731_Play(&u32TransBuf[0][0], BSP_WM8731_DMA_BLK_LEN); u8TransCompleteFlag = 1U; } DMA_ClearTransCompleteStatus(BSP_WM8731_DMA_SDIN_UNIT, BSP_WM8731_DMA_SD_INT_CH); } 发送完成的DMA中断为什么要清楚接收DMA的传送完成标志。 同样接收完成的DMA中断中也清除了发送DMA的传送完成标志。 我的程序是这样的。 /* INT_SRC_DMA1_TC0 Callback.send to I2S */ static void INT_SRC_DMA1_TC0_IrqCallback(void) { //add your codes here if (0U != u8TransCompleteFlag) { BSP_ES8388_Play(&u32TransBuf[0][0], DMACount); u8TransCompleteFlag = 0U; } else { BSP_ES8388_Play(&u32TransBuf[1][0], DMACount); u8TransCompleteFlag = 1U; } // DMA_ClearTransCompleteStatus(CM_DMA1, DMA_INT_TC_CH0); } /* INT_SRC_DMA2_TC0 Callback. */ static void INT_SRC_DMA2_TC0_IrqCallback(void) { //add your codes here if (0U != u8ReceiveCompleteFlag) { BSP_ES8388_Record(&u32ReceiveBuf[0][0], DMACount); // (void)memcpy((uint8_t *)&u32TransBuf[1][0], (uint8_t *)&u32ReceiveBuf[1][0], (BSP_WM8731_DMA_BLK_LEN * 4U)); u8ReceiveCompleteFlag = 0U; } else { BSP_ES8388_Record(&u32ReceiveBuf[1][0], DMACount); // (void)memcpy((uint8_t *)&u32TransBuf[0][0], (uint8_t *)&u32ReceiveBuf[0][0], (BSP_WM8731_DMA_BLK_LEN * 4U)); u8ReceiveCompleteFlag = 1U; } // DMA_ClearTransCompleteStatus(CM_DMA2, DMA_INT_TC_CH0); } DMACount设成了1024,倒是可以采样上了数据。给左右通道输入了正弦波,可以正常采集。但是有一些问题。今天断开了left通道,只给right通道正弦波,发现了一个奇怪的现象,left和right通道采集的数据交替出现正弦波,是哪里发生错位了呢?
3100浏览量 8回复量 关注量 -
HC32F460 CAN通讯错误掉线后如何恢复,错误中断如何配置
各位大佬,我在项目中用F460发生CAN掉线,设备重启后CAN恢复,知道是内部can控制掉线了,要等待128个持续隐形电平,才能恢复。问题1:手册里说通过错误中断可以知道是否掉线,那么MCU该如何配置错误中断的回调函数? 问题2:这128个持续隐形电平该怎么去判断?
1446浏览量 2回复量 关注量 -
请问华大MCUF460JETA怎么设置DMA为软件触发
[table=98%,rgb(255, 255, 255)] [tr][td] 请问 现在只能通过串口发送,用发送完成中断触发DMA发送,请问怎么用软件触发DMA 发送 跟32一样 使能通道 重置发送数。 还有请问 stcIrqRegiCfg.enIRQn是代表中断优先级么 这个是代表什么 stcIrqRegiCfg.enIntSrc 我看到最后都是说中断的枚举号,请大佬指点一下 [td] [td][/td][td][td] /* Enable the specified DMA channel. */ [/td]DMA_ChannelCmd(USART_DMA_UNIT, TX_DMA_CH, Disable);[/td][/td][td][/td][td][/td][td][/td][td][/td][td][/td][td][/td][td][/td][td][/td][td][/td][td][/td] [td] DMA_ClearIrqFlag(USART_DMA_UNIT, TX_DMA_CH, TrnCpltIrq); [td] /* Enable peripheral circuit trigger function. */ PWC_Fcg0PeriphClockCmd(PWC_FCG0_PERIPH_PTDIS,Enable); /* Set DMA trigger source. */这里是设置触发源的地方,不知道怎么设置为软件触发 DMA_SetTriggerSrc(USART_DMA_UNIT, TX_DMA_CH, TX_DMA_TRG_SEL); [/td][td] [/td][/td] /* Set DMA block transfer complete IRQ */ stcIrqRegiCfg.enIRQn = TX_DMA_BTC_INT_IRQn; stcIrqRegiCfg.pfnCallback = &Dma_TX_IrqCallback; stcIrqRegiCfg.enIntSrc = TX_DMA_BTC_INT_NUM; enIrqRegistration(&stcIrqRegiCfg);[/td][/tr] [/table]
2964浏览量 1回复量 关注量