📄 audiorec.c
字号:
/*********************************************************************************
* AUDIOREC.C 测试音频实验的主程序 *
* 版权(c) 2003- 北京合众达电子技术有限责任公司 *
* 设计者: 段立锋 耿升辉 *
**********************************************************************************/
#include "type.h"
#include "codec.h"
#include "uart.h"
#include "sysreg.h"
#include "mcbsp54.h"
#include "memory.h"
/*帧长度的设定*/
#define FRAMLONGTH 0x104
/*帧类型的设定*/
#define TESTCODEDATA 0x0
#define UARTCOMMAND 0x2
/*程序帧的参数设定*/
#define TESTDATACONT 0x01
#define TESTDATAEND 0x00
/*命令帧的参数设定*/
#define UARTCONT 0x0 //命令帧不连续
#define RECIEVEGOOD 0xAA01//接收正确
#define RECIEVEERROR 0xAA02//接收错误
#define RECIEVEEND 0xAA03//接收结束
#define VAILDFRAME 0xAA04//无效帧
#define SYSRESET 0xAA05//系统复位
#define COMMANDNODO 0xAA06//程序不处理命令
#define AUDIOCOPY 0xAA07//音频存贮开始
#define AUDIOPLAY 0xAA08//音频回放
#define AUDIOGAIN 0xAA09//音频增益调整
#define AUDIOTRY 0xAA0A//音频试听
#define FLASHERROR 0xAA0B//FLash无法擦除
#define FLASHWERR 0xAA0C//Flash无法写入
#define FLASHWOK 0xAA0D//FLASH写入成功
#define FLASHWEND 0xAA0E//录音结束
#define INITOVER 0xAA0F//初始化完成
#define TESTCODEADDR 0x28000
#define FLASH_ADDR 0x10000
#define FLash_ADDR_MAX 0x3FFFF
#define DataLongth 0x100
typedef struct _UartForDec5416{
unsigned int Length;
unsigned int Type;
unsigned int Mutul;
unsigned int Data[DataLongth];
unsigned int Check;
}UartForDec5416, *PuartForDec5416;
HANDLE uart_a =0;
HANDLE codec_command =0;
HANDLE codec_data=0;
unsigned int audiodata =0;
PuartForDec5416 precieve =0;
unsigned int i= 0;
unsigned int k= 0;
int uart_s=0,uart_err=0,fifostatus=0;
unsigned long flashbaddr=0;
unsigned long flashaddr = 0;
PuartForDec5416 psend=0;
unsigned int errorsend = 0;
unsigned int uart[0x104] ={0};
unsigned int uarts[0x104] = {0};
//实验操控:
//选择TESTCOMMAND,1为试听;2为录音;3为录音回放。
//在录音过程中,执行会停在3个断点之一,
//这3个断点分别是擦除失败、写入失败、录音结束。
//执行到断点后,如果是前两个断点,说明硬件有故障。
//如果是录音结束,就可以结束程序了。
//选择CODECAGAIN,48-127之间。是调整增益的参数。
//最好在110-127之间,否则声音太小,难以听到。
#define TESTCOMMAND 1 //操作命令选择
#define CODECAGAIN 110 //操作参数选择
unsigned int TestCommand =0;//无操作
main()
{
/*设置系统时钟*/
sys_clk(CLK160);
/*初始化DEC5416板卡*/
dec5416_init();
#if TESTCOMMAND==1
TestCommand =AUDIOTRY;//试听
#endif
#if TESTCOMMAND==2
TestCommand =AUDIOCOPY;//录音
#endif
#if TESTCOMMAND==3
TestCommand =AUDIOPLAY;//音频回放
#endif
/*打开codec数据接口*/
codec_data = codec_open(CODEC_DATA);
/*打开codec命令接口*/
codec_command = codec_open(CODEC_COMMAND);
/*选择麦克风作为输入*/
codec_analog_mode(codec_command,0x14);
/*设置波特率,输入与输出均为8K*/
codec_sample_rate(codec_command,0xd);
/*配置系统存储器*/
memory_set(0x80);
//设置增益
codec_headhponeout_gain(codec_command,CODECAGAIN);
for(;;)
{
/*接收从主机的数据*/
switch(TestCommand)
{
/*音频试听*/
case AUDIOTRY:
/* Wait for sample from handset */
while (!MCBSP_RRDY(CODEC_DATA)) {};
/* Read sample from and write back to handset codec */
audiodata = *(volatile u16*)DRR1_ADDR(CODEC_DATA);
*(volatile u16*)DXR1_ADDR(CODEC_DATA) = audiodata;
break;
/*音频存贮开始*/
case AUDIOCOPY:
/*清除旧的音频数据*/
for(flashbaddr = 0x410000; flashbaddr<0x440000; flashbaddr=flashbaddr+0x8000)
{
if(flash_erase(flashbaddr,BLOCK_ERASE) == 0)
{
/*FLash无法擦除*/
TestCommand=0;
break;
}
}
flashaddr = FLASH_ADDR;
for(;;)
{
/* Wait for sample from handset */
while (!MCBSP_RRDY(CODEC_DATA)) {};
/* Read sample from and write back to handset codec */
audiodata = *(volatile u16*)DRR1_ADDR(CODEC_DATA);
if(flash_writes(flashaddr++,audiodata)==0)
{
/*FLash无法写入*/
TestCommand=0;
break;
}
k=k+1;
if(!(k-0x4000))
{
/*FLash写入成功*/
}
if(flashaddr-FLash_ADDR_MAX == 0)
{
/*录音结束*/
TestCommand=0;
break;
}
}
break;
/*音频回放*/
case AUDIOPLAY:
flashaddr = FLASH_ADDR;
for(;;)
{
audiodata = flash_reads(flashaddr++);
/* Wait for sample from handset */
while (!MCBSP_XRDY(CODEC_DATA)) {};
/*write back to handset codec */
*(volatile u16*)DXR1_ADDR(CODEC_DATA) = audiodata;
if(flashaddr - FLash_ADDR_MAX == 0)
{
break;
}
}
break;
default:
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -