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

📄 audiorec.c

📁 TMS320C54X的AD转换和语音录制、播放源程序
💻 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 + -