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

📄 codec.c

📁 dsp常见的扩展外设的框架程序和测试程序
💻 C
字号:
/*********************************************************************
	FILENAME:	CODEC.C
	DESIGNER:	戴展波
	DATE:		2004/10/10
*********************************************************************/

#include <stdio.h>
#include <csl.h>
#include <csl_cache.h>
#include <csl_mcbsp.h>
#include <csl_gpio.h>
#include "CODEC.h"

static MCBSP_Config MyMcbspConfig =
{
	MCBSP_SPCR_RMK 	//Serial Port Control Register (SPCR)
	(        
		MCBSP_SPCR_FREE_YES, 		// Serial clock free running mode(FREE) 
		MCBSP_SPCR_SOFT_YES, 		// Serial clock emulation mode(SOFT)
		MCBSP_SPCR_FRST_YES, 		// Frame sync generator reset(FRST)
		MCBSP_SPCR_GRST_YES, 		// Sample rate generator reset(GRST)
		MCBSP_SPCR_XINTM_XRDY, 		// Transmit interrupt mode(XINTM) 
		MCBSP_SPCR_XSYNCERR_NO,		// Transmit synchronization error  
		MCBSP_SPCR_XRST_YES, 		// Transmitter reset(XRST) 
		MCBSP_SPCR_DLB_OFF,   		// Digital loopback(DLB) mode 
		MCBSP_SPCR_RJUST_LZF,		// Receive data sign-extension and
		 							//   justification mode(RJUST)
		MCBSP_SPCR_CLKSTP_DISABLE, 	// Clock stop(CLKSTP) mode
		MCBSP_SPCR_DXENA_ON, 		// DX Enabler(DXENA) -Extra delay for
									//   DX turn-on time.
		MCBSP_SPCR_RINTM_RRDY, 		// Receive interrupt(RINT) mode
		MCBSP_SPCR_RSYNCERR_NO, 	// Receive synchronization error(RSYNCERR)
		MCBSP_SPCR_RRST_YES 		// Receiver reset(RRST)
	),
    
	MCBSP_RCR_RMK	// Receive Control Register (RCR)
	(  
		MCBSP_RCR_RPHASE_SINGLE, 	// Receive phases 
		MCBSP_RCR_RFRLEN2_OF(0), 	// Receive frame length 
									//   in phase 2(RFRLEN2) 
		MCBSP_RCR_RWDLEN2_32BIT,		// Receive element length 
									//   in phase 2(RWDLEN2)  
		MCBSP_RCR_RCOMPAND_MSB,		// Receive companding mode (RCOMPAND)  
		MCBSP_RCR_RFIG_NO, 		// Receive frame ignore(RFIG)
		MCBSP_RCR_RDATDLY_0BIT,		// Receive data delay(RDATDLY)
		MCBSP_RCR_RFRLEN1_OF(1), 	// Receive frame length 
									//   in phase 1(RFRLEN1)
		MCBSP_RCR_RWDLEN1_32BIT,	// Receive element length 
									//   in phase 1(RWDLEN1)
		MCBSP_RCR_RWDREVRS_DISABLE	// Receive 32-bit bit reversal 
									//   feature.(RWDREVRS)
	),
	MCBSP_XCR_RMK	//Transmit Control Register (XCR)
	(            
		MCBSP_XCR_XPHASE_SINGLE,	// Transmit phases
		MCBSP_XCR_XFRLEN2_OF(0),	// Transmit frame length 
									//   in phase 2(XFRLEN2) 
		MCBSP_XCR_XWDLEN2_32BIT, 	// Transmit element length
		 							//   in phase 2
		MCBSP_XCR_XCOMPAND_MSB, 	// Transmit companding mode(XCOMPAND)
		MCBSP_XCR_XFIG_NO, 		// Transmit frame ignore(XFIG)
		MCBSP_XCR_XDATDLY_0BIT, 	// Transmit data delay(XDATDLY)
		MCBSP_XCR_XFRLEN1_OF(1), 	// Transmit frame length 
									//   in phase 1(XFRLEN1)
		MCBSP_XCR_XWDLEN1_32BIT, 	// Transmit element length 
									//   in phase 1(XWDLEN1)
		MCBSP_XCR_XWDREVRS_DISABLE 	// Transmit 32-bit bit reversal feature
	),
/*	MCBSP_SRGR_RMK	//serial port sample rate generator register(SRGR)
	( 
		MCBSP_SRGR_GSYNC_FREE,		// Sample rate generator clock 
									//   synchronization(GSYNC).
		MCBSP_SRGR_CLKSP_RISING,	// CLKS polarity clock edge select(CLKSP)
		MCBSP_SRGR_CLKSM_INTERNAL,	// MCBSP sample rate generator clock
		 							//   mode(CLKSM)
		MCBSP_SRGR_FSGM_DXR2XSR,	// Sample rate generator transmit frame
			 						//   synchronization
		MCBSP_SRGR_FPER_OF(63),		// Frame period(FPER)
		MCBSP_SRGR_FWID_OF(31),		// Frame width(FWID)
		MCBSP_SRGR_CLKGDV_OF(15)	// Sample rate generator clock
			 						//   divider(CLKGDV)
	),*/
	MCBSP_SRGR_DEFAULT,
	MCBSP_MCR_DEFAULT, 				// Using default value of MCR register
	MCBSP_RCERE0_DEFAULT,			// Using default value of RCERE registers
	MCBSP_RCERE1_DEFAULT,
	MCBSP_RCERE2_DEFAULT,
	MCBSP_RCERE3_DEFAULT,
	MCBSP_XCERE0_DEFAULT,			// Using default value of XCERE registers
	MCBSP_XCERE1_DEFAULT,
	MCBSP_XCERE2_DEFAULT,
	MCBSP_XCERE3_DEFAULT,
	MCBSP_PCR_RMK	//serial port pin control register(PCR)
	(   
		MCBSP_PCR_XIOEN_SP, 		// Transmitter in general-purpose I/O mode
		MCBSP_PCR_RIOEN_SP, 		// Receiver in general-purpose I/O mode
		MCBSP_PCR_FSXM_EXTERNAL, 	// Transmit frame synchronization mode
		MCBSP_PCR_FSRM_EXTERNAL, 	// Receive frame synchronization mode
		MCBSP_PCR_CLKXM_INPUT, 		// Transmitter clock mode (CLKXM)
		MCBSP_PCR_CLKRM_INPUT, 		// Receiver clock mode (CLKRM)
		MCBSP_PCR_CLKSSTAT_0, 		// CLKS pin status(CLKSSTAT)
		MCBSP_PCR_DXSTAT_0,   		// DX pin status(DXSTAT)
		MCBSP_PCR_FSXP_ACTIVEHIGH, 	// Transmit frame synchronization polarity(FSXP)
		MCBSP_PCR_FSRP_ACTIVEHIGH, 	// Receive frame synchronization polarity(FSRP)
		MCBSP_PCR_CLKXP_FALLING, 	// Transmit clock polarity(CLKXP)
		MCBSP_PCR_CLKRP_RISING 	// Receive clock polarity(CLKRP)
	)
};

static Uint32 gpgc = GPIO_GPGC_RMK(
	GPIO_GPGC_GP0M_GPIOMODE,
	GPIO_GPGC_GPINT0M_DEFAULT,
	GPIO_GPGC_GPINTPOL_DEFAULT,
	GPIO_GPGC_LOGIC_DEFAULT,
	GPIO_GPGC_GPINTDV_DEFAULT
);

static Uint32 gpen = GPIO_GPEN_OF(0x09);
static Uint32 gpdir = GPIO_GPDIR_OF(0x09);
static Uint32 gpval = GPIO_GPVAL_OF(0x09);
static Uint32 gphm = GPIO_GPHM_RMK(GPIO_GPHM_GPXHM_DEFAULT);
static Uint32 gplm = GPIO_GPLM_RMK(GPIO_GPLM_GPXLM_DEFAULT);
static Uint32 gppol = GPIO_GPPOL_RMK(GPIO_GPPOL_GPINTXPOL_DEFAULT);

Uint32 audio_data = 0;

GPIO_Handle hGpio;
MCBSP_Handle hMcbsp; 

short i;
short tp1[100];
short tp2[100];
short tp3[100];

void main()
 {
	//初始化CSL
	CSL_init();
	//打开GPIO句柄
	hGpio = GPIO_open(GPIO_DEV0,GPIO_OPEN_RESET);
	//GPIO配置
	GPIO_configArgs(hGpio,gpgc,gpen,gpdir,gpval,gphm,gplm,gppol);
	
	//Open up serial port 2
	hMcbsp = MCBSP_open(MCBSP_DEV2, MCBSP_OPEN_RESET);
  
	//Configure McBSP for digital loopback, 32bit mode
	//  and setup the sample rate generator to allow self clocking
	MCBSP_config(hMcbsp, &MyMcbspConfig);
	
	//Enable McBSP in steps
	MCBSP_start(hMcbsp, 
                MCBSP_RCV_START | MCBSP_XMIT_START, 
                0);
	
	//初始化AIC23
	init_aic23();
	
	//delay1(31,31);
	
	for(;;)
	{
		/* 左通路数据 */
		while (!MCBSP_rrdy(hMcbsp));
		audio_data = MCBSP_read(hMcbsp);
                    
		MCBSP_write(hMcbsp,audio_data);
		
	}
	
}

void init_aic23(void)
{
	Write_Command(Reset_Register,RR_STATUS);
	//设置AIC23各部分功能都工作
	Write_Command(Power_Down_Control,PDC_DEFAULT);
	//设置数字音频接口格式
	Write_Command(Digital_Audio_Inteface_Format,DAIF_MS+DAIF_LRSWAP+DAIF_LRP+DAIF_IWL+DAIF_FOR);
	//设置模拟音频接口格式
	Write_Command(Analog_Aduio_Path_Control,AAPC_STA+AAPC_STE+AAPC_DAC+AAPC_BYP+AAPC_INSEL+AAPC_MICM+AAPC_MICB);
	//设置数字音频通道控制
	Write_Command(Digital_Audio_Path_Control,DAPC_DACM+DAPC_DEEMP+DAPC_ADCHP);
	//ADC采样率设置
	Write_Command(Sample_Rate_Control,SRC_CLKIN+SRC_CLKOUT+SRC_SR+SRC_BOSR+SRC_USB);
	//左耳机音频控制设置
	Write_Command(Left_Headphone_Volume_Control,LHVC_LRS+LHVC_LZC+LHVC_LHV);
	//左通道线形音频控制
	Write_Command(Left_Line_Input_Volume_Control,LLIVC_LRS+LLIVC_LIM+LLIVC_LIV);
	//右耳机音频控制设置
	Write_Command(Right_Headphone_Volume_Control,RHVC_RLS+RHVC_RZC+RHVC_RHV);
	//右通道线形音频控制
	Write_Command(Right_Line_Input_Volume_Control,RLIVC_RLS+RLIVC_RIM+RLIVC_RIV);
	//数字接口激活
	Write_Command(Digital_Interface_Activation,DIA_ACT);
}

void delay_time(Uint32 value)
{
	Uint32 i;
	for(i = 0; i < value; i++);
}

void IIC_SCL_DIR(Uint32 dir)
{
	Uint32 Current_dir;
	switch(dir)
	{
		case OUTPUT:
			//set sclk is output
			Current_dir = GPIO_pinDirection(hGpio,GPIO_PIN0,GPIO_OUTPUT);
			break;
			
		case INPUT:
			//set sdin is input
			Current_dir = GPIO_pinDirection(hGpio,GPIO_PIN0,GPIO_INPUT);
			break;
			
		default:
			break;
	}
}

void IIC_SDA_DIR(Uint32 dir)
{
	Uint32 Current_dir;
	switch(dir)
	{
		case OUTPUT:
			//set sclk is output
			Current_dir = GPIO_pinDirection(hGpio,GPIO_PIN3,GPIO_OUTPUT);
			break;
			
		case INPUT:
			//set sdin is input
			Current_dir = GPIO_pinDirection(hGpio,GPIO_PIN3,GPIO_INPUT);
			break;
			
		default:
			break;
	}
}

void IIC_SCL_OUT(Uint32 data)
{
	//sclk keep high level
	GPIO_pinWrite(hGpio,GPIO_PIN0,data);
}

void IIC_SDA_OUT(Uint32 data)
{
	//sdin start status is low_edge
	GPIO_pinWrite(hGpio,GPIO_PIN3,data);
}

unsigned int IIC_SDA_IN(void)
{
	unsigned int i;
	i = GPIO_pinRead(hGpio,GPIO_PIN3);
	return i;
}

void Write_Command(unsigned int address,unsigned int data)
{
	unsigned int i,temp;
	IIC_SDA_DIR(OUTPUT);
	/*写开始位*/
	Write_Start_bit();
	/*写SLAVE BYTE*/
	Write_IIC(CS_STATE_0);
	/*读ACK应答*/
	i = Read_IIC_ACK();
	if(i == 1)
	{
		while(1);
	}
	temp = (address << 1) & 0xfe;
	if((data & 0x100) == 0x100)
	{
		temp = temp | 0x01;
	}
	/*写register*/
	Write_IIC(temp);	
	/*读ACK应答*/
	i = Read_IIC_ACK();
	if(i == 1)
	{
		while(1);
	}
	temp = data & 0xff;
	/*写control data*/
	Write_IIC(temp);	
	/*读ACK应答*/
	i = Read_IIC_ACK();
	if(i == 1)
	{
		while(1);
	}
	/*写停止位*/
	Write_Stop_bit();
}

void Write_Start_bit(void)
{
	//sdata 输出
	IIC_SDA_DIR(OUTPUT);
	//sclk 输出高电平
	IIC_SCL_OUT(HIGH_LEVEL);
	//sdata 输出高电平
	IIC_SDA_OUT(HIGH_LEVEL);
	delay_time(600);
	IIC_SDA_OUT(LOW_LEVEL);
	delay_time(600);
	IIC_SCL_OUT(LOW_LEVEL);
	delay_time(1300);	
}

void Write_Stop_bit(void)
{
	//sdata 方向输出
	IIC_SDA_DIR(OUTPUT);
	//sdata 数据输出
	IIC_SDA_OUT(LOW_LEVEL);
	IIC_SCL_OUT(HIGH_LEVEL);
	delay_time(600);
	IIC_SDA_OUT(HIGH_LEVEL);
	delay_time(1300);
	IIC_SCL_OUT(LOW_LEVEL);
	delay_time(1300);
}

void Write_IIC(unsigned int Rtc_Var)
{
	int i;
	//sdata 输出,sclk下降沿有效
	IIC_SDA_DIR(OUTPUT);
	for(i = 7; i >= 0; i--)
	{
		//sdata 
		IIC_SDA_OUT((Rtc_Var >> i) & 1);
		IIC_SCL_OUT(HIGH_LEVEL);
		delay_time(600);
		IIC_SCL_OUT(LOW_LEVEL);
		delay_time(1300);
	}
}

unsigned int Read_IIC_ACK(void)
{
	unsigned int i;
	//sdata 方向输入,sclk上降沿有效
	IIC_SDA_DIR(INPUT);
	IIC_SCL_OUT(HIGH_LEVEL);
	delay_time(100);
	i = IIC_SDA_IN();
	i = i & 1;
	delay_time(600);
	IIC_SCL_OUT(LOW_LEVEL);
	delay_time(1300);
	return(i);
}

⌨️ 快捷键说明

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