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

📄 dec5502_codec.c

📁 TI DSP TMS320C5502音频采样及回放
💻 C
字号:


/******************************************************************************/
/*  Copyright 2004 by SEED Electronic Technology LTD.                         */
/*  All rights reserved. SEED Electronic Technology LTD.                      */
/*  Restricted rights to use, duplicate or disclose this code are             */
/*  granted through contract.                                                 */
/*                                                                            */
/*                                                                            */
/******************************************************************************/
/* DESCRIPTION:  															  */
/*   																		  */
/* This is an audio signal sample and play example for CODEC of C5502		  */
/*----------------------------------------------------------------------------*/
/* MODULE NAME... IIC and Mcbsp												  */
/* FILENAME...... 5502_CODEC.c   											  */
/* DATE CREATED.. Mon 6/20/2004	    										  */
/* COMPONENT..... 															  */
/* PREREQUISITS.. 															  */
/*----------------------------------------------------------------------------*/
/* DESCRIPTION:																  */  
/*   																		  */
/* This example is that the codec is controled by the IIC and Mcbsp 		  */
/*----------------------------------------------------------------------------*/

#include <csl.h>
#include <csl_chip.h>
#include <csl_i2c.h>
#include <csl_pll.h>
#include <csl_mcbsp.h>
#include <csl_emif.h>
#include <csl_emifBhal.h>

#include "E2PROM_Function.h"
#include "CODEC.h"

#undef  CODEC_ADDR
#define CODEC_ADDR 0x1A

/*------------------------------------------------------------------------------------*/
//
// Config McBSP:  Use McBSP to send and receive the data between DSP and AIC23B
//
/*------------------------------------------------------------------------------------*/
MCBSP_Config Mcbsp1Config = {
  MCBSP_SPCR1_RMK(    
    MCBSP_SPCR1_DLB_OFF,  			// DLB    = 0 
    MCBSP_SPCR1_RJUST_LZF,          // RJUST  = 0,right justify the data and zero fill the MSBs
    MCBSP_SPCR1_CLKSTP_DISABLE,     // CLKSTP = 0 
    MCBSP_SPCR1_DXENA_ON,           // DXENA  = 1,DX delay enabler on 
    0,             				   	// Reserved   = 0 
    MCBSP_SPCR1_RINTM_RRDY,         // RINTM  = 0 
    MCBSP_SPCR1_RSYNCERR_NO,        // RSYNCER = 0 
    MCBSP_SPCR1_RFULL_NO,           // RFULL = 0  
    MCBSP_SPCR1_RRDY_NO,            // RRDY = 0  
    MCBSP_SPCR1_RRST_DISABLE 		// RRST   = 0; Disable receiver 
   ),
  MCBSP_SPCR2_RMK(  
    MCBSP_SPCR2_FREE_NO,            // FREE   = 0 
    MCBSP_SPCR2_SOFT_NO,            // SOFT   = 0 
    MCBSP_SPCR2_FRST_FSG,         	// FRST   = 1 ; Enable the frame-sync logic
    MCBSP_SPCR2_GRST_CLKG,         	// GRST   = 1 ; The sample rate generator is take out of its reset state 
    MCBSP_SPCR2_XINTM_XRDY,         // XINTM  = 0 
    MCBSP_SPCR2_XSYNCERR_NO,        // XSYNCER =0 
    MCBSP_SPCR2_XEMPTY_NO,          // XEMPTY = 0 
    MCBSP_SPCR2_XRDY_NO,            // XRDY   = 0             
    MCBSP_SPCR2_XRST_DISABLE 	    // XRST   = 0 Disable transimitter 
   ),
   // 单数据相,接受数据长度为16位,每相2个数据
  MCBSP_RCR1_RMK( 
  	MCBSP_RCR1_RFRLEN1_OF(1),       // RFRLEN1 = 1 
  	MCBSP_RCR1_RWDLEN1_16BIT        // RWDLEN1 = 2 
  ),
  MCBSP_RCR2_RMK(    
    MCBSP_RCR2_RPHASE_SINGLE,       // RPHASE  = 0 
    MCBSP_RCR2_RFRLEN2_OF(0),       // RFRLEN2 = 0 
    MCBSP_RCR2_RWDLEN2_8BIT,       	// RWDLEN2 = 0 
    MCBSP_RCR2_RCOMPAND_MSB,        // RCOMPAND = 0 No companding,any size data, MSB received first 
    MCBSP_RCR2_RFIG_YES,  		    // RFIG    = 1 Frame-sync ignore 
    MCBSP_RCR2_RDATDLY_1BIT  		// RDATDLY = 1 1-bit data delay 
    ),  
  MCBSP_XCR1_RMK(    
    MCBSP_XCR1_XFRLEN1_OF(1),       // XFRLEN1 = 1  
    MCBSP_XCR1_XWDLEN1_16BIT        // XWDLEN1 = 2   
 ),   
 MCBSP_XCR2_RMK(   
    MCBSP_XCR2_XPHASE_SINGLE,       // XPHASE  = 0 
    MCBSP_XCR2_XFRLEN2_OF(1),       // XFRLEN2 = 0 
    MCBSP_XCR2_XWDLEN2_8BIT,       	// XWDLEN2 = 0 
    MCBSP_XCR2_XCOMPAND_MSB,        // XCOMPAND = 0 
    MCBSP_XCR2_XFIG_YES,            // XFIG    = 1 Unexpected Frame-sync ignore 
    MCBSP_XCR2_XDATDLY_1BIT         // XDATDLY = 1 1-bit data delay 
  ),            
 MCBSP_SRGR1_DEFAULT,
 MCBSP_SRGR2_DEFAULT,				 
 MCBSP_MCR1_DEFAULT,
 MCBSP_MCR2_DEFAULT, 
 MCBSP_PCR_RMK(
   MCBSP_PCR_IDLEEN_RESET,          // IDLEEN   = 0   
   MCBSP_PCR_XIOEN_SP,              // XIOEN    = 0   
   MCBSP_PCR_RIOEN_SP,              // RIOEN    = 0   
   MCBSP_PCR_FSXM_EXTERNAL,  		// FSXM     = 0 Tranmit frame-syn is provided by AIC23B 
   MCBSP_PCR_FSRM_EXTERNAL,         // FSRM     = 0 Receive frame-syn is provided by AIC23B 
   MCBSP_PCR_CLKXM_INPUT,   		// CLKR is input 
   MCBSP_PCR_CLKRM_INPUT,           // CLKX is input 
   MCBSP_PCR_SCLKME_NO,             // SCLKME=0 CLKG is taken from the McBSP internal input clock  
   MCBSP_PCR_CLKSSTAT_0,            // The signal on the CLKS pin is low   
   MCBSP_PCR_DXSTAT_0,              // Drive the signal on the DX pin low   
   MCBSP_PCR_DRSTAT_0,              // The signal on the DR pin is low   
   MCBSP_PCR_FSXP_ACTIVEHIGH,  		// FSXP     = 1 Because a falling edge on LRCIN or LRCOUT starts data transfer  
   MCBSP_PCR_FSRP_ACTIVELOW,        // FSRP     = 1   
   MCBSP_PCR_CLKXP_FALLING,         // CLKXP    = 1   The falling edge of BCLK starts data transfer 
   MCBSP_PCR_CLKRP_RISING           // CLKRP    = 1   
 ),
 MCBSP_RCERA_DEFAULT, 
 MCBSP_RCERB_DEFAULT, 
 MCBSP_RCERC_DEFAULT, 
 MCBSP_RCERD_DEFAULT, 
 MCBSP_RCERE_DEFAULT, 
 MCBSP_RCERF_DEFAULT, 
 MCBSP_RCERG_DEFAULT, 
 MCBSP_RCERH_DEFAULT, 
 MCBSP_XCERA_DEFAULT,
 MCBSP_XCERB_DEFAULT,
 MCBSP_XCERC_DEFAULT,
 MCBSP_XCERD_DEFAULT,  
 MCBSP_XCERE_DEFAULT,
 MCBSP_XCERF_DEFAULT,  
 MCBSP_XCERG_DEFAULT,
 MCBSP_XCERH_DEFAULT
 }; 
// 定义McBSP的句柄
MCBSP_Handle hMcbsp;

/*------------------------------------------------------------------------------------*/
//
// Config I2C: Use I2C to interface CODEC control interface
//
/*------------------------------------------------------------------------------------*/
I2C_Setup Setup = {
					0, 		// 7 bit address mode 
					0x0000, // own address 
					60, 	// clkout value (Mhz) 
					400, 	// a number between 10 and 400
					0, 		// 8 bits/byte to be received or transmitted 
					0, 		// DLB mode off 
					0 		// FREE mode off 
				  };
				  
/*------------------------------------------------------------------------------------*/
//
// Config CODEC control registers
//
/*------------------------------------------------------------------------------------*/

	// 数字音频接口格式设置
	// AIC23为主模式,数据为DSP模式,数据长度16位   
 Uint16 Digital_Audio_Inteface_Format[2]={
 	Codec_DAIF_REV,
 	DAIF_MS(1)+DAIF_LRSWAP(0)+DAIF_LRP(1)+DAIF_IWL(0)+DAIF_FOR(3)};

	// AIC23的波特率设置,采样率为48k,CLKIN=CLKOUT=MCLK
	// 时钟模式设为普通模式,基过采样率为250Fs
 Uint16 Sample_Rate_Control[2] = {
 	Codec_SRC_REV,
 	SRC_CLKIN(0)+SRC_CLKOUT(0)+SRC_SR(6)+SRC_BOSR(0)+SRC_USB(0)};

	// AIC23寄存器复位
 Uint16 Reset[2] ={
 	Codec_RST_REV,
 	RST_RES};

	// AIC23节电方式设置,所有部分均处于工作状态
 Uint16 Power_Down_Control[2] ={
 	Codec_PDC_REV,
 	PDC_DEFAULT};

	// AIC23模拟音频的控制:关掉侧音
	// DAC使能,ADC输入选择为音频输入
 Uint16 Analog_Aduio_Path_Control[2] = {
  	Codec_AAPC_STA2(0),
  	AAPC_STA10(0)+AAPC_STE(0)+AAPC_DAC(1)+AAPC_BYP(0)+AAPC_INSEL(0)+AAPC_MICM(0)+AAPC_MICB(0)};

	// AIC23数字音频通路的控制
	// 使能ADC高通滤波
 Uint16 Digital_Audio_Path_Control[2] ={
  	Codec_DAPC_REV,
  	DAPC_DACM(0)+DAPC_DEEMP(0)+DAPC_ADCHP(1)};

	// AIC23数字接口的使能
 Uint16 Digital_Interface_Activation[2] ={
 	Codec_DIA_REV,
 	DIA_ACT(1)};

	// AIC23左通路音频调节	
 Uint16 Left_Line_Input_Volume_Control[2] ={
  	Codec_LLIVC_LPS(1),
  	LLIVC_LIM(0)+LLIVC_LIV(23)};

	// AIC23右通路音频调节
 Uint16 Right_Line_Input_Volume_Control[2] = {
 	Codec_RLIVC_RLS(1),
 	RLIVC_RIM(0)+RLIVC_RIV(23)};

	// AIC23耳机左通路音频调节
 Uint16 Left_Headphone_Volume_Control[2] = {
 	Codec_LHPVC_LRS(1),
 	LHPVC_LZC(1)+LHPVC_LHV(127)};

	// AIC23耳机右通路音频调节
 Uint16 Right_Headphone_Volume_Control[2] = {
 	Codec_RHPVC_RLS(1),
 	LHPVC_RZC(1)+LHPVC_RHV(127)};

/*------------------------------------------------------------------------------------*/
//
// FUNCTION: MAIN
//
/*------------------------------------------------------------------------------------*/
                  
