⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wm8731.c

📁 为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 + -