初始化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;
}



       我目前不太清楚哪里初始化有问题,请原子哥指点一下。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。