📄 codec.c
字号:
/************************************************************
Copyright (C), 2007 by SEED Electronic Technology LTD.
FileName: CEDEC.C
Author: Ya.X Version : V1.0 Date:2007-09-20
Description: DEC643 AIC23音频处理芯片应用程序模块
*************************************************************/
#include <csl_mcasp.h>
#include <csl_i2c.h>
#include "codec.h"
/*MCASP配置*/
MCASP_ConfigGbl MyMCASPcfgGbl = {
0x00000000, /* PFUNC - All pins as McASP */
0x00000001, /* PDIR - XMT DATA output, rest are inputs */
0x00000000, /* DITCTL - DIT mode disable */
0x00000000, /* DLBCTL - Loopback disabled */
0x00000000 /* AMUTE - Never drive AMUTE */
};
//Set receive registers.
MCASP_ConfigRcv MyMCASPcfgRcv = {
/* RMASK */
0xffffffff, /* RMASK - Use all 32 bits */
0x000180f8, /* RFMT - MSB first, 32-bit slots, CPU bus, 0 bit delay */
0x00000000, /* AFSRCTL - burst, single bit frame sync, ext FS */
0x00000080, /* ACLKRCTL - Sample on rising CLK, divide by 1, ext CLK */
0x00000000, /* AHCLKRCTL - External HCLK */
0x00000001, /* RTDM - Slots 0-31 are active */
0x00000000, /* RINTCTL - No interrupts */
0x00000000 /* RCLKCHK - Not used */
};
//Set serial control.
MCASP_ConfigSrctl MyMCASPcfgSrctl = {
0x0000000D, /* SRCTL0 - Inactive */
0x0000000E, /* SRCTL1 - Inactive */
0x00000000, /* SRCTL2 - Inactive */
0x00000000, /* SRCTL3 - Inactive */
0x00000000, /* SRCTL4 - Inactive */
0x00000000, /* SRCTL5 - Inactive */
0x00000000, /* SRCTL6 - Receive, active high */
0x00000000 /* SRCTL7 - Transmit, active high */
};
//Set transmit registers.
MCASP_ConfigXmt MyMCASPcfgXmt = {
/* XMASK */
0xffffffff, /* XMASK - Use all 32 bits */
0x000180f8, /* XFMT - MSB first, 32-bit slots, CPU bus, 0 bit delay */
0x00000000, /* AFSXCTL - burst, single bit frame sync, ext FS */
0x000000c0, /* ACLKXCTL - Sample on falling CLK, divide by 1, ext CLK */
0x00000000, /* AHCLKXCTL - External HCLK */
0x00000001, /* XTDM - Slots 0-31 are active */
0x00000000, /* XINTCTL - No interrupts */
0x00000000 /* XCLKCHK - Not used */
};
MCASP_Config MyMCASPConfig = {
&MyMCASPcfgGbl,
&MyMCASPcfgRcv,
&MyMCASPcfgXmt,
&MyMCASPcfgSrctl,
};
/***********************************************************
Function: DEC643_AIC23_OpenCodec
Description: 打开音频编解码器AIC23
配置AXR1[0]为接收口;AXR1[1]为发送口
Calls: No
Called By: main
Input: No
Output: No
Return: MCASP_Handle
Others: No
************************************************************/
MCASP_Handle DEC643_AIC23_OpenCodec()
{
MCASP_Handle DEC643_AIC23_DATAHANDLE;
Uint32 gblctl;
DEC643_AIC23_DATAHANDLE = MCASP_open(MCASP_DEV0,MCASP_OPEN_RESET);
/* Reset MCASP to default values by setting GBLCTL = 0.*/
MCASP_reset(DEC643_AIC23_DATAHANDLE);
MCASP_config(DEC643_AIC23_DATAHANDLE,&MyMCASPConfig);
/* Clear transmit and receive status ,清除发送与接收状态*/
MCASP_RSETH(DEC643_AIC23_DATAHANDLE,XSTAT,0xFFFF);
MCASP_RSETH(DEC643_AIC23_DATAHANDLE,RSTAT,0xFFFF);
gblctl = 0;
MCASP_RSETH(DEC643_AIC23_DATAHANDLE, GBLCTL, gblctl);
gblctl = 0x404;
/*使能发送与接收的串行寄存器*/
MCASP_RSETH(DEC643_AIC23_DATAHANDLE, GBLCTL, 0x404);
/* Enable transmit/receive state machines */
MCASP_RSETH(DEC643_AIC23_DATAHANDLE, XBUF0, 0);
gblctl = 0x0c0c;
MCASP_RSETH(DEC643_AIC23_DATAHANDLE, GBLCTL, gblctl);
return(DEC643_AIC23_DATAHANDLE);
}
/***********************************************************
Function: DEC643_AIC23_CloseCodec
Description: 关闭McASP
Calls: No
Called By: main
Input: HMcASP:待关闭的McASP句柄
Output: No
Return: No
Others: No
************************************************************/
void DEC643_AIC23_CloseCodec(MCASP_Handle HMcASP)
{
MCASP_close(HMcASP);
}
/***********************************************************
Function: DEC643_AIC23_OpenRxCodec
Description: 单独开启McASP接收通道
Calls: No
Called By: main
Input: No
Output: No
Return: MCASP_Handle
Others: No
************************************************************/
MCASP_Handle DEC643_AIC23_OpenRxCodec()
{
MCASP_Handle DEC643_AIC23_DATAHANDLE;
Uint32 gblctl;
DEC643_AIC23_DATAHANDLE = MCASP_open(MCASP_DEV0,MCASP_OPEN_RESET);
/* Reset MCASP to default values by setting GBLCTL = 0.*/
MCASP_resetRcv(DEC643_AIC23_DATAHANDLE);
MCASP_config(DEC643_AIC23_DATAHANDLE,&MyMCASPConfig);
/*Start HF serial clocks */
/* Clear receive status ,清除发送与接收状态*/
MCASP_RSETH(DEC643_AIC23_DATAHANDLE,RSTAT,0xFFFF);
/* Take the respetive serializer out of reset */
gblctl = 0x04;
MCASP_RSETH(DEC643_AIC23_DATAHANDLE, RGBLCTL, gblctl);
/* Enable transmit/receive state machines */
gblctl = 0x0c;
MCASP_RSETH(DEC643_AIC23_DATAHANDLE, RGBLCTL, gblctl);
gblctl = 0x1c;
MCASP_RSETH(DEC643_AIC23_DATAHANDLE, RGBLCTL, gblctl);
return(DEC643_AIC23_DATAHANDLE);
}
/***********************************************************
Function: DEC643_AIC23_OpenTxCodec
Description: 单独开启McASP发送通道
Calls: No
Called By: main
Input: No
Output: No
Return: MCASP_Handle
Others: No
************************************************************/
MCASP_Handle DEC643_AIC23_OpenTxCodec()
{
MCASP_Handle DEC643_AIC23_DATAHANDLE;
Uint32 gblctl;
DEC643_AIC23_DATAHANDLE = MCASP_open(MCASP_DEV0,MCASP_OPEN_RESET);
/* Reset MCASP to default values by setting GBLCTL = 0.*/
MCASP_resetXmt(DEC643_AIC23_DATAHANDLE);
MCASP_config(DEC643_AIC23_DATAHANDLE,&MyMCASPConfig);
/* Clear transmit and receive status ,清除发送与接收状态*/
MCASP_RSETH(DEC643_AIC23_DATAHANDLE,XSTAT,0xFFFF);
gblctl = 0;
MCASP_RSETH(DEC643_AIC23_DATAHANDLE, XGBLCTL, gblctl);
gblctl = 0x400;
/*使能发送与接收的串行寄存器*/
MCASP_RSETH(DEC643_AIC23_DATAHANDLE, XGBLCTL, gblctl);
/* Enable transmit/receive state machines */
MCASP_RSETH(DEC643_AIC23_DATAHANDLE, XBUF7, 0);
gblctl = 0x0c00;
MCASP_RSETH(DEC643_AIC23_DATAHANDLE, XGBLCTL, gblctl);
gblctl = 0x1c00;
MCASP_RSETH(DEC643_AIC23_DATAHANDLE, XGBLCTL, gblctl);
return(DEC643_AIC23_DATAHANDLE);
}
/***********************************************************
Function: DEC643_AIC23_Config
Description: 配置AIC23的寄存器
Calls: No
Called By: main
Input: No
Output: No
Return: No
Others: No
************************************************************/
void DEC643_AIC23_Config()
{
I2C_Handle hI2C;
/* Initialize I2C0. */
/* Open I2C0. */
hI2C = I2C_open(I2C_PORT0,I2C_OPEN_RESET);
/* If i2c model clock frequency is lower, perhaps timer delay should be
added between aic23 registers writting */
/* Set all parts of AIC23 begin to work. */
I2C_write16(hI2C,Power_Down_Control,0x00);
/* Set digital interface for AIC23. */
I2C_write16(hI2C,Digital_Audio_Interface_Format,0x53);//0x52
/* Set analog channel for AIC23. */
I2C_write16(hI2C,Analog_Audio_Path_Control,0x10);
/* Set digital channel for AIC23. */
I2C_write16(hI2C,Digital_Audio_Path_Control,0x01);
/* Set sample rate for AIC23. */
I2C_write16(hI2C,Sample_Rate_Control,0x02);
/* Set volume for headphone. */
I2C_write16(hI2C,Left_Channel_Headphone_Volume_Control,0xF9);
/* Set volume for line in. */
I2C_write16(hI2C,Left_Line_Input_Channel_Volume_Control,0x17);
I2C_write16(hI2C,Right_Line_Input_Channel_Volume_Control,0x17);
/* Start AIC23. */
I2C_write16(hI2C,Digital_Interface_Activation,0x01);
DEC643_wait(1000);
I2C_close(hI2C);
}
/***********************************************************
Function: codec_headhponeout_gain
Description: AIC23音频输出增益控制
Calls: No
Called By: main
Input: gain;增益值[0-255]
Output: No
Return: No
Others: No
************************************************************/
void codec_headhponeout_gain(unsigned int gain)
{
I2C_Handle hI2C;
unsigned int aingain;
/* Initialize I2C0. */
/* Open I2C0. */
hI2C = I2C_open(I2C_PORT0,I2C_OPEN_RESET);
aingain = 0x80 + gain;
I2C_write16(hI2C,Left_Channel_Headphone_Volume_Control,aingain);
I2C_write16(hI2C,Right_Channel_Headphone_Volume_Control,aingain);
DEC643_wait(1000);
I2C_close(hI2C);
}
/********************************************************************************/
/* End of CODEC.C */
/********************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -