初始化I2S3

2019-07-20 10:03发布

      我的开发板是探索者407开发板。目前为了解决多通道I2S音频数据处理,所以要使能I2S、和I2S3两个通道。我参考录音机实验,I2S初始化没有问题,不需要改变只需要把I2S3初始化。但是全部初始化之后,我用逻辑分析仪检查发现I2S3_WS  I2S3_CK都没有正常电平。
      我的初始化过程参考探索者开发板的录音机实验初始化流程。
      1.引脚初始化为I2S3,这里我昨天发帖子问了引脚复用的问题。因为有的引脚和JATG是重合的,需要重新映射。
      2.I2S3,I2S3_ext初始化
      3.使能DMA

      目前还不需要调试DMA,所以应该是前面两个步骤有问题
     1.引脚复用部分代码:

u8 I2s3Init(void)
{       
        GPIO_InitTypeDef  GPIO_InitStructure;
       
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOC, ENABLE);
       
        //PA4
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        //PC10/PC11
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
       
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource4,GPIO_AF_SPI3);   //P5  I2S3_LRCK
        GPIO_PinAFConfig(GPIOC,GPIO_PinSource10,GPIO_AF_SPI3);        //PC10,  I2S3_SCLK
        GPIO_PinAFConfig(GPIOC,GPIO_PinSource11,GPIO_AF5_SPI3);        //PC11 ,  I2S3_ADCDATA  

        return 0;
}


       2.初始化I2S3代码
“void I2S3_Init(u16 I2S_Standard,u16 I2S_Mode,u16 I2S_Clock_Polarity,u16 I2S_DataFormat)
{
  I2S_InitTypeDef I2S_InitStructure;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);
       
        RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3,ENABLE);
        RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3,DISABLE);

        I2S_InitStructure.I2S_Mode=I2S_Mode;
        I2S_InitStructure.I2S_Standard=I2S_Standard;
        I2S_InitStructure.I2S_DataFormat=I2S_DataFormat;
        I2S_InitStructure.I2S_MCLKOutput=I2S_MCLKOutput_Disable;
        I2S_InitStructure.I2S_AudioFreq=I2S_AudioFreq_Default;
        I2S_InitStructure.I2S_CPOL=I2S_Clock_Polarity;
        I2S_Init(SPI3,&I2S_InitStructure);


        SPI_I2S_DMACmd(SPI3,SPI_I2S_DMAReq_Tx,ENABLE);//SPI3 TX DMA
        I2S_Cmd(SPI3,ENABLE);//SPI3 I2S
}


void I2S3ext_Init(u16 I2S_Standard,u16 I2S_Mode,u16 I2S_Clock_Polarity,u16 I2S_DataFormat)
{  
        I2S_InitTypeDef I2S3ext_InitStructure;
       
        I2S3ext_InitStructure.I2S_Mode=I2S_Mode^(1<<8);
        I2S3ext_InitStructure.I2S_Standard=I2S_Standard;
        I2S3ext_InitStructure.I2S_DataFormat=I2S_DataFormat;
        I2S3ext_InitStructure.I2S_MCLKOutput=I2S_MCLKOutput_Disable;
        I2S3ext_InitStructure.I2S_AudioFreq=I2S_AudioFreq_Default;
        I2S3ext_InitStructure.I2S_CPOL=I2S_Clock_Polarity;
       
        I2S_FullDuplexConfig(I2S3ext,&I2S3ext_InitStructure);
       
        SPI_I2S_DMACmd(I2S3ext,SPI_I2S_DMAReq_Rx,ENABLE);

        I2S_Cmd(I2S3ext,ENABLE);               
       
}


初始化采样率代码

u8 I2S3_SampleRate_Set(u32 samplerate)
{
        u8 i=0;
        u32 tempreg=0;
        samplerate/=10;//10±   
       
        for(i=0;i<(sizeof(I2S_PSC_TBL)/10);i++)//ù·§
        {
                if(samplerate==I2S_PSC_TBL[0])break;
        }

        RCC_PLLI2SCmd(DISABLE);
        if(i==(sizeof(I2S_PSC_TBL)/10))return 1;
        RCC_PLLI2SConfig((u32)I2S_PSC_TBL[1],(u32)I2S_PSC_TBL[2]);

        RCC->CR|=1<<26;                                       
        while((RCC->CR&1<<27)==0);               
        tempreg=I2S_PSC_TBL[3]<<0;       
        tempreg|=I2S_PSC_TBL[4]<<8;       
        tempreg|=1<<9;                                       
        SPI3->I2SPR=tempreg;                       
        return 0;
}



       我目前不太清楚哪里初始化有问题,请原子哥指点一下。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
czdspeed
1楼-- · 2019-07-20 10:04
搞了一整天,解决了第一个问题。初始化的引脚少了两个,如果要复用两个i2s的话,需要复用的引脚是i2s1(PB12 PB13 PC2 PC3 PC6)i2s2(PA4   PC7 PC10  PC11  PC12)
而且初始化时复用的方式要指定对。
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource4,GPIO_AF_SPI3);   //PA4   I2S3_LRCK
        GPIO_PinAFConfig(GPIOC,GPIO_PinSource7,GPIO_AF_SPI3);   //PC7  I2S3_MCK
        GPIO_PinAFConfig(GPIOC,GPIO_PinSource10,GPIO_AF_SPI3);        //PC10  I2S3_SCLK
        GPIO_PinAFConfig(GPIOC,GPIO_PinSource11,GPIO_AF5_SPI3);        //PC11  I2S3ext_SD
        GPIO_PinAFConfig(GPIOC,GPIO_PinSource12,GPIO_AF_SPI3);  //PC12  I2S3_SD

czdspeed
2楼-- · 2019-07-20 10:06
 精彩回答 2  元偷偷看……
czdspeed
3楼-- · 2019-07-20 15:19
我把后面dma初始化的代码也贴出来。经过手册查询i2s3发送接收的dma通道分别是dma1-stream5和dma1_stream0.还是按照探索者实验的流程进行的初始化。工程文件我也贴出来了。希望原子哥能帮我找找哪里出的问题。

"
void I2S3_TX_DMA_Init(u8* buf0,u8 *buf1,u16 num)
{
        NVIC_InitTypeDef   NVIC_InitStructure;
        DMA_InitTypeDef  DMA_InitStructure;
       

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);
       
        DMA_DeInit(DMA1_Stream5);
        while (DMA_GetCmdStatus(DMA1_Stream5) != DISABLE){}
               
        DMA_ClearITPendingBit(DMA1_Stream5,DMA_IT_FEIF5|DMA_IT_DMEIF5|DMA_IT_TEIF5|DMA_IT_HTIF5|DMA_IT_TCIF5);
  /*DMA Stream */

  DMA_InitStructure.DMA_Channel = DMA_Channel_0;
  DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&SPI3->DR;
  DMA_InitStructure.DMA_Memory0BaseAddr = (u32)buf0;
  DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
  DMA_InitStructure.DMA_BufferSize = num;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  DMA_Init(DMA1_Stream5, &DMA_InitStructure);
       
        DMA_DoubleBufferModeConfig(DMA1_Stream5,(u32)buf1,DMA_Memory_0);

  DMA_DoubleBufferModeCmd(DMA1_Stream5,ENABLE);

  DMA_ITConfig(DMA1_Stream5,DMA_IT_TC,ENABLE);

NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream5_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}
"

"
void I2S3ext_RX_DMA_Init(u8* buf0,u8 *buf1,u16 num)
{
        NVIC_InitTypeDef   NVIC_InitStructure;
        DMA_InitTypeDef  DMA_InitStructure;
       

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);
       
        DMA_DeInit(DMA1_Stream0);
        while (DMA_GetCmdStatus(DMA1_Stream0) != DISABLE){}
               
        DMA_ClearITPendingBit(DMA1_Stream0,DMA_IT_FEIF0|DMA_IT_DMEIF0|DMA_IT_TEIF0|DMA_IT_HTIF0|DMA_IT_TCIF0);

  /*  DMA Stream */

  DMA_InitStructure.DMA_Channel = DMA_Channel_3;
  DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&I2S3ext->DR;
  DMA_InitStructure.DMA_Memory0BaseAddr = (u32)buf0;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
  DMA_InitStructure.DMA_BufferSize = num;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;        
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  DMA_Init(DMA1_Stream0, &DMA_InitStructure);
       
        DMA_DoubleBufferModeConfig(DMA1_Stream0,(u32)buf1,DMA_Memory_0);

  DMA_DoubleBufferModeCmd(DMA1_Stream0,ENABLE);

  DMA_ITConfig(DMA1_Stream3,DMA_IT_TC,ENABLE);

               
        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream0_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0x00;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

"
不良苏
4楼-- · 2019-07-20 17:01
 精彩回答 2  元偷偷看……
不良苏
5楼-- · 2019-07-20 21:24
 精彩回答 2  元偷偷看……

一周热门 更多>