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

📄 codec.c

📁 该程序为QPSK解调程序
💻 C
字号:

#include <stdio.h>
#include <csl_cache.h>
#include "CODEC.h"
#include "MCBSPConfig.h"
#include "EDMAConfig.h"
#include "MyGPIOConfig.h"
#include <std.h>
#include <swi.h>
#include "codec_bioscfg.h"
//#pragma DATA_SECTION(ProcessData,".sect_ProcessData")
//#pragma DATA_ALIGN(ProcessData,4)
void Process(void);
void QPSKDemo( Uint32 *p1, Uint32 *p2,int PointNum);
GPIO_Handle hGpio;
MCBSP_Handle hMcbsp; 
EDMA_Handle hEdmaIn,hEdmaOut;
EDMA_Handle hEdmaReloadInPing,hEdmaReloadInPong;
EDMA_Handle hEdmaReloadOutPing,hEdmaReloadOutPong;
void initIrq(void);
void initEdma(void);
int RcvChan,XmtChan;
void main()
 {
	CSL_init();//初始化CSL
	hGpio = GPIO_open(GPIO_DEV0,GPIO_OPEN_RESET);//打开GPIO句柄
	GPIO_configArgs(hGpio,gpgc,gpen,gpdir,gpval,gphm,gplm,gppol);//GPIO配置
	hMcbsp = MCBSP_open(MCBSP_DEV2, MCBSP_OPEN_RESET);//Open up serial port 2
	//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
    IRQ_globalDisable();
	initEdma();
	initIrq();
	IRQ_globalEnable();
	IRQ_nmiEnable();
	MCBSP_start(hMcbsp, 
                MCBSP_RCV_START | MCBSP_XMIT_START, 
                0);
	
	init_aic23();//初始化AIC23
	
	for(;;)
	{
       ;
	/*	while (!MCBSP_rrdy(hMcbsp));
		audio_data = MCBSP_read(hMcbsp);
                    
		MCBSP_write(hMcbsp,audio_data);
	*/	
	}
	
}

void initEdma(void)
{
/*
*接收端
*/
 hEdmaIn=EDMA_open(EDMA_CHA_REVT2,EDMA_OPEN_RESET);
 hEdmaReloadInPing=EDMA_allocTable(-1);
 hEdmaReloadInPong=EDMA_allocTable(-1);
 EdmaCfgIn.src=MCBSP_getRcvAddr(hMcbsp);
 EdmaCfgIn.dst=(Uint32)InPing;//此处可能有问题,可能要取地址符号
 //RcvChan=EDMA_intAlloc(-1);
 EdmaCfgIn.opt|=EDMA_FMK(OPT,TCC,RcvChan);
 EdmaCfgIn.opt|=EDMA_FMK(OPT,TCCM,RcvChan>>4);//interrupt setting may be problem
 EDMA_config(hEdmaIn,&EdmaCfgIn);
 EDMA_config(hEdmaReloadInPing,&EdmaCfgIn);

 EdmaCfgIn.dst=EDMA_DST_OF(InPong);
 EDMA_config(hEdmaReloadInPong,&EdmaCfgIn);

 EDMA_link(hEdmaIn,hEdmaReloadInPong);
 EDMA_link(hEdmaReloadInPong,hEdmaReloadInPing);
 EDMA_link(hEdmaReloadInPing,hEdmaReloadInPong);
 
 EDMA_intClear(RcvChan);
 EDMA_intEnable(RcvChan);
 EDMA_enableChannel(hEdmaIn);
/*
*发送端
*/
 hEdmaOut=EDMA_open(EDMA_CHA_XEVT2,EDMA_OPEN_RESET);
 hEdmaReloadOutPing=EDMA_allocTable(-1);
 hEdmaReloadOutPong=EDMA_allocTable(-1);
 EdmaCfgOut.dst=MCBSP_getXmtAddr(hMcbsp);
 EdmaCfgOut.src=(Uint32)OutPing;//此处可能有问题,可能要取地址符号
 XmtChan=EDMA_intAlloc(-1);
 //XmtChan=0x08;
 EdmaCfgOut.opt|=EDMA_FMK(OPT,TCC,(XmtChan));
 EdmaCfgOut.opt|=EDMA_FMK(OPT,TCCM,(XmtChan>>4));
 EDMA_config(hEdmaOut,&EdmaCfgOut);
 EDMA_config(hEdmaReloadOutPing,&EdmaCfgOut);

 EdmaCfgOut.src=EDMA_SRC_OF(OutPong);
 EDMA_config(hEdmaReloadOutPong,&EdmaCfgOut);

 EDMA_link(hEdmaOut,hEdmaReloadOutPong);
 EDMA_link(hEdmaReloadOutPong,hEdmaReloadOutPing);
 EDMA_link(hEdmaReloadOutPing,hEdmaReloadOutPong);
 
 EDMA_intClear(XmtChan);
 EDMA_intEnable(XmtChan);
//EDMA_intClear(RCCINTNUM);
//EDMA_intEnable(RCCINTNUM);
 
 EDMA_enableChannel(hEdmaOut);
}
void initIrq(void)
{
  IRQ_clear(IRQ_EVT_EDMAINT);
  IRQ_enable(IRQ_EVT_EDMAINT);
  SWI_enable();

}
void HWI_Edma_isr(void)//使用dispacher就不用interrupt关键字了
{ 
 static Int16 rcvdone = 0;//定义局部变量rcvdone
   if (EDMA_intTest(RcvChan))//通道gRcvChan接收传输完成中断
    {
        EDMA_intClear(RcvChan);//清楚通道gRcvChan传输完成标志
        rcvdone = 1;//传输完成标志变量置1
    }
     if (rcvdone)//传输完成

        EDMA_intClear(RcvChan);
    {
        if (InPingorPong==InPingFlag)
        {    
            InPingorPong=InPongFlag;
            SWI_or(&ProcessBufferSWI, InPingFlag);//启动软件中断processBufferSwi
        } else
        {  InPingorPong=InPingFlag;
            SWI_or(&ProcessBufferSWI, InPongFlag);//启动软件中断processBufferSwi
        }
        rcvdone = 0;//传输完成标志变量清零
		
    }
}
void ProcessPingPongBuffer(void)
{   Uint32 SWIPingPong;
    /* 读取mailbox中由edmaHwi()中断发送的内容 */
    SWIPingPong =  SWI_getmbox();
    /*处理接收缓冲区gBufferRcvPing、gBufferRcvPong数据  */
   if (SWIPingPong == InPingFlag) //处理PING缓冲区中数据
     { 
        QPSKDemo( InPing, OutPing,COUNT);
     } 
    else
     {//处理PONG缓冲区中数据
        QPSKDemo( InPong, OutPong,COUNT);
     }
}

void QPSKDemo( Uint32 *p1, Uint32 *p2,int PointNum)
{ int PointNumi;
  for(PointNumi=0;PointNumi<PointNum;PointNumi++)
     ProcessData[PointNumi]=*p1++;
  Process();
  for(PointNumi=0;PointNumi<PointNum;PointNumi++)
     *p2++=ProcessData[PointNumi];
}
void Process(void)
{int i=0;
 for(i=0;i<COUNT;i++)
   ProcessData[i]=ProcessData[i]*1;

    delay_time(10000);
    delay_time(10000);
    delay_time(10000);
    delay_time(10000);
    delay_time(10000);
	delay_time(10000);
	delay_time(10000);
	delay_time(10000);
	delay_time(10000);
    delay_time(10000);
	delay_time(10000);

}
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 + -