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

📄 mainfilter.c

📁 基于ti tms320c6713下MSBSP、EDMA 配置和简单FIR算法的一个例子
💻 C
字号:
/*******************************************************************************
本程序实现音频的IIR滤波操作
*******************************************************************************/
#define CHIP_6713
#include <stdio.h>
#include <csl.h>
#include <csl_dma.h>     /* DMA_SUPPORT   */
#include <csl_irq.h>     /* IRQ_SUPPORT   */
#include <csl_mcbsp.h>   /* MCBSP_SUPPORT */
#include <csl_gpio.h>
#define DSPF_SP_BIQUAD_ASM
#include "DSPF_sp_biquad.h"
#include "intr.h"
#include "c6x.h"
#include "c6713dsk.h"
#include "regs.h"
#include "iirtable.h"
#define   SP_fir_r2_ASM_H_
#include "DSPF_sp_fir_gen.h"
#include "dspf_sp_fir_r2.h"

//CSLi handle for GPIO_DEV0 Declaration
GPIO_Handle hGpio;

#define FALSE 0
#define TRUE 1
#define PING 0
#define PONG 1
volatile int recv0_done = FALSE;
volatile int xmit0_done = FALSE;

#define nDelayBuf 9000

#pragma DATA_SECTION(inbuf,"edmain")
int inbuf[nDelayBuf];

#pragma DATA_SECTION(outbuf,"edmaout")
int outbuf[nDelayBuf];

#pragma DATA_SECTION(FeedBack,"edmafeed")
int FeedBack[nDelayBuf];

#pragma DATA_SECTION(ProcessBuff,"edmabuf")
Uint32 ProcessBuff[BUFFSIZE];

short pingORpong=PING;

int gBufferXmtPing[BUFFSIZE];
int gBufferXmtPong[BUFFSIZE];

int gBufferRcvPing[BUFFSIZE];
int gBufferRcvPong[BUFFSIZE];

float Buffer_iir_l[512];
float Buffer_iir_r[512];
float mid_iir[512];

#pragma DATA_ALIGN (firbuf_l,8)
float firbuf_l[512+67]={0};
#pragma DATA_ALIGN (firbuf_r,8)
float firbuf_r[512+67]={0};

#pragma DATA_ALIGN (firoutput_l,8)
float firoutput_l[512]={0};
#pragma DATA_ALIGN (firoutput_r,8)
float firoutput_r[512]={0};

float last63data_l[63]={0};
float last63data_r[63]={0};

#pragma DATA_ALIGN (h,8)
float h[68]=
{
    0.001991708763, 0.003000547644,-0.001141437562,-0.002139158547,-0.002781780902,
  0.0008227497456, 0.003991191741, 0.003736911109,-0.001239071833,-0.006075507961,
  -0.005188167095, 0.002059180057,  0.00880725868, 0.007075313013,-0.003331899876,
   -0.01251663268,-0.009521149099, 0.005270983092,  0.01773379371,  0.01282939315,
  -0.008321493864, -0.02556844987, -0.01772849634,  0.01352416724,  0.03894120827,
    0.02633761428, -0.02419195138, -0.06858902425, -0.04816799983,  0.05949565768,
     0.2114835531,   0.3217850924,   0.3217850924,   0.2114835531,  0.05949565768,
   -0.04816799983, -0.06858902425, -0.02419195138,  0.02633761428,  0.03894120827,
    0.01352416724, -0.01772849634, -0.02556844987,-0.008321493864,  0.01282939315,
    0.01773379371, 0.005270983092,-0.009521149099, -0.01251663268,-0.003331899876,
   0.007075313013,  0.00880725868, 0.002059180057,-0.005188167095,-0.006075507961,
  -0.001239071833, 0.003736911109, 0.003991191741,0.0008227497456,-0.002781780902,
  -0.002139158547,-0.001141437562, 0.003000547644, 0.001991708763,0,0,0,0
 };

MCBSP_Handle hMcbsp0;    /*handle of the Mcbsp0*/
static MCBSP_Config mcbspCfg0={
  0x00060000,  //SPCR
  0x000401a0,  //RCR
  0x000401a0,  //XCR
  0x103f1f03,  //SRGR
  MCBSP_MCR_DEFAULT,
  MCBSP_RCER_DEFAULT,
  MCBSP_XCER_DEFAULT,
  0x00000a03   //PCR
  };
  
MCBSP_Handle hMcbsp1;    /*handle of the Mcbsp1*/
static MCBSP_Config mcbspCfg1={
  0x00060000,  //SPCR
  0x80a400a0,  //RCR
  0x80a400a0,  //XCR
  0x103f1f03,  //SRGR
  MCBSP_MCR_DEFAULT,
  MCBSP_RCER_DEFAULT,
  MCBSP_XCER_DEFAULT,
  0x00000a03   //PCR
  };  
/*******************************************************************************
* Function prototypes
*******************************************************************************/
void delay_msec(short msec);
void iis_init();
void spi_init();
extern void TI_EDMA_CFG(void);
Uint32 RecvMcbspDat=0,SendMcbspDat=0;
Uint32 SendCnt=0;

void initGpio(void)
 {
   hGpio=GPIO_open(GPIO_DEV0,GPIO_OPEN_RESET);
   GPIO_pinEnable(hGpio,GPIO_PIN13|GPIO_PIN15);  
   GPIO_pinDirection(hGpio,GPIO_PIN13|GPIO_PIN15,GPIO_OUTPUT);
   GPIO_pinWrite(hGpio,GPIO_PIN13|GPIO_PIN15,1);
   
   IRQ_reset(IRQ_EVT_EXTINT4);
   IRQ_disable(IRQ_EVT_EXTINT4);
   IRQ_clear(IRQ_EVT_EXTINT4);
   IRQ_enable(IRQ_EVT_EXTINT4);
   }
void SdramInit(void)
 {
/*************************************************************************
* Standard 6211/6711 DSK includes 2 MT48LC1M16A1-7 devices = 4MB SDRAM   *
* For these devices use the following parameter:                         *
*   EMIF_SDCTRL=0x07126000                                               *
* If MT48LC1M16A1-10 devices are installed use the following parameter:  *
*   EMIF_SDCTRL=0x07227000                                               *
* /|\ 16Mb parts = 4MB SDRAM /|\   *-------------------------------------*
*----------------------------------*   \|/ 64Mb parts = 16MB SDRAM \|/   *
* If MT48LC4M16A2-10 devices are installed use the following parameter:  *
*   EMIF_SDCTRL=0x57227000                                               *
*************************************************************************/

  *(unsigned volatile int *)EMIF_GCR = 0x3068;    /* EMIF global control      */
  *(unsigned volatile int *)EMIF_CE1 = CE1_8;    /* EMIF CE1 control, 8bit  */
  *(unsigned volatile int *)EMIF_SDCTRL = 0x53116000;//0x57126000; /* EMIF SDRAM control   */ 
  *(unsigned volatile int *)EMIF_CE0 = 0x90;      /* EMIF CE0 control         */
  *(unsigned volatile int *)EMIF_SDRP = 0x61a;    /* EMIF SDRM refresh period */
  *(unsigned volatile int *)EMIF_SDEXT= 0x54529;  /* EMIF SDRM extension      */

  /*****************************************************************************
   * Start state
   ****************************************************************************/
   *(unsigned int *)0x807ffff0=0x7799aabb;   
   }
/*
void IntSelInit(void)
 {
   *(unsigned volatile int *)IML=0x250f39ac;
   *(unsigned volatile int *)IMH=0x04402d43;
   }
*/
void iis0_init(void)
 {
   hMcbsp0=MCBSP_open(MCBSP_DEV0,MCBSP_OPEN_RESET);
   MCBSP_config(hMcbsp0,&mcbspCfg0);
   MCBSP_start(hMcbsp0,MCBSP_XMIT_START|MCBSP_RCV_START|
               MCBSP_SRGR_START|MCBSP_SRGR_FRAMESYNC,220);              
  }
void iis1_init(void)
 {
   hMcbsp1=MCBSP_open(MCBSP_DEV1,MCBSP_OPEN_RESET);
   MCBSP_config(hMcbsp1,&mcbspCfg1);
   MCBSP_start(hMcbsp1,MCBSP_XMIT_START|MCBSP_RCV_START|
               MCBSP_SRGR_START|MCBSP_SRGR_FRAMESYNC,220);                      
  } 
void set_interrupts_edma(void)    
{
 IRQ_reset(IRQ_EVT_EDMAINT);
 IRQ_disable(IRQ_EVT_EDMAINT);
 EDMA_intDisable(12);         /* ch 12 for McBSP transmit event XEVT0 */
 EDMA_intDisable(13);         /* ch 13 for McBSP receive event REVT0 */
 IRQ_clear(IRQ_EVT_EDMAINT);
 EDMA_intClear(12);
 EDMA_intClear(13);
 IRQ_enable(IRQ_EVT_EDMAINT);
 EDMA_intEnable(12);
 EDMA_intEnable(13);  
}   
void init_edma(void)
 {
  TI_EDMA_CFG();
  set_interrupts_edma();
     *(unsigned volatile int *)McBSP0_DXR=SendMcbspDat;
     *(unsigned volatile int *)McBSP1_DXR=SendMcbspDat;  
     RecvMcbspDat=*(unsigned volatile int *)McBSP0_DRR; 
   }
/***********************************/
interrupt void xint0()
  {
    if(SendCnt>10000)
     {SendCnt=0;}
    else
     {SendCnt++;}
    SendMcbspDat=RecvMcbspDat; 
   }
interrupt void rint0()
  {
   RecvMcbspDat=*(unsigned volatile int *)McBSP0_DRR;
   *(unsigned volatile int *)McBSP0_DXR=SendMcbspDat;
   }
interrupt void timer0_isr()
  {
   static unsigned int i=0,j=0;
   if(i>100)
     {
       i=0;
       j++;
        }
   else
     {i++;}
    if(j>200)
     {
      j=0;
      }
    if(j>0&&j<100)
     { 
        GPIO_pinWrite(hGpio,GPIO_PIN13,1);
        GPIO_pinWrite(hGpio,GPIO_PIN15,0);
       }
    else
     
     {
        GPIO_pinWrite(hGpio,GPIO_PIN13,0);
        GPIO_pinWrite(hGpio,GPIO_PIN15,1);
       }
   }
interrupt void ext_int4(void)
{
   static Uint32 ExtIntCnt=0;
   if(ExtIntCnt<0xffff)
     {ExtIntCnt++;}
   else
     {ExtIntCnt=0;}   
  } 
interrupt void c_int08(void)  /* vecs.asm hooks this up to IRQ 08 */
{
  if (EDMA_intTest(12)) 
  {
   xmit0_done = TRUE;
   EDMA_intClear(12); /* clear CIPR bit so future interrupts can be recognized */
  }

  else if (EDMA_intTest(13)) 
  {
   recv0_done = TRUE;
   EDMA_intClear(13); /* clear CIPR bit so future interrupts can be recognized */
  }
 return;
}
void initrecsendbuf(void)
{
  Uint32 i;
  for(i=0;i<256;i++)
   { gBufferRcvPing[i]=0x0;
     gBufferRcvPong[i]=0x0;
     gBufferXmtPing[i]=i+0xaaaa5555;
     gBufferXmtPong[i]=i+0xaaaa5555;
     }
  for(i=0;i<1000;i++)
   {
     inbuf[i]=0x5432+i;
     outbuf[i]=0x1000+i;
     }
  
  } 
Uint16 bypass_bit=0;
void ProcessBlock(short pingpong)
{
  Uint16 i=0;
   if(pingpong==PING)                        //Ping module
     {
        for(i=0;i<512;i++)
         {
           Buffer_iir_l[i]=(float)(gBufferRcvPing[i*2]);
           Buffer_iir_r[i]=(float)(gBufferRcvPing[i*2+1]);
           }  
        if(bypass_bit==1)
         {               
		        DSPF_sp_biquad(Buffer_iir_l,b0,a0,dlyl_0,mid_iir,512);
		        DSPF_sp_biquad(mid_iir,b1,a1,dlyl_1,Buffer_iir_l,512); 
		        
		        DSPF_sp_biquad(Buffer_iir_r,b0,a0,dlyr_0,mid_iir,512);
		        DSPF_sp_biquad(mid_iir,b1,a1,dlyr_1,Buffer_iir_r,512); 
          }
        for(i=0;i<512;i++)
         {
           gBufferXmtPing[i*2]=(int)(Buffer_iir_l[i]);
           gBufferXmtPing[i*2+1]=(int)(Buffer_iir_r[i]);
           }              
      }
       
   if(pingpong==PONG)                         //Pong module
     {    
        for(i=0;i<512;i++)
         {
           Buffer_iir_l[i]=(float)gBufferRcvPong[i*2];
           Buffer_iir_r[i]=(float)gBufferRcvPong[i*2+1];
           }
        if(bypass_bit==1)
         {         
		        DSPF_sp_biquad(Buffer_iir_l,b0,a0,dlyl_0,mid_iir,512);
		        DSPF_sp_biquad(mid_iir,b1,a1,dlyl_1,Buffer_iir_l,512); 
		        DSPF_sp_biquad(Buffer_iir_r,b0,a0,dlyr_0,mid_iir,512);
		        DSPF_sp_biquad(mid_iir,b1,a1,dlyr_1,Buffer_iir_r,512); 
		    }
        for(i=0;i<512;i++)
         {
           gBufferXmtPong[i*2]=(int)Buffer_iir_l[i];
           gBufferXmtPong[i*2+1]=(int)Buffer_iir_r[i];
           }   
      }    
  }
#define first 1
#define second 2
int firstatus=first;
void init_fir(void)
{
   int i;
    for(i=0;i<512;i++)
     {
       //firoutput_l[i]=0;
       //firoutput_r[i]=0;
      }
  }
void firsub(short pingpong)
{
  Uint16 i=0;
   if(pingpong==PING)                        //Ping module
     {
        for(i=0;i<63;i++)
         {
           firbuf_l[i]=last63data_l[i];
           firbuf_r[i]=last63data_r[i];
           }
        for(i=0;i<512;i++)
         {
           firbuf_l[i+63]=(float)(gBufferRcvPing[i*2]);
           firbuf_r[i+63]=(float)(gBufferRcvPing[i*2+1]);
           }  
        for(i=0;i<63;i++)
         {
           last63data_l[i]=firbuf_l[512+i];
           last63data_r[i]=firbuf_r[512+i];
           }
        if(bypass_bit==1)
         {              
		   DSPF_sp_fir_r2(firbuf_l,h,firoutput_l,64,512);     
           DSPF_sp_fir_r2(firbuf_r,h,firoutput_r,64,512); 
          }
		else
		 {
		   for(i=0;i<512;i++)
		     {
		        firoutput_l[i]=firbuf_l[i];
		        firoutput_r[i]=firbuf_r[i];
		     } 
		 }          
        for(i=0;i<512;i++)
         {
           gBufferXmtPing[i*2]=(int)(firoutput_l[i]);
           gBufferXmtPing[i*2+1]=(int)(firoutput_r[i]);
           }              
      }
       
   if(pingpong==PONG)                         //Pong module
     {  
        for(i=0;i<63;i++)
         {
           firbuf_l[i]=last63data_l[i];
           firbuf_r[i]=last63data_r[i];
           }       
        for(i=0;i<512;i++)
         {
           firbuf_l[i+63]=(float)gBufferRcvPong[i*2];
           firbuf_r[i+63]=(float)gBufferRcvPong[i*2+1];
           }
        for(i=0;i<63;i++)
         {
           last63data_l[i]=firbuf_l[512+i];
           last63data_r[i]=firbuf_r[512+i];
           }           
        if(bypass_bit==1)
         {        
		   DSPF_sp_fir_r2(firbuf_l,h,firoutput_l,64,512);     
           DSPF_sp_fir_r2(firbuf_r,h,firoutput_r,64,512); 
		    }
		else
		 {
		   for(i=0;i<512;i++)
		     {
		        firoutput_l[i]=firbuf_l[i];
		        firoutput_r[i]=firbuf_r[i];
		     } 
		 }
        for(i=0;i<512;i++)
         {
           gBufferXmtPong[i*2]=(int)firoutput_l[i];
           gBufferXmtPong[i*2+1]=(int)firoutput_r[i];
           }   
      } 
  }
int main()
{
  /* DSP initialization*/
  IRQ_globalDisable();                 /* Disable all interrupts        */
  IER=1;                               /* Disable all interrupts except NMI   */
  IRQ_setVecs((void *)0x800);		           /* point to the IRQ vector table */
  PLLInit();
  CSL_init();
  SdramInit();
  //IntSelInit();
  iis0_init();
  iis1_init();
  initrecsendbuf();
  init_edma();
  init_IIR();
  TIMER_Init();
  initGpio();
/************************************************************/
  IER|=0x0003;                          /* enable interrupts except NMI   */
  IRQ_globalEnable();                           /*enable all interrupts*/  
/************************************************************/
  while(1)
   {
     if(xmit0_done&&recv0_done)
       {
        xmit0_done=0;
        recv0_done=0;
        if(pingORpong==PING)
         {
           //ProcessBlock(PING);
           firsub(PING);
           pingORpong=PONG;
           
           }
        else
         {
           firsub(PONG);
           //ProcessBlock(PONG);
           pingORpong=PING;   
           }

        }
     }
}

 


⌨️ 快捷键说明

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