void main(void)
{
    Uint16  DataTempLeft = 0;		// 暂存采样数据
    Uint16  DataTempRight = 0;
    
// Initialize CSL library - This is REQUIRED !!! 
    CSL_init();
	
// The main frequency of system is 240MHz
// 该频率是为了设置IIC模块的需要设置的,为了使用I2C_setup函数
    PLL_setFreq(1, 0xC, 0, 1, 3, 3, 0);
  
// Initialize I2C, Using parameters in I2C_Setup structure
	MyI2C_setup(&Setup);

// Open McBSP port 1 and get a McBSP type handle
	hMcbsp = MCBSP_open(MCBSP_PORT1,MCBSP_OPEN_RESET);

// Config McBSP	port 1 by use previously defined structure
	MCBSP_config(hMcbsp,&Mcbsp1Config);

// Start McBSP1 
	MCBSP_start(hMcbsp, 
                MCBSP_RCV_START | MCBSP_XMIT_START, 
                0);
    
    /*设置AIC23各部分均工作*/
    MyI2C_Write( Power_Down_Control,//pointer to data array
	   	       2,				//length of data to be transmitted
	    	   1,				//master or slaver
	    	   CODEC_ADDR,	    //slave address to transmit to
	    	   1,				//transfer mode of operation
	    	   30000			//time out for bus busy
	    	   );  
          
	/*设置AIC23的数字接口*/
	MyI2C_Write( Digital_Audio_Inteface_Format,//pointer to data array
	    	   2,				//length of data to be transmitted
	    	   1,				//master or slaver
	    	   CODEC_ADDR,	    //slave address to transmit to
	    	   1,				//transfer mode of operation
	    	   30000			//time out for bus busy
	    	   );

	 /*设置AIC23模拟通路*/
	MyI2C_Write( Analog_Aduio_Path_Control,//pointer to data array
	    	   2,				//length of data to be transmitted
	    	   1,				//master or slaver
	    	   CODEC_ADDR,	    //slave address to transmit to
	    	   1,				//transfer mode of operation
	    	   30000			//time out for bus busy
	    	   );

	/*设置数字通路*/
	MyI2C_Write( Digital_Audio_Path_Control,//pointer to data array
	    	   2,				//length of data to be transmitted
	    	   1,				//master or slaver
	    	   CODEC_ADDR,	    //slave address to transmit to
	    	   1,				//transfer mode of operation
	    	   30000			//time out for bus busy
	    	   );    
		 
	/*设置AIC23的采样率*/
	MyI2C_Write( Sample_Rate_Control,//pointer to data array
	    	   2,				//length of data to be transmitted
	    	   1,				//master or slaver
	    	   CODEC_ADDR,	    //slave address to transmit to
	    	   1,				//transfer mode of operation
	    	   30000			//time out for bus busy
	    	   );

	/*设置耳机音量*/
	MyI2C_Write( Left_Headphone_Volume_Control,//pointer to data array
	    	   2,				//length of data to be transmitted
	    	   1,				//master or slaver
	    	   CODEC_ADDR,	    //slave address to transmit to
	    	   1,				//transfer mode of operation
	    	   30000			//time out for bus busy
	    	   );

	/*设置Line输入的音量*/
	MyI2C_Write( Left_Line_Input_Volume_Control,//pointer to data array
	    	   2,				//length of data to be transmitted
	    	   1,				//master or slaver
	    	   CODEC_ADDR,	    //slave address to transmit to
	    	   1,				//transfer mode of operation
	    	   30000			//time out for bus busy
	    	   );

	/*启动AIC23*/
	MyI2C_Write( Digital_Interface_Activation,//pointer to data array
	    	   2,				//length of data to be transmitted
	    	   1,				//master or slaver
	    	   CODEC_ADDR,	    //slave address to transmit to
	    	   1,				//transfer mode of operation
	    	   30000			//time out for bus busy
	    	   );
	    	   
/*------------------------------------------------------------------------------------*/	    	        	   
// Receive the ADC output data of CODEC  
// Then output the received data to DAC of CODEC 
/*------------------------------------------------------------------------------------*/

while(TRUE)
	{
    /* 左通路数据 */
	while(!MCBSP_rrdy(hMcbsp)){};
	DataTempLeft = MCBSP_read16(hMcbsp);
    
    /* 右通路数据 */
    while(!MCBSP_rrdy(hMcbsp)){};
    DataTempRight = MCBSP_read16(hMcbsp);
    	
	/* 左声道耳机输出 */
	while(!MCBSP_xrdy(hMcbsp)) {};
	MCBSP_write16(hMcbsp,DataTempLeft);
	
	/* 右声道耳机输出 */
	while(!MCBSP_xrdy(hMcbsp)) {};
	MCBSP_write16(hMcbsp,DataTempRight); 
	};     	   	    	       	         	   	    	   
}

/******************************************************************************/
//	No more
/******************************************************************************/

⌨️ 快捷键说明

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