高级会员

- 积分
- 921
- 金钱
- 921
- 注册时间
- 2016-4-20
- 在线时间
- 169 小时
|
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 ...
|