问答

汇集网友智慧,解决技术难题

21ic问答首页 - F460的I2S的问题?连接ES8388.

F460 I2S 左右错位

F460的I2S的问题?连接ES8388.

azmao2023-10-08
学习了例程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通道采集的数据交替出现正弦波,是哪里发生错位了呢?

回答 +关注 14
3135人浏览 8人回答问题 分享 举报
8 个回答
  • 对于所有的数据速率,发送端和接收端均发出一个具有固定的传号空号比(mark-space ratio)的时钟信号,所以t LC和tHC是由T所定义的。 t LC和tHC必须大于0.35T,这样信号在从属装置端就可以被检测到。
  • 延迟的主要部分是发送端的传输延迟和设置接收端所需的时间。
  • 随着第一个WS信号的改变,WSP在SCK信号的下降沿重设计数器
  • 随着WS信号的改变,导出一个WSP脉冲信号,进入并行移位寄存器,从而输出数据被激活。串行数据的默认输入是0,因此所有位于最低位(LSB)后的数据将被设置为0。
  • 在使用I2S的时候必须使用dma模式吗
  • 传送完成的标志不是自行判断的吗
  • 第一次使用I2S,不知道其它型号的MCU是如何解决这样问题的,感觉这款F460的I2S的功能有些问题,不能让我们区分左右声道的数据,好麻烦。暂时没有找到解决方法。
  • 有一些疑惑,就是DMA与I2S如何同步,I2S的txirq触发一次DMA1的传送,rxirq触发一次DMA2的传送。传送1024次,分别产生DMA1TC和DMA2TC中断,这是得到了1024组数据,分别是left512个数据,right512个数据。到无法确定收到的第一个数是左还是有。由于每次DMA传送度的txbuf和rxbuf无法确定是left还是right。我用示波器查看了DMA中断时WS的信号,又是高有时低。这样就很麻烦了

您需要登录后才可以回复 登录 | 注册