📄 dec33boot.c
字号:
/*********************************************************************************
*DEC33.C v1.00 *
* 版权(c) 2003- 北京合众达电子技术有限责任公司 *
* 设计者: 刘宁 *
*********************************************************************************/
#include "type.h"
#include "serial.h"
#include "sysreg.h"
#include "codec.h"
volatile SERIAL_PORT_REG *sp0 = SERIAL_PORT_ADDR(0);
HANDLE codec_command =0;
HANDLE codec_data=0;
unsigned int audiodata =0;
/*延时子程序*/
void delay(u16 period)
{
unsigned int i=0, j=0;
for(i=0; i<period; i++)
{
for(j=0; j<period>>1; j++);
}
}
/******************************************************************************/
/* codec_open() - 获得CODEC对应的同步串口的唯一的句柄,并设置其各寄存器默认值 */
/* */
/* 参数: */
/* codec - 枚举变量CodecId中的一个元素,对应数据接口或是命令接口 */
/* */
/* 返回值: - 对应的有效句柄 */
/* */
/******************************************************************************/
HANDLE codec_open(CodecId codec)
{
/*判断是要打开哪个同步串口*/
if(codec == 0)
{
unsigned int data;
/*打开的是数据接口,初始化*/
/****************************************************************/
/* Place port in reset - setting XRST & RRST to 0 */
/****************************************************************/
/*进行发送复位*/
sp0->gcontrol_bit.xreset = 0;
/*进行接收复位*/
sp0->gcontrol_bit.rreset = 0;
/****************************************************************/
/* Set values of all control registers */
/****************************************************************/
SERIAL_PORT_ADDR(0)->s_rxt_counter = 0x00; /*write Receive/Transmit Timer Counter Register*/
SERIAL_PORT_ADDR(0)->s_rxt_period = 0x030003; /*write Receive/Transmit Timer Period Register*/
SERIAL_PORT_ADDR(0)->s_r_control = 0x313; /*write FSR/DR/CLKR Port Control Register*/
SERIAL_PORT_ADDR(0)->s_x_control = 0x333; /*write FSX/DX/CLKX Port Control Register*/
SERIAL_PORT_ADDR(0)->gcontrol = 0x03c30c4; /*write Serial Port Global Control Register*/
SERIAL_PORT_ADDR(0)->s_rxt_control = 0x3cf; /*write Receive/Transmit Timer Control Register*/
sp0->gcontrol_bit.xreset = 1;
sp0->gcontrol_bit.rreset = 1;
asm(" nop ");
asm(" nop ");
}
else
{
/*打开的 是命令接口,初始化*/
/****************************************************************/
/* Place port in reset - setting XRST & RRST to 0 */
/****************************************************************/
/*进行发送复位*/
sp0->gcontrol_bit.xreset = 0;
/*进行接收复位*/
sp0->gcontrol_bit.rreset = 0;
/****************************************************************/
/* Set values of all control registers */
/****************************************************************/
SERIAL_PORT_ADDR(0)->s_rxt_counter = 0x0; /*write Receive/Transmit Timer Counter Register*/
SERIAL_PORT_ADDR(0)->s_rxt_period = 0x3; /*write Receive/Transmit Timer Period Register*/
SERIAL_PORT_ADDR(0)->gcontrol = 0x01503c4; /*write Serial Port Global Control Register*/
SERIAL_PORT_ADDR(0)->s_r_control = 0x111; /*write FSR/DR/CLKR Port Control Register*/
SERIAL_PORT_ADDR(0)->s_x_control = 0x333; /*write FSX/DX/CLKX Port Control Register*/
SERIAL_PORT_ADDR(0)->s_rxt_control = 0x3cf; /*write Receive/Transmit Timer Control Register*/
sp0->gcontrol_bit.rreset = 1;
sp0->gcontrol_bit.xreset = 1;
asm(" nop ");
asm(" nop ");
/************************************************************************/
/* 设置CODEC的默认设置 */
/************************************************************************/
codec_reset((HANDLE) codec);
/*设置Line input channel volume control,设置增益为一半*/
if(codec_lineain_gain((HANDLE) codec, 0x17)== ERROR)
{
return (HANDLE) ERROR;
}
/* 设置麦克输出控制,输出增益为0DB*/
if(codec_headhponeout_gain((HANDLE) codec, 0x7b)== ERROR)
{
return (HANDLE) ERROR;
}
/*设置模拟部分的运行模式,输入选择LINE
DAC开
滤波旁路关
MIC输入0DB,正常方式,*/
if(codec_analog_mode((HANDLE) codec,0x10)== ERROR)
{
return (HANDLE) ERROR;
}
/*设置数字部分的运行模式*/
if(codec_digital_mode((HANDLE) codec, 0x30) == ERROR)
{
return (HANDLE) ERROR;
}
/*设置电源模式,所有部分均开放*/
if(codec_power((HANDLE) codec,0) == ERROR)
{
return (HANDLE) ERROR;
}
/*设置数据格式,CODEC工作为主方式
数据出现在BCLK的第二个上升沿
数据长度为16位
接口方式为DSP方式*/
if(codec_digital_format((HANDLE) codec,0x13) == ERROR)
{
return (HANDLE) ERROR;
}
/*设置波特率,输入与输出均为8K*/
if(codec_sample_rate((HANDLE) codec,0xe3) == ERROR)
{
return (HANDLE) ERROR;
}
/*启动CODEC*/
if(codec_write_reg((HANDLE) codec,Codec_DIA,1) == ERROR)
{
return (HANDLE) ERROR;
}
}
return (HANDLE) codec;
}
/******************************************************************************/
/* codec_close() -复位同步串口 */
/* 参数: */
/* hDevice - 已打开的有效的句柄 */
/* */
/******************************************************************************/
void codec_close(HANDLE hDevice)
{
sp0->gcontrol_bit.xreset = 0;
sp0->gcontrol_bit.rreset = 0;
}
/******************************************************************************/
/* codec_write_reg() - 写TLV320aic23B的控制寄存器 */
/*参数: */
/* hDevice - 对应控制接口的句柄; */
/* reg - 指示一个在寄存器枚举列表中的一个寄存器地址 */
/* regdata - 要写入的寄存器的数据*/
/*返回值: */
/* 要读的寄存器的值 */
/* */
/******************************************************************************/
int codec_write_reg(HANDLE hDevice, CodecReg reg,unsigned int value)
{
unsigned int output;
unsigned int timeout = 0x2000;
output = (reg << 0x9) + value;
/*等待数据准备好*/
while (!(sp0->gcontrol_bit.xrdy) && (timeout) )
{
timeout--;
};
if(timeout == 0)
{
return ERROR;
}
sp0->x_data = output;
delay(1000);
return OK;
}
/******************************************************************************/
/* codec_linein_gain() - 控制音频输入的音量的增益 */
/*参数: */
/* hDevice - 对应控制接口的句柄; */
/* gain - 输入音频通路的增益,0x0对应着-34.5DB, */
/* 0x1f对应着+12DB,最小增益调整为1.5DB */
/*返回值: */
/* 要读的寄存器的值 */
/* */
/******************************************************************************/
int codec_lineain_gain(HANDLE hDevice, unsigned int gain)
{
unsigned int aingain;
aingain = CODEC_LINEINGAIN_MODE + gain;
if(codec_write_reg(hDevice,Codec_LLIVC,aingain) == ERROR)
{
return ERROR;
}
if(codec_write_reg(hDevice,Codec_RLIVC,aingain) == ERROR)
{
return ERROR;
}
return OK;
}
/******************************************************************************/
/* codec_headphoneout_gain() - 控制音频输入的音量的增益 */
/*参数: */
/* hDevice - 对应控制接口的句柄; */
/* gain - 输入音频通路的增益,0x30对应着-73DB, */
/* 0x3F对应着+6DB,在这之间共有79个步进 增益值小于0x30为无效 */
/*返回值: */
/* 要读的寄存器的值 */
/******************************************************************************/
int codec_headhponeout_gain(HANDLE hDevice, unsigned int gain)
{
unsigned int aingain;
aingain = CODEC_PHONEINGAIN_MODE + gain;
if(codec_write_reg(hDevice,Codec_LHPVC,aingain) == ERROR)
{
return ERROR;
}
return OK;
}
/******************************************************************************/
/* codec_analog_mode() - 控制音频输入的设置 */
/*参数: */
/* hDevice - 对应控制接口的句柄; */
/* mode - adc的控制方式 */
/*返回值: */
/* 操作是否成功 */
/******************************************************************************/
int codec_analog_mode(HANDLE hDevice, unsigned int mode)
{
if(codec_write_reg(hDevice,Codec_AAPC,mode) == ERROR)
{
return ERROR;
}
return OK;
}
/******************************************************************************/
/* codec_digital_mode() - 控制音频输入的设置 */
/*参数: */
/* hDevice - 对应控制接口的句柄; */
/* mode - dac的控制方式 */
/*返回值: */
/* 操作是否成功 */
/******************************************************************************/
int codec_digital_mode(HANDLE hDevice, unsigned int mode)
{
if(codec_write_reg(hDevice,Codec_DAPC,mode) == ERROR)
{
return ERROR;
}
return OK;
}
/******************************************************************************/
/* codec_sample_rate() - 控制音频的采样频率 */
/*参数: */
/* hDevice - 对应控制接口的句柄; */
/* mode - sample rate的控制方式 */
/*返回值: */
/* 操作是否成功 */
/******************************************************************************/
int codec_sample_rate(HANDLE hDevice, unsigned int mode)
{
if(codec_write_reg(hDevice,Codec_SRC,mode) == ERROR)
{
return ERROR;
}
return OK;
}
/******************************************************************************/
/* codec_digital_format() - 控制音频的采样频率 */
/*参数: */
/* hDevice - 对应控制接口的句柄; */
/* mode - sample rate的控制方式 */
/*返回值: */
/* 操作是否成功 */
/******************************************************************************/
int codec_digital_format(HANDLE hDevice, unsigned int format)
{
if(codec_write_reg(hDevice,Codec_DAIF,format) == ERROR)
{
return ERROR;
}
return OK;
}
/******************************************************************************/
/* codec_power() - 各项功能的电源开关选择 */
/*参数: */
/* hDevice -控制接口的句柄 */
/* ctrl - 关于各项功能省电模式的控制 */
/* */
/******************************************************************************/
int codec_power(HANDLE hDevice, unsigned int ctrl)
{
if(codec_write_reg(hDevice,Codec_PDC,ctrl) == ERROR)
{
return ERROR;
}
return OK;
}
/******************************************************************************/
/* codec_reset() - 控制音频的复位 */
/*参数: */
/* hDevice - 对应控制接口的句柄; */
/*返回值: */
/* 操作是否成功 */
/******************************************************************************/
int codec_reset(HANDLE hDevice)
{
if(codec_write_reg(hDevice,Codec_RST,0) == ERROR)
{
return ERROR;
}
return OK;
}
main()
{
int i=0;
unsigned int section[100];
/*打开codec命令接口*/
*(volatile unsigned int *)syscntl = 0x10;
codec_command = codec_open(CODEC_COMMAND);
delay(1000);
/*选择输入*/
/* codec_analog_mode(codec_command,0x10);
/*设置 采样频率 8K*/
/* codec_sample_rate(codec_command,0x23);
/*打开codec数据接口*/
*(volatile unsigned int *)syscntl = 0x00;
codec_data = codec_open(CODEC_DATA);
(sp0->x_data) = audiodata;
while (1)
{
while (!(sp0->gcontrol_bit.rrdy)) {};
audiodata =( sp0->r_data);
(sp0->x_data) = audiodata;
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -