3.3流程图
3.4关键代码
I2s.c代码: #include \#include \
void I2S2_Init(u16 I2S_Standard,u16 I2S_Mode,u16 I2S_Clock_Polarity,u16 I2S_DataFormat)
{
I2S_InitTypeDef I2S_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);//使能SPI2时钟 RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2,ENABLE); //复位SPI2 RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2,DISABLE);//结束复位 I2S_InitStructure.I2S_Mode=I2S_Mode;//IIS模式 I2S_InitStructure.I2S_Standard=I2S_Standard;//IIS标准 I2S_InitStructure.I2S_DataFormat=I2S_DataFormat;//IIS数据长度
4
止
I2S_InitStructure.I2S_MCLKOutput=I2S_MCLKOutput_Disable;//主时钟输出禁
I2S_InitStructure.I2S_AudioFreq=I2S_AudioFreq_Default;//IIS频率设置 I2S_InitStructure.I2S_CPOL=I2S_Clock_Polarity;//空闲状态时钟电平 I2S_Init(SPI2,&I2S_InitStructure);//初始化IIS
SPI_I2S_DMACmd(SPI2,SPI_I2S_DMAReq_Tx,ENABLE);//SPI2 TX DMA请求使能.
I2S_Cmd(SPI2,ENABLE);//SPI2 I2S EN使能. }
//采样率计算公式:Fs=I2SxCLK/[256*(2*I2SDIV+ODD)] //I2SxCLK=(HSE/pllm)*PLLI2SN/PLLI2SR //一般HSE=8Mhz
//pllm:在Sys_Clock_Set设置的时候确定,一般是8 //PLLI2SN:一般是192~432 //PLLI2SR:2~7 //I2SDIV:2~255 //ODD:0/1
//I2S分频系数表@pllm=8,HSE=8Mhz,即vco输入频率为1Mhz //表格式:采样率/10,PLLI2SN,PLLI2SR,I2SDIV,ODD const u16 I2S_PSC_TBL[][5]= {
{800 ,256,5,12,1}, {1102,429,4,19,0}, {1600,213,2,13,0}, {2205,429,4, 9,1},
//8Khz采样率 //11.025Khz采样率 //16Khz采样率 //22.05Khz采样率
5
{3200,213,2, 6,1}, {4410,271,2, 6,0}, {4800,258,3, 3,1}, {8820,316,2, 3,1}, {9600,344,2, 3,1}, {17640,361,2,2,0}, {19200,393,2,2,0},
//32Khz采样率 //44.1Khz采样率 //48Khz采样率 //88.2Khz采样率 //96Khz采样率 //176.4Khz采样率 //192Khz采样率
};
//设置IIS的采样率(@MCKEN) //samplerate:采样率,单位:Hz //返回值:0,设置成功;1,无法设置. u8 I2S2_SampleRate_Set(u32 samplerate) {
u8 i=0; u32 tempreg=0;
samplerate/=10;//缩小10倍
for(i=0;i<(sizeof(I2S_PSC_TBL)/10);i++)//看看改采样率是否可以支持 { }
RCC_PLLI2SCmd(DISABLE);//先关闭PLLI2S
if(i==(sizeof(I2S_PSC_TBL)/10))return 1;//搜遍了也找不到
if(samplerate==I2S_PSC_TBL[i][0])break;
RCC_PLLI2SConfig((u32)I2S_PSC_TBL[i][1],(u32)I2S_PSC_TBL[i][2]);//设置I2SxCLK的频率(x=2) 设置PLLI2SN PLLI2SR
6
}
RCC->CR|=1<<26; //开启I2S时钟
//等待I2S时钟开启成功.
while((RCC->CR&1<<27)==0);
tempreg=I2S_PSC_TBL[i][3]<<0; //设置I2SDIV tempreg|=I2S_PSC_TBL[i][4]<<8; //设置ODD位 tempreg|=1<<9;
//使能MCKOE位,输出MCK //设置I2SPR寄存器
SPI2->I2SPR=tempreg; return 0;
//I2S2 TX DMA配置
//设置为双缓冲模式,并开启DMA传输完成中断 //buf0:M0AR地址. //buf1:M1AR地址. //num:每次传输数据量
void I2S2_TX_DMA_Init(u8* buf0,u8 *buf1,u16 num) {
NVIC_InitTypeDef NVIC_InitStructure; DMA_InitTypeDef DMA_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);//DMA1时钟使能
DMA_DeInit(DMA1_Stream4);
while (DMA_GetCmdStatus(DMA1_Stream4) != DISABLE){}//等待DMA1_Stream1可配置
/* 配置 DMA Stream */
DMA_InitStructure.DMA_Channel = DMA_Channel_0; //通道0 SPI2_TX通道 DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&SPI2->DR;//外设地址为:(u32)&SPI2->DR
7
相关推荐: