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

📄 dec33boot.c

📁 TMS320VC33的应用程序 、TMS320VC33的应用程序
💻 C
字号:
/*********************************************************************************
*DEC33.C	v1.00	     							                            *
*  版权(c) 	2003-		北京合众达电子技术有限责任公司			                *
*  设计者:	刘宁								                                *
*********************************************************************************/
#include "type.h"
#include "serial.h"
#include "sysreg.h" 
#include "codec.h"

volatile SERIAL_PORT_REG *sp0 = SERIAL_PORT_ADDR(0);
HANDLE codec_command =0;
HANDLE codec_data=0;
unsigned int audiodata =0;



  /*延时子程序*/
void delay(u16 period)
{
    unsigned int i=0, j=0;
    
    for(i=0; i<period; i++)
    {
        for(j=0; j<period>>1; j++);
    }
}

/******************************************************************************/
/* codec_open() - 获得CODEC对应的同步串口的唯一的句柄,并设置其各寄存器默认值	  */
/*                                                                            */
/* 参数:                                                            		  */
/*     codec - 枚举变量CodecId中的一个元素,对应数据接口或是命令接口          */
/*                                                                            */
/* 返回值:  - 对应的有效句柄					                              */
/*                                                                            */
/******************************************************************************/
HANDLE codec_open(CodecId codec)						 
{
	/*判断是要打开哪个同步串口*/
	if(codec == 0)
	{
		unsigned int data;
	   /*打开的是数据接口,初始化*/
	   /****************************************************************/
	   /* Place port in reset - setting XRST & RRST to 0               */
	   /****************************************************************/
	   /*进行发送复位*/
	   sp0->gcontrol_bit.xreset = 0;
	   
	   /*进行接收复位*/
	   sp0->gcontrol_bit.rreset = 0;
	    
	   /****************************************************************/
	   /* Set values of all control registers                          */
	   /****************************************************************/
	   
	   SERIAL_PORT_ADDR(0)->s_rxt_counter = 0x00;     /*write Receive/Transmit Timer Counter Register*/
	   SERIAL_PORT_ADDR(0)->s_rxt_period = 0x030003;      /*write Receive/Transmit Timer Period Register*/
	  
	   SERIAL_PORT_ADDR(0)->s_r_control = 0x313;       /*write FSR/DR/CLKR Port Control Register*/
	   SERIAL_PORT_ADDR(0)->s_x_control = 0x333;       /*write FSX/DX/CLKX Port Control Register*/
	    SERIAL_PORT_ADDR(0)->gcontrol = 0x03c30c4;          /*write Serial Port Global Control  Register*/
	    SERIAL_PORT_ADDR(0)->s_rxt_control = 0x3cf;     /*write Receive/Transmit Timer Control Register*/
	  
	     sp0->gcontrol_bit.xreset = 1; 
	   sp0->gcontrol_bit.rreset = 1;
	    asm(" nop ");
	   asm(" nop ");  
	}
	else
	{  
	   
	   
		/*打开的 是命令接口,初始化*/
	   /****************************************************************/
	   /* Place port in reset - setting XRST & RRST to 0               */
	   /****************************************************************/
	   /*进行发送复位*/
	   sp0->gcontrol_bit.xreset = 0;
	   /*进行接收复位*/
	   sp0->gcontrol_bit.rreset = 0;
	   /****************************************************************/
	   /* Set values of all control registers                          */
	   /****************************************************************/
	   SERIAL_PORT_ADDR(0)->s_rxt_counter = 0x0;     /*write Receive/Transmit Timer Counter Register*/
	   SERIAL_PORT_ADDR(0)->s_rxt_period = 0x3;      /*write Receive/Transmit Timer Period Register*/
	   SERIAL_PORT_ADDR(0)->gcontrol = 0x01503c4;          /*write Serial Port Global Control Register*/
	   SERIAL_PORT_ADDR(0)->s_r_control = 0x111;       /*write FSR/DR/CLKR Port Control Register*/
	   SERIAL_PORT_ADDR(0)->s_x_control = 0x333;       /*write FSX/DX/CLKX Port Control Register*/
	   SERIAL_PORT_ADDR(0)->s_rxt_control = 0x3cf;     /*write Receive/Transmit Timer Control Register*/
	   
	   sp0->gcontrol_bit.rreset = 1;
	   sp0->gcontrol_bit.xreset = 1;
	   asm(" nop ");
	   asm(" nop ");

	  /************************************************************************/
	  /* 设置CODEC的默认设置                                                   */
	  /************************************************************************/


	  codec_reset((HANDLE) codec);   

	   
	  /*设置Line input channel volume control,设置增益为一半*/
	 	if(codec_lineain_gain((HANDLE) codec, 0x17)== ERROR)
	  	{
	  		return (HANDLE) ERROR;
	  	}	
	      
	 
	  /* 设置麦克输出控制,输出增益为0DB*/
	  if(codec_headhponeout_gain((HANDLE) codec, 0x7b)== ERROR)
	  {
	  		return (HANDLE) ERROR;
	  }
	  /*设置模拟部分的运行模式,输入选择LINE
	  					DAC开
	  							滤波旁路关
	  							MIC输入0DB,正常方式,*/
						
	  if(codec_analog_mode((HANDLE) codec,0x10)== ERROR)
	  {
	  		return (HANDLE) ERROR;
	  }
	  /*设置数字部分的运行模式*/
	 
	  if(codec_digital_mode((HANDLE) codec, 0x30) == ERROR)
	  {
	  		return (HANDLE) ERROR;
	  }
	  /*设置电源模式,所有部分均开放*/   
	   
	  if(codec_power((HANDLE) codec,0) == ERROR)
	  {
	  		return (HANDLE) ERROR;
	  }
	  /*设置数据格式,CODEC工作为主方式
	  				  数据出现在BCLK的第二个上升沿
	  				  数据长度为16位
	  				  接口方式为DSP方式*/
	 	  
	  if(codec_digital_format((HANDLE) codec,0x13) == ERROR)
	  {
	  		return (HANDLE) ERROR;
	  }
	  /*设置波特率,输入与输出均为8K*/

	  if(codec_sample_rate((HANDLE) codec,0xe3) == ERROR)
	  {
	  		return (HANDLE) ERROR;
	  }
	  /*启动CODEC*/  

	  if(codec_write_reg((HANDLE) codec,Codec_DIA,1) == ERROR)
	  {
			return (HANDLE) ERROR;
	  }
			  
	}
	return (HANDLE) codec;	
}
/******************************************************************************/
/* codec_close() -复位同步串口		          */
/* 参数:                                                                     */
/*     hDevice - 已打开的有效的句柄						                      */
/*                                                                            */
/******************************************************************************/
void codec_close(HANDLE hDevice)
{
	
	sp0->gcontrol_bit.xreset = 0;
	sp0->gcontrol_bit.rreset = 0;
	
}
/******************************************************************************/
/*    codec_write_reg() -  写TLV320aic23B的控制寄存器		                      */
/*参数:		                                                              */
/*     hDevice - 对应控制接口的句柄;                					      */
/*     reg - 指示一个在寄存器枚举列表中的一个寄存器地址					      */
/*     regdata - 要写入的寄存器的数据*/
/*返回值:								  */
/*	   要读的寄存器的值 						 */
/*                                                                            */
/******************************************************************************/
int codec_write_reg(HANDLE hDevice, CodecReg reg,unsigned int value)
{
	unsigned int output;
	unsigned int timeout = 0x2000;
	output = (reg << 0x9) + value; 
	/*等待数据准备好*/
    while (!(sp0->gcontrol_bit.xrdy) && (timeout) ) 
    {
       	timeout--;
    };
    if(timeout == 0)
    {
    	return ERROR;
    }
	sp0->x_data = output;   
	delay(1000); 
	return OK;
}
/******************************************************************************/
/*    codec_linein_gain() - 控制音频输入的音量的增益		                      */
/*参数:		                                                              */
/*     hDevice - 对应控制接口的句柄;                					      */
/*     gain - 输入音频通路的增益,0x0对应着-34.5DB,                         */
/*            0x1f对应着+12DB,最小增益调整为1.5DB                           */   
/*返回值:																	  */
/*	   要读的寄存器的值 													  */
/*                                                                            */
/******************************************************************************/
int codec_lineain_gain(HANDLE hDevice, unsigned int gain)
{
	unsigned int aingain;
	aingain = CODEC_LINEINGAIN_MODE + gain;
	if(codec_write_reg(hDevice,Codec_LLIVC,aingain) == ERROR)
	{
		return ERROR;
	}
	if(codec_write_reg(hDevice,Codec_RLIVC,aingain) == ERROR)
	{
		return ERROR;
	}
	return OK;
}
/******************************************************************************/
/*    codec_headphoneout_gain() - 控制音频输入的音量的增益		              */
/*参数:		                                                              */
/*     hDevice - 对应控制接口的句柄;                					      */
/*     gain - 输入音频通路的增益,0x30对应着-73DB,                           */
/*            0x3F对应着+6DB,在这之间共有79个步进 增益值小于0x30为无效       */   
/*返回值:																	  */
/*	   要读的寄存器的值 													  */
/******************************************************************************/
int codec_headhponeout_gain(HANDLE hDevice, unsigned int gain)
{
	unsigned int aingain;
	aingain = CODEC_PHONEINGAIN_MODE + gain;
	if(codec_write_reg(hDevice,Codec_LHPVC,aingain) == ERROR)
	{
		return ERROR;
	}
	return OK;
}
/******************************************************************************/
/*    codec_analog_mode() - 控制音频输入的设置             		              */
/*参数:		                                                              */
/*     hDevice - 对应控制接口的句柄;                					      */
/*     mode - adc的控制方式                                                   */   
/*返回值:																	  */
/*	   操作是否成功     													  */
/******************************************************************************/
int codec_analog_mode(HANDLE hDevice, unsigned int mode)
{
	if(codec_write_reg(hDevice,Codec_AAPC,mode) == ERROR)
	{
		return ERROR;
	}
	return OK;
}
/******************************************************************************/
/*    codec_digital_mode() - 控制音频输入的设置             		              */
/*参数:		                                                              */
/*     hDevice - 对应控制接口的句柄;                					      */
/*     mode - dac的控制方式                                                   */   
/*返回值:																	  */
/*	   操作是否成功     													  */
/******************************************************************************/
int codec_digital_mode(HANDLE hDevice, unsigned int mode)
{
	if(codec_write_reg(hDevice,Codec_DAPC,mode) == ERROR)
	{
		return ERROR;
	}
	return OK;
}
/******************************************************************************/
/*    codec_sample_rate() - 控制音频的采样频率             		              */
/*参数:		                                                              */
/*     hDevice - 对应控制接口的句柄;                					      */
/*     mode - sample rate的控制方式                                           */   
/*返回值:																	  */
/*	   操作是否成功     													  */
/******************************************************************************/
int codec_sample_rate(HANDLE hDevice, unsigned int mode)
{
	if(codec_write_reg(hDevice,Codec_SRC,mode) == ERROR)
	{
		return ERROR;
	}
	return OK;
}
/******************************************************************************/
/*    codec_digital_format() - 控制音频的采样频率             		          */
/*参数:		                                                              */
/*     hDevice - 对应控制接口的句柄;                					      */
/*     mode - sample rate的控制方式                                           */   
/*返回值:																	  */
/*	   操作是否成功     													  */
/******************************************************************************/
int codec_digital_format(HANDLE hDevice, unsigned int format)
{
	if(codec_write_reg(hDevice,Codec_DAIF,format) == ERROR)
	{
		return ERROR;
	}
	return OK;
}
/******************************************************************************/
/*    codec_power() - 各项功能的电源开关选择						          */
/*参数:                          		                                      */
/*         hDevice -控制接口的句柄                                            */
/*         ctrl - 关于各项功能省电模式的控制                                  */
/*                                                                            */
/******************************************************************************/
int codec_power(HANDLE hDevice, unsigned int ctrl)
{
	if(codec_write_reg(hDevice,Codec_PDC,ctrl) == ERROR)
	{
		return ERROR;
	}
	return OK;
}
/******************************************************************************/
/*    codec_reset() - 控制音频的复位             		              		  */
/*参数:		                                                              */
/*     hDevice - 对应控制接口的句柄;                					      */ 
/*返回值:																	  */
/*	   操作是否成功     													  */
/******************************************************************************/
int codec_reset(HANDLE hDevice)
{
	if(codec_write_reg(hDevice,Codec_RST,0) == ERROR)
	{
		return ERROR;
	}
	return OK;
}


main()
{   
    int i=0;
    unsigned int section[100]; 
     
     	/*打开codec命令接口*/
    
	*(volatile unsigned int *)syscntl = 0x10;  
  
	
	codec_command = codec_open(CODEC_COMMAND); 
   
     delay(1000);
	      
		/*选择输入*/
/*	codec_analog_mode(codec_command,0x10);
	/*设置 采样频率 8K*/
/*	codec_sample_rate(codec_command,0x23); 
   
     /*打开codec数据接口*/  
        
 	*(volatile unsigned int *)syscntl = 0x00;
	
	codec_data = codec_open(CODEC_DATA);   

	 (sp0->x_data) = audiodata;
	 while (1)
    {  
       
       while (!(sp0->gcontrol_bit.rrdy)) {};
         
       audiodata =( sp0->r_data);  
       (sp0->x_data) = audiodata;   
  
           
    }

	return;
}
		

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -