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

📄 audio.c

📁 基于tms320c6711的dspbios的源程序
💻 C
字号:
/*
 * DSP/BIOS by Degrees (SPRA591) for DSK6711 and DSK6211
 *
 *  ======== audio.c ========
 */

#include <std.h>
#include <log.h> 
#include <stdio.h>
#include <csl.h>
#include <csl_edma.h>
#include <csl_irq.h>
#include <csl_mcbsp.h>
#include <fir_gen.h>
#include "audio.h"

volatile int inputReadyFlag = 0;    /* Set when RX buffer is full */
volatile int outputReadyFlag = 0;   /* Set when TX buffer is ready for new data */
volatile int edmaBufferMask = 0;    /* Mask indicates which buffers are ready */

volatile int filterEnable = 0;      /* Change to 1 to enable filtering */
volatile int filterSelect = 5;      /* 0-8 selects one of nine filter coefficients */

MCBSP_Handle hMcbsp;
EDMA_Handle hEdmaTx;            
EDMA_Handle hEdmaRx; 

/* Global Variables */
short pingRX[BUFSIZE];
short pongRX[BUFSIZE];
short pingTX[BUFSIZE];
short pongTX[BUFSIZE];

/* Function Prototypes */              
void processBuffer(void);

/* External References */
extern short filterCoeff[FILTERS][COEFFS];

/* LOG Object created by the Configuration Tool */
extern far LOG_Obj trace;

/*
 *  ======== main ========
 */
void main(void)
{
    int date = 25;
    
    BIOS_start();
    
    CSL_init();                 /* Initialize CSL                       */
    
    initApplication();          /* Initialize Peripherals               */
    interruptsEnable();         /* Enable EDMA and Global Interrupts    */
        
    LOG_printf(&trace, "Why do computer scientists celebrate Halloween and Christmas \
on the same day?  Because oct %o equals dec %d.\n", date, date);        
    
    while (1) {        
        if (inputReadyFlag && outputReadyFlag) {
            inputReadyFlag = 0;          /* Reset flags          */
            outputReadyFlag = 0;
            processBuffer();             /* Process Data         */
        }
        IDL_run();
    }      
}

/*
 *  ======== processBuffer ========
 */
void processBuffer(void)
{
    short *processSrc;
    short *processDst;
    int gie;
    int i;
    
   /* 
    *  Disable interrupts to avoid possible
    *  race condition with edmaISR which also
    *  changes edmaBufferMask               
    */
    gie = IRQ_globalDisable();  
    
    if (edmaBufferMask & RXPINGMASK) {
        processSrc = (short *)&pingRX[0];          /* Set-up Source    */
        
        /* Reprogram EDMA with pongRX as destination */
        EDMA_configArgs(
          hEdmaRx,
          EDMA_OPT_RMK(
            EDMA_OPT_PRI_HIGH,
            EDMA_OPT_ESIZE_16BIT,
            EDMA_OPT_2DS_NO,
            EDMA_OPT_SUM_NONE,
            EDMA_OPT_2DD_NO,
            EDMA_OPT_DUM_INC,
            EDMA_OPT_TCINT_YES,
            EDMA_OPT_TCC_OF(0X5),
            EDMA_OPT_LINK_NO,
            EDMA_OPT_FS_NO),
          MCBSP_getRcvAddr(hMcbsp),
          PRESENT,
          (Uint32)&pongRX[HISTORY],
          EDMA_IDX_DEFAULT,
          EDMA_RLD_DEFAULT
        );
        
       /* 
        *  Program QDMA to transfer data at end of full buffer to
        *  beginning of next buffer for filtering purposes 
        */

        EDMA_qdmaConfigArgs(
          EDMA_OPT_RMK(
            EDMA_OPT_PRI_LOW,
            EDMA_OPT_ESIZE_16BIT,
            EDMA_OPT_2DS_NO,
            EDMA_OPT_SUM_INC,
            EDMA_OPT_2DD_NO,
            EDMA_OPT_DUM_INC,
            EDMA_OPT_TCINT_NO,
            EDMA_OPT_TCC_OF(0X0),
            EDMA_OPT_LINK_NO,
            EDMA_OPT_FS_NO),
          (Uint32)&pingRX[PRESENT],
          HISTORY,
          (Uint32)&pongRX[0],
          EDMA_IDX_DEFAULT
        );

    }
    else if (edmaBufferMask & RXPONGMASK) {
        processSrc = (short *)&pongRX[0];
             
        /* Reprogram EDMA with pingRX as destination */
        EDMA_configArgs(
          hEdmaRx,
          EDMA_OPT_RMK(
            EDMA_OPT_PRI_HIGH,
            EDMA_OPT_ESIZE_16BIT,
            EDMA_OPT_2DS_NO,
            EDMA_OPT_SUM_NONE,
            EDMA_OPT_2DD_NO,
            EDMA_OPT_DUM_INC,
            EDMA_OPT_TCINT_YES,
            EDMA_OPT_TCC_OF(0X4),
            EDMA_OPT_LINK_NO,
            EDMA_OPT_FS_NO),
          MCBSP_getRcvAddr(hMcbsp),
          PRESENT,
          (Uint32)&pingRX[HISTORY],
          EDMA_IDX_DEFAULT,
          EDMA_RLD_DEFAULT
        );
        
       /* 
        *  Program QDMA to transfer data at end of full buffer to
        *  beginning of next buffer for filtering purposes 
        */

        EDMA_qdmaConfigArgs(
          EDMA_OPT_RMK(
            EDMA_OPT_PRI_LOW,
            EDMA_OPT_ESIZE_16BIT,
            EDMA_OPT_2DS_NO,
            EDMA_OPT_SUM_INC,
            EDMA_OPT_2DD_NO,
            EDMA_OPT_DUM_INC,
            EDMA_OPT_TCINT_NO,
            EDMA_OPT_TCC_OF(0X0),
            EDMA_OPT_LINK_NO,
            EDMA_OPT_FS_NO),
          (Uint32)&pongRX[PRESENT],
          HISTORY,
          (Uint32)&pingRX[0],
          EDMA_IDX_DEFAULT
        );
    }
    
    if (edmaBufferMask & TXPONGMASK) {
        processDst = (short *)&pongTX[HISTORY];    /* Set-up Dest      */
        
        /* Reprogram EDMA with pingTX as source */
        EDMA_configArgs(
          hEdmaTx,
          EDMA_OPT_RMK(
            EDMA_OPT_PRI_LOW,
            EDMA_OPT_ESIZE_16BIT,
            EDMA_OPT_2DS_NO,
            EDMA_OPT_SUM_INC,
            EDMA_OPT_2DD_NO,
            EDMA_OPT_DUM_NONE,
            EDMA_OPT_TCINT_YES,
            EDMA_OPT_TCC_OF(0X7),
            EDMA_OPT_LINK_NO,
            EDMA_OPT_FS_NO),
          (Uint32)&pingTX[HISTORY],
          PRESENT,
          MCBSP_getXmtAddr(hMcbsp),
          EDMA_IDX_DEFAULT,
          EDMA_RLD_DEFAULT
        );
    }
    else if (edmaBufferMask & TXPINGMASK) {
        processDst = (short *)&pingTX[HISTORY];
        
        /* Reprogram EDMA with pongTX as source */
        EDMA_configArgs(
          hEdmaTx,
          EDMA_OPT_RMK(
            EDMA_OPT_PRI_LOW,
            EDMA_OPT_ESIZE_16BIT,
            EDMA_OPT_2DS_NO,
            EDMA_OPT_SUM_INC,
            EDMA_OPT_2DD_NO,
            EDMA_OPT_DUM_NONE,
            EDMA_OPT_TCINT_YES,
            EDMA_OPT_TCC_OF(0X6),
            EDMA_OPT_LINK_NO,
            EDMA_OPT_FS_NO),
         (Uint32)&pongTX[HISTORY],
         PRESENT,
         MCBSP_getXmtAddr(hMcbsp),
         EDMA_IDX_DEFAULT,
         EDMA_RLD_DEFAULT
       );
    }
    
    edmaBufferMask = 0;                 /* Clear ISR edma flag          */
    
    IRQ_globalRestore(gie);             /* Restore global interrupts    */
    
    if (filterEnable == 0) {            /* Loop-Back if filter off      */
        for (i = 0; i < PRESENT; i++) {
            processDst[i] = ((0xfffe)&processSrc[i]);
        }
    }
    else {                              /* Apply filter function        */
        fir_gen(processSrc, (short *)&filterCoeff[filterSelect][0], processDst, 
           COEFFS, PRESENT);
    }

    /* 0 least significant bit for transfer to codec */
/*    for ( i = 0; i < PRESENT; i++ ) {
        processDst[i] &= 0xfffe;
    }*/
}



⌨️ 快捷键说明

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