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

📄 audiodriver.c

📁 使用DSP的MCBSP与EDMA连接ADC和DAC,进行信号的采样与重建
💻 C
字号:
/******************************************************************************\
*           Copyright (C) 2004 TongGuangLong Science&Technologies Inc.
*                           All Rights Reserved
*------------------------------------------------------------------------------
* MODULE NAME... AudioDriver
* FILENAME...... AudioDriver.c
* DATE CREATED.. ShiQuanwang 08/17/2004
* PROJECT....... T0003
* PREREQUISITS..
*------------------------------------------------------------------------------
* HISTORY:
*   CREATED:       08/17/2004.
*
*------------------------------------------------------------------------------
* DESCRIPTION:
*
\******************************************************************************/

#include <csl.h>
#include <csl_mcbsp.h>
#include <csl_irq.h>
#include "config2cfg.h"
#include "AudioDriver.h"
#include "queue.h"
#include "McuDspIntf.h"
#include "VarDef.h"

#define   DEVICE_NOT_START    0
#define   DEVICE_START        1

#define   ENCODE           1
#define   NO_ENCODE        0

#define   DECODE           1
#define   NO_DECODE        0

#define   SPEECH_LENGTH    200

/*
static int s_swa_NBAudioFirCoef16K[29] = {-179,-151,300,824,601,-391,-845,209,1482,635,-2008,-2474,2407,10075,
      									13835,10075,2407,-2474,-2008,635,1482,209,-845,-391,601,824,300,-151,-179};

static int s_swa_AudioFirBuff[29];
*/
MCBSP_Handle hMcbsp0;

unsigned int g_uw_AdStartFlag = DEVICE_NOT_START;
Queue        g_strc_EncQue;
unsigned int g_uwa_EncBuff[4][4];

unsigned int g_uw_DaStartFlag = DEVICE_NOT_START;
Queue        g_strc_RcvQue;
unsigned int g_uwa_RcvBuff[32][8];
extern unsigned char g_uc_CfgAd7331Flg;
extern unsigned char g_uc_Ad7331RstFLg;
static unsigned int s_uw_ADSmpl = 0;

void AudioDAStart(void)
{
	if (g_uw_DaStartFlag == DEVICE_NOT_START)
	{
		IRQ_clear(IRQ_EVT_XINT0);

		g_uw_DaStartFlag = DEVICE_START;

		hMcbsp0 = MCBSP_open(MCBSP_PORT0, MCBSP_OPEN_RESET);

	    MCBSP_config(hMcbsp0, &mcbspCfgAudio);
	    
		MCBSP_start(hMcbsp0, MCBSP_XMIT_START | MCBSP_SRGR_START | MCBSP_SRGR_FRAMESYNC, 0x0008);

		IRQ_enable(IRQ_EVT_XINT0);
	}
}


void AudioDAWr(int sw_XData)
{	
	MCBSP_write(hMcbsp0, sw_XData);
	//MCBSP_write(hMcbsp0, i);
}

void AudioDAClose(void)
{
	if (g_uw_DaStartFlag == DEVICE_START)
	{
		MCBSP_close(hMcbsp0);
	    IRQ_disable(IRQ_EVT_XINT0);
		IRQ_clear(IRQ_EVT_XINT0);
	    g_uw_DaStartFlag = DEVICE_NOT_START;
	}
}
short g_shwa_SendSig[512];
unsigned int g_uw_SendSmplCnt = 0;
static short s_shw_RcvSig;

void AudioDAIsr(void)
{
	static unsigned short s_uhwa_AD73311Reg[12] = 
	{0, 0, 0, 0, 0x8111, 0x8279, 0x8300, 0x8001, 0, 0, 0, 0};                //{0x8111, 0x8279, 0x8300, 0x8001};
	//{0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555}; 	
	static unsigned short s_uhw_CfgRegNo = 0;
	static unsigned int s_uw_SendTestData = 0;

//定义一个数组,逐次写入N个控制字;在写入所有控制字之后,就将DA缓存的数据写入DA芯片。	
	if (g_uc_CfgAd7331Flg == 0)
	{
		AudioDAWr(s_uhwa_AD73311Reg[s_uhw_CfgRegNo++]);
		if (s_uhw_CfgRegNo == 12)
		{	
			g_uc_CfgAd7331Flg = 1;
			s_uhw_CfgRegNo = 0;
			LOG_printf(&trace, "Config Over");
		}
	}
	else
	{
		AudioDAWr(g_swa_DaSmpl[g_sw_DaSmplPingPongFlg][g_sw_DaSmplCnt]);
		//AudioDAWr(s_uw_ADSmpl);
		g_sw_DaSmplCnt++;
		if (g_sw_DaSmplCnt >= 2 * SPEECH_LENGTH)
		{
			g_sw_DaSmplPingPongFlg ^= 0x1;
			g_sw_DaSmplCnt = 0;
			g_uw_Decoding = DECODE;
		}
	}
	LOG_printf(&trace,"da copy");
}

 
void AudioADStart(void)
{
	if (g_uw_AdStartFlag == DEVICE_NOT_START)
	{
		IRQ_clear(IRQ_EVT_RINT0);
	
	    g_uw_AdStartFlag = DEVICE_START;

		hMcbsp0 = MCBSP_open(MCBSP_PORT0, MCBSP_OPEN_RESET);
		
	    MCBSP_config(hMcbsp0, &mcbspCfgAudio);
	    
		MCBSP_start(hMcbsp0, MCBSP_RCV_START | MCBSP_SRGR_START | MCBSP_SRGR_FRAMESYNC, 0x0008);
		
		IRQ_enable(IRQ_EVT_RINT0);
		
		LOG_printf(&trace, "Ad Cfg Over");
		
	}
}

void AudioDuplexEnd(void)
{
	if (g_uw_DaStartFlag == DEVICE_START)
	{
		MCBSP_close(hMcbsp0);
	    IRQ_disable(IRQ_EVT_XINT0);
	    IRQ_disable(IRQ_EVT_RINT0);
   	    IRQ_clear(IRQ_EVT_XINT0);
	    IRQ_clear(IRQ_EVT_RINT0);
	    g_uw_DaStartFlag = DEVICE_NOT_START;
	}
}

void AudioDuplexStart(void)
{
	if (g_uw_AdStartFlag == DEVICE_NOT_START)
	{
		IRQ_clear(IRQ_EVT_RINT0);
		IRQ_clear(IRQ_EVT_XINT0);
	
	    g_uw_AdStartFlag = DEVICE_START;

		hMcbsp0 = MCBSP_open(MCBSP_PORT0, MCBSP_OPEN_RESET);
		MCBSP_config(hMcbsp0, &mcbspCfgAudio);
    	MCBSP_start(hMcbsp0, MCBSP_RCV_START | MCBSP_XMIT_START|MCBSP_SRGR_START, 10);
		
		IRQ_enable(IRQ_EVT_RINT0);
		IRQ_enable(IRQ_EVT_XINT0);
	}
}
int AudioADRd(void)
{
	int sw_RcvData;

	sw_RcvData = MCBSP_read(hMcbsp0);

	return(sw_RcvData);
}

void AudioADClose(void)
{
	if (g_uw_AdStartFlag == DEVICE_START)
	{
		MCBSP_close(hMcbsp0);
	    IRQ_disable(IRQ_EVT_RINT0);
		IRQ_clear(IRQ_EVT_RINT0);
	    g_uw_AdStartFlag = DEVICE_NOT_START;
	}
}

void AudioADIsr(void)
{	
	//g_swa_AdSmpl[g_sw_AdSmplPingPongFlg][g_sw_AdSmplCnt] = AudioADRd();
	g_swa_AdSmpl[g_sw_AdSmplPingPongFlg][g_sw_AdSmplCnt] = g_swa_MatlabSinDataInput[g_sw_MatsinDataCnt++];
	if(g_sw_MatsinDataCnt >= 99)
	{
	 	g_sw_MatsinDataCnt = 0;
	}
	
	g_sw_AdSmplCnt++;
	if (g_sw_AdSmplCnt >= SPEECH_LENGTH)
	{
		g_sw_AdSmplPingPongFlg ^= 0x1;
		g_sw_AdSmplCnt = 0;
		g_uw_Encoding = ENCODE;
	}
	//LOG_printf(&trace,"here is ADISR");
}
//g_sw_AdSmplPingPongFlg 0 和 1 , 二维数组
void Ad7331Rst(void)
{
	unsigned int i;
	asm(" ssbx XF ");
	
	for (i = 0; i < 10000; i++)
	{
		asm(" NOP ");
		asm(" NOP ");
		asm(" NOP ");
		asm(" NOP ");
	}	
	
	asm(" rsbx XF ");
	
	for (i = 0; i < 60000; i++)
	{
		asm(" NOP ");
		asm(" NOP ");
		asm(" NOP ");
		asm(" NOP ");
	}
	
	asm(" ssbx XF ");
	
	for (i = 0; i < 10000; i++)
	{
		asm(" NOP ");
		asm(" NOP ");
		asm(" NOP ");
		asm(" NOP ");
	}
	
	return;	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -