📄 audiorec.c
字号:
/*********************************************************************************
* MCPSB.C v1.00 测试MCBSP同步串口测试的主程序 *
* 版权(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};
main()
{
/*设置系统时钟*/
sys_clk(CLK160);
/*初始化DEC5416板卡*/
dec5416_init();
for(i= 0; i<0x104;i++)
{
uart[i] = 0x5555;
uarts[i] = 0x5555;
}
/*打开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);
/*获取有效的串口句柄*/
uart_a = uart_open(UART_A);
/*初始化串口*/
uart_setup(uart_a, /*串口A*/
buad_19k2, /*串口的波特率设置*/
data_w8, /*数据长度为8*/
data_s1, /*数据停止位为1*/
//uart_parity, /*设置奇较验位*/
0,
(fifo_enable+fifo_txdip16+fifo_rxdip16),/*FIFO设置*/
0); /*设置自闭环方式*/
/*串口A中断设置*/
uart_interrupt_control( uart_a, uartint_rhr, uart_enable);
/*设置接收长度*/
uart_reclong_set(uart_a,FRAMLONGTH);
/*打开系统的串口中断*/
sysint_enable(0x2);
/*配置系统存储器*/
memory_set(0x80);
/*实验主控程序*/
psend = (PuartForDec5416)(&uarts[0]);
/*通知主机,系统准备好*/
psend->Length = FRAMLONGTH;
psend->Type = UARTCOMMAND;
psend->Data[0] = INITOVER;
psend->Mutul = UARTCONT;
uart_send(uart_a,FRAMLONGTH, (unsigned int *)psend);
for(;;)
{
uart_recive(uart_a,&uart[0]);
/*判断串口的状态*/
uart_s =uart_status(uart_a);
if( uart_s == 2)
{
/*读RHR清 RHR interrupt*/
uart_read_reg(uart_a,rhr);
/*复位FIFO指针*/
fifostatus = uart_read_reg(uart_a,fcr);
uart_write_reg(uart_a,fcr,fifo_rreset);
uart_write_reg(uart_a,fcr,fifostatus);
continue;
}
/*串口出错*/
if(uart_s == ERROR)
{
/*读状态寄存器*/
uart_err = uart_read_reg(uart_a,lsr);
/*复位FIFO指针*/
fifostatus = uart_read_reg(uart_a,fcr);
uart_write_reg(uart_a,fcr,fifo_rreset);
uart_write_reg(uart_a,fcr,fifostatus);
/*通知主机程序通讯出错,准备重发*/
psend->Length = FRAMLONGTH;
psend->Type = UARTCOMMAND;
psend->Data[0] = RECIEVEERROR;
psend->Mutul = UARTCONT;
uart_send(uart_a,FRAMLONGTH-1, (unsigned int *)psend);
continue;
}
/*数据较验出错*/
if(uart_s == 3)
{
/*通知主机程序通讯出错,准备重发*/
psend->Length = FRAMLONGTH;
psend->Type = UARTCOMMAND;
psend->Data[0] = RECIEVEERROR;
psend->Mutul = UARTCONT;
uart_send(uart_a,FRAMLONGTH-1, (unsigned int *)psend);
continue;
}
/*数据未准备好*/
if(uart_s == 0)
{
precieve = (PuartForDec5416)(&uart[0]);
/*不是命令帧*/
if(precieve->Type != UARTCOMMAND)
{
/*无效命令*/
psend->Length = FRAMLONGTH;
psend->Type = UARTCOMMAND;
psend->Data[0] = COMMANDNODO;
psend->Mutul = UARTCONT;
uart_send(uart_a,FRAMLONGTH-1, (unsigned int *)psend);
}
continue;
}
/*接收从主机的数据*/
precieve = (PuartForDec5416)(&uart[0]);
switch(precieve->Data[0])
{
/*音频试听*/
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 AUDIOGAIN:
codec_headhponeout_gain(codec_command, precieve->Data[1]);
precieve->Data[0] = AUDIOTRY;
break;
/*音频存贮开始*/
case AUDIOCOPY:
/*清除旧的音频数据*/
for(flashbaddr = 0x410000; flashbaddr<0x440000; flashbaddr=flashbaddr+0x8000)
{
if(flash_erase(flashbaddr,BLOCK_ERASE) == 0)
{
/*FLash无法擦除*/
psend->Length = FRAMLONGTH;
psend->Type = UARTCOMMAND;
psend->Data[0] = FLASHERROR;
psend->Mutul = UARTCONT;
uart_send(uart_a,FRAMLONGTH, (unsigned int *)psend);
precieve->Data[0] =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无法写入*/
psend->Length = FRAMLONGTH;
psend->Type = UARTCOMMAND;
psend->Data[0] = FLASHWERR;
psend->Mutul = UARTCONT;
uart_send(uart_a,FRAMLONGTH, (unsigned int *)psend);
precieve->Data[0] =0;
break;
}
k=k+1;
if(!(k-0x4000))
{
/*FLash写入成功*/
psend->Length = FRAMLONGTH;
psend->Type = UARTCOMMAND;
psend->Data[0] = FLASHWOK;
psend->Mutul = UARTCONT;
uart_send(uart_a,FRAMLONGTH, (unsigned int *)psend);
}
if(flashaddr-FLash_ADDR_MAX == 0)
{
/*录音结束*/
psend->Length = FRAMLONGTH;
psend->Type = UARTCOMMAND;
psend->Data[0] = FLASHWEND;
psend->Mutul = UARTCONT;
uart_send(uart_a,FRAMLONGTH, (unsigned int *)psend);
precieve->Data[0] =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;
/*系统复位*/
case SYSRESET:
sys_set(0x4);
break;
default:
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -