为什么采样到DMA哪里只能接收一次,为什么中断,什么的都没有触发它中断??进行的FFT运算也不可以??求解,,困惑好久了
/******************************************************************************/
/* Copyright 2004 by SEED Electronic Technology LTD. */
/* All rights reserved. SEED Electronic Technology LTD. */
/* Restricted rights to use, duplicate or disclose this code are */
/* granted through contract. */
/* */
/* MODULE NAME... IIC and Mcbsp */
/* FILENAME...... 5502_CODEC.c */
/* DESCRIPTION: */
/* This is an audio signal sample and play example for CODEC of C5502 */
/* This example is that the codec is controled by the IIC and Mcbsp */
/* */
/******************************************************************************/
#include <csl.h>
#include <csl_chip.h>
#include <csl_i2c.h>
#include <csl_pll.h>
#include <csl_mcbsp.h>
#include <csl_emif.h>
#include <csl_emifBhal.h>
#include <csl_std.h>
#include <csl_dma.h>
#include <csl_irq.h>
#include "E2PROM_Function.h"
#include "CODEC.h"
#include "i_cmplx.h"
#include <math.h>
#undef CODEC_ADDR
#define CODEC_ADDR 0x1A
#define AUDIOTRY 0xAA0A//音频试听
#define AUDIOCOPY 0xAA07//音频存贮并回放
#define TESTCOMMAND 1 //操作命令选择
short DataBuffer[1024]={0};
COMPLEX DDataBuffer[512*2]={0};
Uint32 mod[512*2];
int i;
unsigned int m=0;
long n;
short p,q;
/* Constants for the buffered ping-pong transfer */
#define BUFFSIZE 512
#define PING 0
#define PONG 1
//#define SCALE 1
/* Data buffer declarations - the program uses four logical buffers of size * BUFFSIZE, one ping and one pong buffer on both receive and transmit sides. */
#pragma DATA_SECTION (gBufferXmtPing, "buffer_sect");
Uint32 gBufferXmtPing[BUFFSIZE/2]; // Transmit PING buffer
#pragma DATA_SECTION (gBufferXmtPong, "buffer_sect");
Uint32 gBufferXmtPong[BUFFSIZE/2]; // Transmit PONG buffer
#pragma DATA_SECTION (gBufferRcvPing, "buffer_sect");
Int16 gBufferRcvPing[BUFFSIZE]; // Receive PING buffer
#pragma DATA_SECTION (gBufferRcvPong, "buffer_sect");
Int16 gBufferRcvPong[BUFFSIZE]; // Receive PONG buffer
#pragma DATA_SECTION (gBufferRcvPingleft, "buffer_sect");
Int16 gBufferRcvPingleft[BUFFSIZE/2]; // Receive PING buffer
#pragma DATA_SECTION (gBufferRcvPongleft, "buffer_sect");
Int16 gBufferRcvPongleft[BUFFSIZE/2]; // Receive PONG buffer
#pragma DATA_SECTION (gBufferRcvPingright, "buffer_sect");
Int16 gBufferRcvPingright[BUFFSIZE/2]; // Receive PING buffer
#pragma DATA_SECTION (gBufferRcvPongright, "buffer_sect");
Int16 gBufferRcvPongright[BUFFSIZE/2]; // Receive PONG buffer
MCBSP_Config Mcbsp1Config = {
0x2080,
/* MCBSP_SPCR1_RMK(
MCBSP_SPCR1_DLB_OFF, // DLB = 0
MCBSP_SPCR1_RJUST_LZF, // RJUST = 0,right justify the data and zero fill the MSBs
MCBSP_SPCR1_CLKSTP_DISABLE, // CLKSTP = 0
MCBSP_SPCR1_DXENA_ON, // DXENA = 1,DX delay enabler on
0, // Reserved = 0
MCBSP_SPCR1_RINTM_RRDY, // RINTM = 0
MCBSP_SPCR1_RSYNCERR_NO, // RSYNCER = 0
MCBSP_SPCR1_RFULL_NO, // RFULL = 0
MCBSP_SPCR1_RRDY_NO, // RRDY = 0
MCBSP_SPCR1_RRST_DISABLE // RRST = 0; Disable receiver
),*/
0x00c4,
/* MCBSP_SPCR2_RMK(
MCBSP_SPCR2_FREE_NO, // FREE = 0
MCBSP_SPCR2_SOFT_NO, // SOFT = 0
MCBSP_SPCR2_FRST_FSG, // FRST = 1 Enable the frame-sync logic
MCBSP_SPCR2_GRST_CLKG,// GRST = 1 The sample rate generator is take out of its reset state
MCBSP_SPCR2_XINTM_XRDY, // XINTM = 0
MCBSP_SPCR2_XSYNCERR_NO, // XSYNCER =0 //
MCBSP_SPCR2_XEMPTY_NO, // XEMPTY = 0
MCBSP_SPCR2_XRDY_NO, // XRDY = 0
MCBSP_SPCR2_XRST_DISABLE // XRST = 0 Disable transimitter
),*/
// 单数据相,接受数据长度为16位,每相2个数据
MCBSP_RCR1_RMK(
MCBSP_RCR1_RFRLEN1_OF(1), // RFRLEN1 = 1
MCBSP_RCR1_RWDLEN1_16BIT // RWDLEN1 = 2
),
MCBSP_RCR2_RMK(
MCBSP_RCR2_RPHASE_SINGLE, // RPHASE = 0
MCBSP_RCR2_RFRLEN2_OF(0), // RFRLEN2 = 0
MCBSP_RCR2_RWDLEN2_8BIT, // RWDLEN2 = 0
MCBSP_RCR2_RCOMPAND_MSB, // RCOMPAND = 0 No companding,any size data, MSB received first
MCBSP_RCR2_RFIG_YES, // RFIG = 1 Frame-sync ignore
MCBSP_RCR2_RDATDLY_1BIT // RDATDLY = 1 1-bit data delay
),
MCBSP_XCR1_RMK(
MCBSP_XCR1_XFRLEN1_OF(1), // XFRLEN1 = 1
MCBSP_XCR1_XWDLEN1_16BIT // XWDLEN1 = 2
),
MCBSP_XCR2_RMK(
MCBSP_XCR2_XPHASE_SINGLE, // XPHASE = 0
MCBSP_XCR2_XFRLEN2_OF(0), // XFRLEN2 = 0
MCBSP_XCR2_XWDLEN2_8BIT, // XWDLEN2 = 0
MCBSP_XCR2_XCOMPAND_MSB, // XCOMPAND = 0
MCBSP_XCR2_XFIG_YES, // XFIG = 1 Unexpected Frame-sync ignore
MCBSP_XCR2_XDATDLY_1BIT // XDATDLY = 1 1-bit data delay
),
MCBSP_SRGR1_DEFAULT,
MCBSP_SRGR2_DEFAULT,
MCBSP_MCR1_DEFAULT,
MCBSP_MCR2_DEFAULT,
0X0007,
/* MCBSP_PCR_RMK(
// MCBSP_PCR_IDLEEN_RESET, // IDLEEN = 0
MCBSP_PCR_XIOEN_SP, // XIOEN = 0
MCBSP_PCR_RIOEN_SP, // RIOEN = 0
MCBSP_PCR_FSXM_EXTERNAL, // FSXM = 0 Tranmit frame-syn is provided by AIC23B
MCBSP_PCR_FSRM_EXTERNAL, // FSRM = 0 Receive frame-syn is provided by AIC23B
MCBSP_PCR_CLKXM_INPUT, // CLKR is input
MCBSP_PCR_CLKRM_INPUT, // CLKX is input
MCBSP_PCR_SCLKME_NO, // SCLKME=0 CLKG is taken from the McBSP internal input clock
// MCBSP_PCR_CLKSSTAT_0, // The signal on the CLKS pin is low
MCBSP_PCR_DXSTAT_0, // Drive the signal on the DX pin low
// MCBSP_PCR_DRSTAT_0, // The signal on the DR pin is low
MCBSP_PCR_FSXP_ACTIVEHIGH, // FSXP = 1 Because a falling edge on LRCIN or LRCOUT starts data transfer
MCBSP_PCR_FSRP_ACTIVELOW, // FSRP = 1
MCBSP_PCR_CLKXP_FALLING, // CLKXP = 1 The falling edge of BCLK starts data transfer
MCBSP_PCR_CLKRP_RISING // CLKRP = 1
), */
MCBSP_RCERA_DEFAULT,
MCBSP_RCERB_DEFAULT,
MCBSP_RCERC_DEFAULT,
MCBSP_RCERD_DEFAULT,
MCBSP_RCERE_DEFAULT,
MCBSP_RCERF_DEFAULT,
MCBSP_RCERG_DEFAULT,
MCBSP_RCERH_DEFAULT,
MCBSP_XCERA_DEFAULT,
MCBSP_XCERB_DEFAULT,
MCBSP_XCERC_DEFAULT,
MCBSP_XCERD_DEFAULT,
MCBSP_XCERE_DEFAULT,
MCBSP_XCERF_DEFAULT,
MCBSP_XCERG_DEFAULT,
MCBSP_XCERH_DEFAULT
};
DMA_Config dmaRcvConfig = {
DMA_DMACSDP_RMK( //源和目的参数寄存器
DMA_DMACSDP_DSTBEN_NOBURST,
DMA_DMACSDP_DSTPACK_OFF, //对数据进行打包
DMA_DMACSDP_DST_DARAMPORT1, //目的地址是内存端口1
DMA_DMACSDP_SRCBEN_NOBURST,
DMA_DMACSDP_SRCPACK_OFF,
DMA_DMACSDP_SRC_PERIPH, //源地址是外设
DMA_DMACSDP_DATATYPE_16BIT
), /* DMACSDP */
DMA_DMACCR_RMK( //通道控制寄存器
DMA_DMACCR_DSTAMODE_POSTINC,
DMA_DMACCR_SRCAMODE_CONST,
DMA_DMACCR_ENDPROG_OFF, /* ENDPROG OFF */
DMA_DMACCR_WP_DEFAULT,
DMA_DMACCR_REPEAT_OFF,
DMA_DMACCR_AUTOINIT_ON, /* AUTOINIT ON */
DMA_DMACCR_EN_STOP,
DMA_DMACCR_PRIO_LOW,
DMA_DMACCR_FS_DISABLE,
DMA_DMACCR_SYNC_REVT1
), /* DMACCR */
DMA_DMACICR_RMK( //中断控制寄存器
DMA_DMACICR_AERRIE_ON,
DMA_DMACICR_BLOCKIE_OFF,
DMA_DMACICR_LASTIE_OFF,
DMA_DMACICR_FRAMEIE_ON,
DMA_DMACICR_FIRSTHALFIE_OFF,
DMA_DMACICR_DROPIE_OFF,
DMA_DMACICR_TIMEOUTIE_OFF
), /* DMACICR */
(DMA_AdrPtr)(MCBSP_ADDR(DRR11)), /* DMACSSAL */
0, /* DMACSSAU */
NULL, /* DMACDSAL, to be loaded by submit */
0, /* DMACDSAU */
BUFFSIZE, /* DMACEN */
1, /* DMACFN */
0, /* DMACFI */
0 /* DMACEI */
};
DMA_Config dmaXmtConfig = {
DMA_DMACSDP_RMK( //源和目的参数寄存器
DMA_DMACSDP_DSTBEN_NOBURST,
DMA_DMACSDP_DSTPACK_OFF,
DMA_DMACSDP_DST_PERIPH, //目的地址是外设
DMA_DMACSDP_SRCBEN_NOBURST,
DMA_DMACSDP_SRCPACK_OFF,
DMA_DMACSDP_SRC_DARAMPORT0, //源地址是内存端口0
DMA_DMACSDP_DATATYPE_16BIT
), /* DMACSDP */
DMA_DMACCR_RMK( //通道控制寄存器
DMA_DMACCR_DSTAMODE_CONST, //固定
DMA_DMACCR_SRCAMODE_POSTINC,
DMA_DMACCR_ENDPROG_ON,
DMA_DMACCR_WP_DEFAULT,
DMA_DMACCR_REPEAT_OFF,
DMA_DMACCR_AUTOINIT_OFF,
DMA_DMACCR_EN_STOP,
DMA_DMACCR_PRIO_LOW,
DMA_DMACCR_FS_DISABLE,
DMA_DMACCR_SYNC_XEVT1
), /* DMACCR */
DMA_DMACICR_RMK( //通道中断寄存器
DMA_DMACICR_AERRIE_ON,
DMA_DMACICR_BLOCKIE_OFF,
DMA_DMACICR_LASTIE_OFF,
DMA_DMACICR_FRAMEIE_ON,
DMA_DMACICR_FIRSTHALFIE_OFF,
DMA_DMACICR_DROPIE_OFF,
DMA_DMACICR_TIMEOUTIE_OFF
), /* DMACICR */
NULL, /* DMACDSAL, to be loaded by submit */
0, /* DMACSSAU */
(DMA_AdrPtr)(MCBSP_ADDR(DXR11)), /* DMACDSAL */
0, /* DMACDSAU */
BUFFSIZE, /* DMACEN */
1, /* DMACFN */
0, /* DMACFI */
0 /* DMACEI */
};
/* Define a DMA_Handle object to be used with DMA_open function */
DMA_Handle hDmaRcv, hDmaXmt;
/* Define a MCBSP_Handle object to be used with MCBSP_open function */
// 定义McBSP的句柄
MCBSP_Handle hMcbsp;
//volatile Uint16 transferComplete = FALSE;
//Uint16 err = 0;
Uint16 old_intm;
Uint16 xmtEventId, rcvEventId;
/* This symbol is defined in file vectors.s55 */
extern void VECSTART(void);
void copyData(unsigned long *inbuf, unsigned long *outbuf, Int16 length);
/* Protoype for interrupt functions */
interrupt void dmaXmtIsr(void);
interrupt void dmaRcvIsr(void);
void taskFxn(void);
void copyData(unsigned long *inbuf, unsigned long *outbuf, Int16 length)
{
Int16 i = 0;
// rfft(inbuf,length,SCALE);
for (i = 0; i < length; i++)
{
outbuf[i] = inbuf[i];
}
}
void processBuffer(void) //缓冲数据的处理
{
Uint32 addr;
//Int16 DataTemp;
static Int16 pingPong = PING;
while(DMA_FGETH (hDmaRcv, DMACCR, ENDPROG))
{
}
// Determine which ping-pong state we're in
if (pingPong == PING)
{
// Configure the receive channel for pong input data
addr = ((Uint32)gBufferRcvPong) << 1;
DMA_RSETH(hDmaRcv, DMACDSAL, addr & 0xffff);
DMA_RSETH(hDmaRcv, DMACDSAU, (addr >> 16) & 0xffff); // Set new state to PONG
pingPong = PONG;
}
else
{
// Configure the receive channel for ping input data
addr = ((Uint32)gBufferRcvPing) << 1;
DMA_RSETH(hDmaRcv, DMACDSAL, addr & 0xffff);
DMA_RSETH(hDmaRcv, DMACDSAU, (addr >> 16) & 0xffff); // Set new state to PING
pingPong = PING;
}
DMA_FSETH (hDmaRcv, DMACCR, ENDPROG, 1);
// DMA_FSETH (hDmaXmt, DMACCR, ENDPROG, 1);
if (pingPong == PONG)
{
//Insert your application program here
// copyData(gBufferRcvPing, gBufferXmtPing, BUFFSIZE);
for(i=0;i<(BUFFSIZE/2);i++)
{
gBufferRcvPingleft[i]=gBufferRcvPing[2*i];
gBufferRcvPingright[i]=gBufferRcvPing[2*i+1];
}
for(i=0;i<(BUFFSIZE/2/2);i++)
{
DDataBuffer[i].real=gBufferRcvPingleft[2*i]; //short int
DDataBuffer[i].imag=gBufferRcvPingleft[2*i+1]; //short int
}
fft256(DDataBuffer,256);
m=0;
for(i=0;i<128;i++)
{
p=DDataBuffer[i].real; // 实部
q=DDataBuffer[i].imag; //虚部
n=(long)p*(long)p+(long)q*(long)q;
mod[m]=sqrt(n); //幅度谱
m++;
}
for(i=0;i<BUFFSIZE/2/2;i++)
{ //gBufferXmtPing[i]=-(gBufferXmtPing[i]<<16);
gBufferXmtPing[i]=-(mod[i]<<16);
}
for(i=0;i<(BUFFSIZE/2/2);i++)
{
DDataBuffer[i].real=gBufferRcvPingright[2*i]; //short int
DDataBuffer[i].imag=gBufferRcvPingright[2*i+1]; //short int
}
fft256(DDataBuffer,256);
m=0;
for(i=0;i<128;i++)
{
p=DDataBuffer[i].real;
q=DDataBuffer[i].imag;
n=(long)p*(long)p+(long)q*(long)q;
mod[m]=sqrt(n);
m++;
}
for(i=0;i<BUFFSIZE/2/2;i++)
{ //gBufferXmtPing[i]=-(gBufferXmtPing[i]<<16);
gBufferXmtPing[i+BUFFSIZE/2/2]=-(mod[i]<<16);
}
addr = ((Uint32)gBufferXmtPing) << 1;
DMA_RSETH(hDmaXmt, DMACSSAL, addr & 0xffff);
DMA_RSETH(hDmaXmt, DMACSSAU, (addr >> 16) & 0xffff);
}
else
{
for(i=0;i<(BUFFSIZE/2);i++)
{
gBufferRcvPongleft[i]=gBufferRcvPong[2*i];
gBufferRcvPongright[i]=gBufferRcvPong[2*i+1];
}
for(i=0;i<(BUFFSIZE/2/2);i++)
{
DDataBuffer[i].real=gBufferRcvPongleft[2*i]; //short int
DDataBuffer[i].imag=gBufferRcvPongleft[2*i+1]; //short int
}
fft256(DDataBuffer,256);
m=0;
for(i=0;i<128;i++)
{
p=DDataBuffer[i].real;
q=DDataBuffer[i].imag;
n=(long)p*(long)p+(long)q*(long)q;
mod[m]=sqrt(n);
m++;
}
for(i=0;i<BUFFSIZE/2/2;i++)
{ //gBufferXmtPing[i]=-(gBufferXmtPing[i]<<16);
gBufferXmtPong[i]=-(mod[i]<<16);
}
for(i=0;i<(BUFFSIZE/2/2);i++)
{
DDataBuffer[i].real=gBufferRcvPongright[2*i]; //short int
DDataBuffer[i].imag=gBufferRcvPongright[2*i+1]; //short int
}
fft256(DDataBuffer,256);
m=0;
for(i=0;i<128;i++)
{
p=DDataBuffer[i].real;
q=DDataBuffer[i].imag;
n=(long)p*(long)p+(long)q*(long)q;
mod[m]=sqrt(n);
m++;
}
for(i=0;i<BUFFSIZE/2/2;i++)
{ //gBufferXmtPing[i]=-(gBufferXmtPing[i]<<16);
gBufferXmtPong[i+BUFFSIZE/2/2]=-(mod[i]<<16);
}
addr = ((Uint32)gBufferXmtPong) << 1;
DMA_RSETH(hDmaXmt, DMACSSAL, addr & 0xffff);
DMA_RSETH(hDmaXmt, DMACSSAU, (addr >> 16) & 0xffff);
}
}
/*------------------------------------------------------------------------------------*/
//
// FUNCTION: MAIN
//
/*------------------------------------------------------------------------------------*/
void main(void)
{
Uint16 i;
/* Uint16 DataTempLeft = 0; // 暂存采样数据
Uint16 DataTempRight = 0;
Uint16 TestCommand =0;
Int16 DataTemp;
CSL_init();
#if TESTCOMMAND==1
TestCommand =AUDIOTRY;//试听
#endif */
// The main frequency of system is 240MHz
// 该频率是为了设置IIC模块的需要设置的,为了使用I2C_setup函数 12*20=240
PLL_setFreq(1, 0xC, 0, 1, 3, 3, 0);
//EMIF初始化
Emif_Config();
// Open McBSP port 1 and get a McBSP type handle 打开通道1
hMcbsp = MCBSP_open(MCBSP_PORT1,MCBSP_OPEN_RESET);
// Config McBSP port 1 by use previously defined structure MCBSP初始化
MCBSP_config(hMcbsp, &Mcbsp1Config);
//I2C初始化
I2C_cofig();
//CODEC寄存器初始化
inti_AIC();
/* Set IVPH/IVPD to start of interrupt vector table */
IRQ_setVecs((Uint32)(&VECSTART));
for (i = 0; i <= BUFFSIZE - 1; i++)
{
gBufferXmtPing[i] = 0;
gBufferXmtPong[i] = 0;
}
/* Call function to effect transfer */
taskFxn();
/* while(1)
{ switch(TestCommand)
{
//音频试听/
case AUDIOTRY:
// 左通路数据 /
while(!MCBSP_rrdy(hMcbsp)){};
DataTempLeft = MCBSP_read16(hMcbsp);
// 右通路数据 /
while(!MCBSP_rrdy(hMcbsp)){};
DataTempRight = MCBSP_read16(hMcbsp);
// 左声道耳机输出 /
while(!MCBSP_xrdy(hMcbsp)) {};
MCBSP_write16(hMcbsp,DataTempLeft);
// 右声道耳机输出 /
while(!MCBSP_xrdy(hMcbsp)) {};
MCBSP_write16(hMcbsp,DataTempRight);
// gBufferRcvPing[i]=DataTemp;
break;
default:
break;
}
}*/
}
void taskFxn(void)
{
Uint16 srcAddrHi, srcAddrLo;
Uint16 dstAddrHi, dstAddrLo;
srcAddrHi = (Uint16)(((Uint32)(MCBSP_ADDR(DRR11))) >> 15) & 0xFFFFu; //从McBSP把数据送到SDRAM
srcAddrLo = (Uint16)(((Uint32)(MCBSP_ADDR(DRR11))) << 1) & 0xFFFFu;
dstAddrHi = (Uint16)(((Uint32)(&gBufferRcvPing)) >> 15) & 0xFFFFu;
dstAddrLo = (Uint16)(((Uint32)(&gBufferRcvPing)) << 1) & 0xFFFFu;
dmaRcvConfig.dmacssal = (DMA_AdrPtr)srcAddrLo; //源地址低 ////第一次把数据从McBSP送到SDRAM的地址寄存器
dmaRcvConfig.dmacssau = srcAddrHi;
dmaRcvConfig.dmacdsal = (DMA_AdrPtr)dstAddrLo;
dmaRcvConfig.dmacdsau = dstAddrHi;
srcAddrHi = (Uint16)(((Uint32)(&gBufferXmtPing)) >> 15) & 0xFFFFu; //从SDRAM把数据送到McBSP
srcAddrLo = (Uint16)(((Uint32)(&gBufferXmtPing)) << 1) & 0xFFFFu;
dstAddrHi = (Uint16)(((Uint32)(MCBSP_ADDR(DXR11))) >> 15) & 0xFFFFu;
dstAddrLo = (Uint16)(((Uint32)(MCBSP_ADDR(DXR11))) << 1) & 0xFFFFu;
dmaXmtConfig.dmacssal = (DMA_AdrPtr)srcAddrLo; ////第一次把数据从SDRAM送到McBSP的地址寄存器
dmaXmtConfig.dmacssau = srcAddrHi;
dmaXmtConfig.dmacdsal = (DMA_AdrPtr)dstAddrLo;
dmaXmtConfig.dmacdsau = dstAddrHi;
/* Open DMA channels 4 & 5 and set regs to power on defaults */
hDmaRcv = DMA_open(DMA_CHA4,DMA_OPEN_RESET); //打开通道4.5
hDmaXmt = DMA_open(DMA_CHA5,DMA_OPEN_RESET);
/* Get interrupt event associated with DMA receive and transmit */
xmtEventId = DMA_getEventId(hDmaXmt); //得到DMA事件ID
rcvEventId = DMA_getEventId(hDmaRcv);
/* Temporarily disable interrupts and clear any pending */
/* interrupts for MCBSP transmit */
old_intm = IRQ_globalDisable();
/* Clear any pending interrupts for DMA channels */
IRQ_clear(xmtEventId);
IRQ_clear(rcvEventId);
/* Enable DMA interrupt in IER register */
IRQ_enable(xmtEventId); //使能DMA中断
IRQ_enable(rcvEventId);
/* Place DMA interrupt service addresses at associate vector */
IRQ_plug(xmtEventId,&dmaXmtIsr); //把中断程序地址放入中断向量表
IRQ_plug(rcvEventId,&dmaRcvIsr);
/* Write values from configuration structure to MCBSP control regs */
// MCBSP_config(hMcbsp, &Mcbsp1Config);
/* Write values from configuration structure to DMA control regs */
DMA_config(hDmaRcv,&dmaRcvConfig); //设置DMA工作方式
DMA_config(hDmaXmt,&dmaXmtConfig);
/* Enable all maskable interrupts */
IRQ_globalEnable(); //全局中断使能//
/* Start Sample Rate Generator and Enable Frame Sync */
MCBSP_start(hMcbsp,
MCBSP_SRGR_START | MCBSP_SRGR_FRAMESYNC,
0x300u);
DMA_FSETH (hDmaRcv, DMACCR, ENDPROG, 1);
// DMA_FSETH (hDmaXmt, DMACCR, ENDPROG, 1);
/* Enable DMA */
DMA_start(hDmaRcv);
DMA_start(hDmaXmt);
/* Take MCBSP transmit and receive out of reset */
MCBSP_start(hMcbsp,
MCBSP_XMIT_START | MCBSP_RCV_START,
0u);
/* Wait for DMA transfer to be complete */
while (TRUE)
{
/* 左通路数据 */
while(!MCBSP_rrdy(hMcbsp)){};
DataTempLeft = MCBSP_read16(hMcbsp);
/* 右通路数据 */
while(!MCBSP_rrdy(hMcbsp)){};
DataTempRight = MCBSP_read16(hMcbsp);
/* 左声道耳机输出 */
while(!MCBSP_xrdy(hMcbsp)) {};
MCBSP_write16(hMcbsp,DataTempLeft);
/* 右声道耳机输出 */
while(!MCBSP_xrdy(hMcbsp)) {};
MCBSP_write16(hMcbsp,DataTempRight);
}
/* Restore status of global interrupt enable flag */
IRQ_globalRestore(old_intm);
/* We're done with MCBSP and DMA , so close them */
MCBSP_close(hMcbsp);
DMA_close(hDmaRcv);
DMA_close(hDmaXmt);
}
interrupt void dmaXmtIsr(void)
{
// Read the DMA status register to clear it so new interrupts will be seen
DMA_RGETH(hDmaXmt, DMACSR);
DMA_start(hDmaXmt);
// DMA_stop(hDmaXmt);
// IRQ_disable(xmtEventId);
}
interrupt void dmaRcvIsr(void)
{
processBuffer(); //数据处理
// Read the DMA status register to clear it so new interrupts will be seen
DMA_RGETH(hDmaRcv, DMACSR);
// IRQ_disable(rcvEventId);
// transferComplete = TRUE;
}
/******************************************************************************/
// No more
/******************************************************************************/