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

📄 c30.c

📁 dsp AD公司ADSP21的代码,里面有FFT FIR IIR EQULIZER G722_21F 等可以在项目中直接应用的代码.此代码的来源是ADI公司自己出版的书籍,此书在美国购得
💻 C
字号:
/* C30.C - TMS320C30/C31 SUPPORT PROGRAMS */

#include <math.h>
#include <stdlib.h>
#include <string.h>
#include "c30.h"

AIC_COMMAND_0  aic_command_0;            /* AIC COMMAND WORD 0 */
AIC_COMMAND_1  aic_command_1;            /* AIC COMMAND WORD 1 */
AIC_COMMAND_2  aic_command_2;            /* AIC COMMAND WORD 2 */
AIC_COMMAND_3  aic_command_3;            /* AIC COMMAND WORD 3 */
volatile int send_command       = OFF;   /* FLAG TO SEND AIC COMMAND WORD */
volatile int secondary_transmit = OFF;   /* FLAG TO SENT SECONDARY TRANSMIT*/
int aic_secondary = 0;            /* COMMAND TO SENT ON SECONDARY TRANSMIT */

/* BUS, TIMER, SERIAL PORT BASE LOCATIONS */
volatile int *bus = (volatile int *) 0x808060;
volatile int (*timer)[16] = (volatile int (*)[16]) 0x808020;
volatile int (*serial_port)[16] = (volatile int (*)[16]) 0x808040;

/* C_INT99(): ERRONEOUS INTERRUPT SERVICE ROUTINE */
void c_int99(void)
{
    for(;;);
}

/* INIT_EVM(): INITIALIZE TMS320C30 EVALUATION MODULE */
void init_evm(void)
{
/* this is not on the C31 - PME */
/*  bus[EXPANSION] = 0x0;*/          /* ZERO WAIT STATES ON EXPANSION BUS */
    bus[PRIMARY]   = 0x0;            /* ZERO WAIT STATES ON PRIMARY BUS */

    asm(" OR 800h,ST");              /* TURN ON CACHE */
}

/* INIT_AIC(): INITIALIZE COMMUNICATIONS TO AIC */
void init_aic(void)
{
    volatile int i;
/* SET AIC CONFIGURATION
1. ALLOW 16 KHZ SAMPLING RATE AND 5.6 KHZ ANTIALIASING FILTER
2. DISABLE A/D HIGHPASS FILTER
3. SET SYNCHRONOUS TRANSMIT AND RECEIVE
4. SET AIC FOR +/- 1.5 V INPUT
*/
    aic_command_0.command  = 0;       /* SETUP AIC COMMAND WORD ZERO */
    aic_command_0.ra       = 7;      /* ADJUST SAMPLING RATE TO 16 kHz */
    aic_command_0.ta       = 7;      /*    AND 4.6 kHz ANTIALIAS FILTER */
    aic_command_1.command  = 1;       /* SETUP DEFAULT AIC COMMAND WORD 1 */
    aic_command_1.ra_prime = 1;
    aic_command_1.ta_prime = 1;
    aic_command_1.d_f      = 0;
    aic_command_2.command  = 2;       /* SETUP DEFAULT AIC COMMAND WORD 2 */
    aic_command_2.rb       = 24;
    aic_command_2.tb       = 24;
    aic_command_3.command  = 3;
    aic_command_3.highpass = OFF;     /* TURN ON INPUT HIGHPASS FILTER */
    aic_command_3.loopback = OFF;     /* DISABLE AIC LOOPBACK */
    aic_command_3.aux      = OFF;     /* DISABLE AUX INPUT */
    aic_command_3.sync     = ON;      /* ENABLE SYNCHRONOUS A/D AND D/A */
    aic_command_3.gain     = LINE_V;  /* SET FOR LINE-LEVEL INPUT */
    aic_command_3.sinx     = ON;      /* ENABLE SIN x/x CORRECTION FILTER */

/* CONFIGURE TIMER 0 TO ACT AS AIC MCLK */
    timer[0][PERIOD] = 0x1;
    timer[0][GLOBAL] = 0x2C1;

/* CONFIGURE SERIAL PORT 0
1. EXTERNAL FSX, FSR, CLKX, CLKR
2. VARIABLE DATA RATE TRANSMIT AND RECEIVE
3. HANDSHAKE DISABLED
4. ACTIVE HIGH DATA AND CLK
5. ACTIVE LOW FSX,FSR
6. 16 BIT TRANSMIT AND RECEIVE WORD
7. TRANSMIT INTERRUPT
8. RECEIVE INTERRUPT ENABLED/RECEIVE
9. FSX, FSR, CLKX, CLKR, DX, DR CONFIGURED AS SERIAL PORT PINS
*/
    serial_port[0][X_PORT] = 0x111;
    serial_port[0][R_PORT] = 0x111;

    asm(" LDI 2,IOF");          /* RESET AIC BY PULLING XF0 ACTIVE-LOW */

    for(i = 0; i < 50; i++);    /* KEEP RESET LOW FOR SOME PERIOD OF TIME */
    serial_port[0][GLOBAL] = 0x0e970300; /* WRITE SERIAL PORT CONTROL */
    serial_port[0][X_DATA] = 0x0;        /* CLEAR SERIAL TRANSMIT DATA */

    asm(" LDI 6,IOF");                   /* PULL AIC OUT OF RESET */

    asm(" LDI     0,IF"); /* CLEAR ANY INTERRUPT FLAGS */
    asm(" LDI  410h,IE"); /* ENABLE DMA & SERIAL PORT 0 TRANSMIT INTERRUPTS*/
    asm(" OR  2000h,ST"); /* SET GLOBAL INTERRUPT ENABLE BIT */

/* MODIFY AIC CONFIGURATION */
    configure_aic(*((int *) &aic_command_0));
    configure_aic(*((int *) &aic_command_1));
    configure_aic(*((int *) &aic_command_2));
    configure_aic(*((int *) &aic_command_3));
}

/* CONFIGURE_AIC(): INITIATE AIC CONFIGURATION WORD TRANSMISSION ON NEXT */
/*                  INTERRUPT AFTER ALL PREVIOUS COMMANDS ARE SENT */
void configure_aic(int i)
{
    while(send_command || secondary_transmit);
    aic_secondary = i;
    send_command = ON;
}

⌨️ 快捷键说明

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