}
wm8978代码: #include \#include \#include \
static u16 WM8978_REGVAL_TBL[58]= { };
//WM8978初始化 //返回值:0,初始化正常 // 其他,错误代码 u8 WM8978_Init(void) {
u8 res;
GPIO_InitTypeDef GPIO_InitStructure;
0X0000,0X0000,0X0000,0X0000,0X0050,0X0000,0X0140,0X0000, 0X0000,0X0000,0X0000,0X00FF,0X00FF,0X0000,0X0100,0X00FF, 0X00FF,0X0000,0X012C,0X002C,0X002C,0X002C,0X002C,0X0000, 0X0032,0X0000,0X0000,0X0000,0X0000,0X0000,0X0000,0X0000, 0X0038,0X000B,0X0032,0X0000,0X0008,0X000C,0X0093,0X00E9, 0X0000,0X0000,0X0000,0X0000,0X0003,0X0010,0X0010,0X0100, 0X0100,0X0002,0X0001,0X0001,0X0039,0X0039,0X0039,0X0039, 0X0001,0X0001
10
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC, ENABLE); //使能外设GPIOB,GPIOC时
//PB12/13 复用功能输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;
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(GPIOB, &GPIO_InitStructure);//初始化
//PC2/PC3/PC6复用功能输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3|GPIO_Pin_6;
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(GPIOC, &GPIO_InitStructure);//初始化
GPIO_PinAFConfig(GPIOB,GPIO_PinSource12,GPIO_AF_SPI2); //PB12,AF5 I2S_LRCK
GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_SPI2); //PB13,AF5 I2S_SCLK
GPIO_PinAFConfig(GPIOC,GPIO_PinSource3,GPIO_AF_SPI2); I2S_DACDATA
GPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_SPI2); I2S_MCK
//PC3 ,AF5
//PC6 ,AF5
GPIO_PinAFConfig(GPIOC,GPIO_PinSource2,GPIO_AF6_SPI2); //PC2 ,AF6 I2S_ADCDATA I2S2ext_SD是AF6!!!
11
IIC_Init();//初始化IIC接口
res=WM8978_Write_Reg(0,0); //软复位WM8978 if(res)return 1; //以下为通用设置
//发送指令失败,WM8978异常
WM8978_Write_Reg(1,0X1B); //R1,MICEN设置为1(MIC使能),BIASEN设置为1(模拟器工作),VMIDSEL[1:0]设置为:11(5K)
WM8978_Write_Reg(2,0X1B0); //R2,ROUT1,LOUT1输出使能(耳机可以工作),BOOSTENR,BOOSTENL使能
WM8978_Write_Reg(3,0X6C); //R3,LOUT2,ROUT2输出使能(喇叭工作),RMIX,LMIX使能
}
//WM8978写寄存器 //reg:寄存器地址 //val:要写入寄存器的值 //返回值:0,成功; // 其他,错误代码
u8 WM8978_Write_Reg(u8 reg,u16 val)
WM8978_Write_Reg(6,0);
//R6,MCLK由外部提供
WM8978_Write_Reg(43,1<<4); //R43,INVROUT2反向,驱动喇叭
WM8978_Write_Reg(47,1<<8); //R47设置,PGABOOSTL,左通道MIC获得20倍增益 WM8978_Write_Reg(48,1<<8); //R48设置,PGABOOSTR,右通道MIC获得20倍增益 WM8978_Write_Reg(49,1<<1); //R49,TSDEN,开启过热保护
WM8978_Write_Reg(10,1<<3); //R10,SOFTMUTE关闭,128x采样,最佳SNR WM8978_Write_Reg(14,1<<3); //R14,ADC 128x采样率 return 0;
12
{
IIC_Start();
IIC_Send_Byte((WM8978_ADDR<<1)|0);//发送器件地址+写命令 if(IIC_Wait_Ack())return 1; //等待应答(成功?/失败?)
IIC_Send_Byte((reg<<1)|((val>>8)&0X01));//写寄存器地址+数据的最高位
if(IIC_Wait_Ack())return 2; //等待应答(成功?/失败?) IIC_Send_Byte(val&0XFF);
//发送数据
if(IIC_Wait_Ack())return 3; //等待应答(成功?/失败?)
IIC_Stop(); }
//WM8978读寄存器
//就是读取本地寄存器值缓冲区内的对应值 //reg:寄存器地址 //返回值:寄存器值
u16 WM8978_Read_Reg(u8 reg) { }
//WM8978 DAC/ADC配置 //adcen:adc使能(1)/关闭(0) //dacen:dac使能(1)/关闭(0)
void WM8978_ADDA_Cfg(u8 dacen,u8 adcen)
13
WM8978_REGVAL_TBL[reg]=val; //保存寄存器值到本地 return 0;
return WM8978_REGVAL_TBL[reg];
{ }
//WM8978 输入通道配置 //micen:MIC开启(1)/关闭(0) //lineinen:Line In开启(1)/关闭(0) //auxen:aux开启(1)/关闭(0)
void WM8978_Input_Cfg(u8 micen,u8 lineinen,u8 auxen) {
u16 regval;
regval=WM8978_Read_Reg(2); //读取R2 if(micen)regval|=3<<2; else regval&=~(3<<2);
//开启INPPGAENR,INPPGAENL(MIC的PGA放大) //关闭INPPGAENR,INPPGAENL.
u16 regval;
regval=WM8978_Read_Reg(3); //读取R3 if(dacen)regval|=3<<0; else regval&=~(3<<0);
//R3最低2个位设置为1,开启DACR&DACL //R3最低2个位清零,关闭DACR&DACL.
WM8978_Write_Reg(3,regval); //设置R3 regval=WM8978_Read_Reg(2); //读取R2 if(adcen)regval|=3<<0; else regval&=~(3<<0);
//R2最低2个位设置为1,开启ADCR&ADCL //R2最低2个位清零,关闭ADCR&ADCL.
WM8978_Write_Reg(2,regval); //设置R2
WM8978_Write_Reg(2,regval); //设置R2
regval=WM8978_Read_Reg(44); //读取R44
14