OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5425|回复: 5

初始化I2S3

[复制链接]

36

主题

256

帖子

0

精华

高级会员

Rank: 4

积分
921
金钱
921
注册时间
2016-4-20
在线时间
169 小时
发表于 2016-5-18 11:07:30 | 显示全部楼层 |阅读模式
15金钱
      我的开发板是探索者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;
}



       我目前不太清楚哪里初始化有问题,请原子哥指点一下。

最佳答案

查看完整内容[请看2#楼]

搞了一整天,解决了第一个问题。初始化的引脚少了两个,如果要复用两个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); //PC ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

36

主题

256

帖子

0

精华

高级会员

Rank: 4

积分
921
金钱
921
注册时间
2016-4-20
在线时间
169 小时
 楼主| 发表于 2016-5-18 11:07:31 | 显示全部楼层
搞了一整天,解决了第一个问题。初始化的引脚少了两个,如果要复用两个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

回复

使用道具 举报

36

主题

256

帖子

0

精华

高级会员

Rank: 4

积分
921
金钱
921
注册时间
2016-4-20
在线时间
169 小时
 楼主| 发表于 2016-5-18 11:08:01 | 显示全部楼层
自己先定一下,大家帮忙看看是什么问题?
回复

使用道具 举报

36

主题

256

帖子

0

精华

高级会员

Rank: 4

积分
921
金钱
921
注册时间
2016-4-20
在线时间
169 小时
 楼主| 发表于 2016-5-18 15:01:36 | 显示全部楼层
我把后面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);
}

"

实验44 录音机实验 0512.rar

7.72 MB, 下载次数: 179

回复

使用道具 举报

72

主题

245

帖子

0

精华

高级会员

Rank: 4

积分
510
金钱
510
注册时间
2015-11-13
在线时间
131 小时
发表于 2018-1-12 10:43:59 | 显示全部楼层
我想问下你这个实验有涉及到SD卡吗   因为你I2S3使用的那几个脚跟SD卡的引脚冲突了,我现在也在做双I2S读取音频的实验  单个能读 双个就GG了  你问题解决了吗
回复

使用道具 举报

72

主题

245

帖子

0

精华

高级会员

Rank: 4

积分
510
金钱
510
注册时间
2015-11-13
在线时间
131 小时
发表于 2018-1-12 11:28:44 | 显示全部楼层
我刚才看了下你的程序   DMA1_Stream5->CR&=~(1<<5);     中断完成使能在寄存器中好像是第四位吧   你这个设置成第五位了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-19 20:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表