📄 codec.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 + -