azmao 发表于 2023-10-8 14:55

F460的I2S的问题?连接ES8388.

学习了例程i2s_record_and_play。有几个地方没看懂。
void BSP_WM8731_TransCompleteCallBack(void)
{
    if (0U != u8TransCompleteFlag) {
      BSP_WM8731_Play(&u32TransBuf, BSP_WM8731_DMA_BLK_LEN);
      u8TransCompleteFlag = 0U;
    } else {
      BSP_WM8731_Play(&u32TransBuf, 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, DMACount);
      u8TransCompleteFlag = 0U;
    } else {
      BSP_ES8388_Play(&u32TransBuf, 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, DMACount);
//      (void)memcpy((uint8_t *)&u32TransBuf, (uint8_t *)&u32ReceiveBuf, (BSP_WM8731_DMA_BLK_LEN * 4U));
      u8ReceiveCompleteFlag = 0U;
    } else {
      BSP_ES8388_Record(&u32ReceiveBuf, DMACount);
//      (void)memcpy((uint8_t *)&u32TransBuf, (uint8_t *)&u32ReceiveBuf, (BSP_WM8731_DMA_BLK_LEN * 4U));
      u8ReceiveCompleteFlag = 1U;
    }
//    DMA_ClearTransCompleteStatus(CM_DMA2, DMA_INT_TC_CH0);
}

DMACount设成了1024,倒是可以采样上了数据。给左右通道输入了正弦波,可以正常采集。但是有一些问题。今天断开了left通道,只给right通道正弦波,发现了一个奇怪的现象,left和right通道采集的数据交替出现正弦波,是哪里发生错位了呢?

azmao 发表于 2023-10-8 17:46

有一些疑惑,就是DMA与I2S如何同步,I2S的txirq触发一次DMA1的传送,rxirq触发一次DMA2的传送。传送1024次,分别产生DMA1TC和DMA2TC中断,这是得到了1024组数据,分别是left512个数据,right512个数据。到无法确定收到的第一个数是左还是有。由于每次DMA传送度的txbuf和rxbuf无法确定是left还是right。我用示波器查看了DMA中断时WS的信号,又是高有时低。这样就很麻烦了

azmao 发表于 2023-10-10 09:02

第一次使用I2S,不知道其它型号的MCU是如何解决这样问题的,感觉这款F460的I2S的功能有些问题,不能让我们区分左右声道的数据,好麻烦。暂时没有找到解决方法。

tpgf 发表于 2023-11-1 16:01

传送完成的标志不是自行判断的吗

qcliu 发表于 2023-11-1 22:29

在使用I2S的时候必须使用dma模式吗

drer 发表于 2023-11-2 08:33

随着WS信号的改变,导出一个WSP脉冲信号,进入并行移位寄存器,从而输出数据被激活。串行数据的默认输入是0,因此所有位于最低位(LSB)后的数据将被设置为0。

coshi 发表于 2023-11-2 09:17

随着第一个WS信号的改变,WSP在SCK信号的下降沿重设计数器

wiba 发表于 2023-11-2 22:19

延迟的主要部分是发送端的传输延迟和设置接收端所需的时间。

kxsi 发表于 2023-11-2 22:51

对于所有的数据速率,发送端和接收端均发出一个具有固定的传号空号比(mark-space ratio)的时钟信号,所以t LC和tHC是由T所定义的。 t LC和tHC必须大于0.35T,这样信号在从属装置端就可以被检测到。
页: [1]
查看完整版本: F460的I2S的问题?连接ES8388.