📄 wm8731.c
字号:
//wm8731.c
//wm8731操作程序
//编制:黄向波
//时间:20080123
#define wm8731_write 0x34
#define wm8731_read 0x35
#define CLOSE 0
#define OPEN 1
/*===========================================================================
=============================================================================*/
void wm8731_delay(void)
{
UWORD i;
for(i=0;i<10;i++)
{__asm{ nop};}
return;
}
/*===========================================================================
=============================================================================*/
#ifndef _EMU_
void wm8731_start(void)
{
wmsdin_wr();
wmsdin_set();
wmsclk_set();
wm8731_delay();
wmsdin_clr();
wm8731_delay();
wmsclk_clr();
wm8731_delay();
return;
}
#endif
/*===========================================================================
=============================================================================*/
#ifndef _EMU_
void wm8731_stop(void)
{
wmsdin_wr();
wmsclk_clr();
wm8731_delay();
wmsdin_clr();
wm8731_delay();
wmsclk_set();
wm8731_delay();
wmsdin_set();
wm8731_delay();
return;
}
#endif
/*===========================================================================
=============================================================================*/
UBYTE wm8731_send_byte(UBYTE ch)
{
UBYTE flag;
wmsdin_wr();
wmsclk_clr();
wm8731_delay();
if((UBYTE)ch&BIT07_MASK)
{wmsdin_set();}
else
{wmsdin_clr();}
wm8731_delay();
wmsclk_set();
wm8731_delay();
wmsclk_clr();
if((UBYTE)ch&BIT06_MASK)
{wmsdin_set();}
else
{wmsdin_clr();}
wm8731_delay();
wmsclk_set();
wm8731_delay();
wmsclk_clr();
if((UBYTE)ch&BIT05_MASK)
{wmsdin_set();}
else
{wmsdin_clr();}
wm8731_delay();
wmsclk_set();
wm8731_delay();
wmsclk_clr();
if((UBYTE)ch&BIT04_MASK)
{wmsdin_set();}
else
{wmsdin_clr();}
wm8731_delay();
wmsclk_set();
wm8731_delay();
wmsclk_clr();
if((UBYTE)ch&BIT03_MASK)
{wmsdin_set();}
else
{wmsdin_clr();}
wm8731_delay();
wmsclk_set();
wm8731_delay();
wmsclk_clr();
if((UBYTE)ch&BIT02_MASK)
{wmsdin_set();}
else
{wmsdin_clr();}
wm8731_delay();
wmsclk_set();
wm8731_delay();
wmsclk_clr();
if((UBYTE)ch&BIT01_MASK)
{wmsdin_set();}
else
{wmsdin_clr();}
wm8731_delay();
wmsclk_set();
wm8731_delay();
wmsclk_clr();
if((UBYTE)ch&BIT00_MASK)
{wmsdin_set();}
else
{wmsdin_clr();}
wm8731_delay();
wmsclk_set();
wm8731_delay();
wmsclk_clr();
/*get ack*/
wmsdin_set();
wmsdin_rd();
wm8731_delay();
wmsclk_set();
wm8731_delay();
if(((UBYTE)FIO0PIN2&BIT07_MASK)==0) {flag=0;}
else {flag =(UBYTE) -1;}
wmsclk_clr();
wm8731_delay();
return (UBYTE)flag;
}
/*===========================================================================
=============================================================================*/
UBYTE wm8731_register_write(UBYTE reg,UBYTE ch)
{
wm8731_start();
if(wm8731_send_byte(wm8731_write)!=0)goto label_err;
if(wm8731_send_byte((UBYTE)reg)!=0)goto label_err;
if(wm8731_send_byte((UBYTE)ch)!=0)goto label_err;
wm8731_stop() ;
return 0;
label_err:
wm8731_stop() ;
return (UBYTE)-1;
}
// ADR B7 B6 B5 B4 B3 B2 B1 B0
//REG 08 SIDEATT SIDEATT SIDETONE DACSEL BYPASS INSEL MUTE MIC MIC BOOOST
//REG 0A 0 0 0 HPOR DAC MU DEEMPH DEEMPH ADC HPD
//reg 0c PWROFF CLKOUTPD OSCPD OUTPD DACPD ADCPD MICPD LINEINPD
//REG 10 CLKODIV2 CLKIDIV2 SR SR SR SR BOSR USB/NORM
//REG 12 0 0 0 0 0 0 0 ACTIVE
//reg 0e BCLKVIN MS LRSWAP LRP DATA BIT FORMATE
/*===========================================================================
函数:wm8731_ini
功能:wm8731初始化程序
返回:0:成功
!0:失败
=============================================================================*/
UBYTE wm8731_ini(void)
{
//
if(wm8731_register_write(0x0c,0x00)!=0)goto label_err;
if(wm8731_register_write(0x08,0x3b)!=0)goto label_err;
if(wm8731_register_write(0x10,0x18)!=0)goto label_err;//32k/32k
if(wm8731_register_write(0x0E,0x02)!=0)goto label_err;//16bit/I2s
if(wm8731_register_write(0x12,0x01)!=0)goto label_err;//active
//if(wm8731_register_write(0x0c,0x5f)!=0)goto label_err;
return 0;
label_err:
return (UBYTE)-1;
}
/*===========================================================================
函数:
功能:
返回:0:成功
!0:失败
=============================================================================*/
UBYTE mic_switch(UBYTE ch)
{
if(ch==OPEN)
{
if(wm8731_register_write(0x08,0x39)!=0)goto label_err;//disable mic mute
if(wm8731_register_write(0x0c,0x4d)!=0)goto label_err;//mic power on
//enable lout ampsd
}
else
{
if(wm8731_register_write(0x08,0x3b)!=0)goto label_err;//enable mic mute
if(wm8731_register_write(0x0c,0x5f)!=0)goto label_err;//mic power down
//disable lout ampsd
}
return 0;
label_err:
return (UBYTE)-1;
}
/*===========================================================================
函数:
功能:
返回:0:成功
!0:失败
=============================================================================*/
UBYTE lout_switch(UBYTE ch)
{
if(ch==OPEN)
{
if(wm8731_register_write(0x0a,0x00)!=0)goto label_err;//disable dac mute
if(wm8731_register_write(0x0c,0x47)!=0)goto label_err;//dac power on
//enable lout ampsd
}
else
{
if(wm8731_register_write(0x0a,0x08)!=0)goto label_err;//enable dac mute
if(wm8731_register_write(0x0c,0x5f)!=0)goto label_err;//dac power down
//disable lout ampsd
}
return 0;
label_err:
return (UBYTE)-1;
}
/*===========================================================================
函数:
功能:
返回:0:成功
!0:失败
=============================================================================*/
UBYTE rout_switch(UBYTE ch)
{
if(ch==OPEN)
{
if(wm8731_register_write(0x0a,0x00)!=0)goto label_err;//disable dac mute
//if(wm8731_register_write(0x0c,0x47)!=0)goto label_err;//dac power on
//enable rout ampsd
}
else
{
if(wm8731_register_write(0x0a,0x08)!=0)goto label_err;//enable dac mute
//if(wm8731_register_write(0x0c,0x5f)!=0)goto label_err;//dac power down
//disable rout ampsd
}
return 0;
label_err:
return (UBYTE)-1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -