📄 audio_test.c
字号:
/*****************************************************************************
** **
** Name: Audio_test.c **
** **
******************************************************************************
(C) Copyright 2006 - Analog Devices, Inc. All rights reserved.
This software is proprietary and confidential. By using this software you agree
to the terms of the associated Analog Devices License Agreement.
Purpose: Perform a POST audio test on the BF533 EZ-Kit Lite
******************************************************************************/
#include <math.h>
#include <sysreg.h>
#include <ccblkfn.h>
#include <signal.h>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <filter.h>
#include <cdefBF533.h>
#include <sys\exception.h>
#include <string.h>
#include "Timer_ISR.h"
#define IRQ_SPORT0_RX 0x00000200 /* DMA1 Interrupt (SPORT0 RX) */
//--------------------------------------------------------------------------//
// Symbolic constants //
//--------------------------------------------------------------------------//
// addresses for Port B in Flash A
#define pFlashA_PortA_Dir (volatile unsigned char *)0x20270006
#define pFlashA_PortA_Data (volatile unsigned char *)0x20270004
// names for codec registers, used for iCodec1836TxRegs[]
#define DAC_CONTROL_1 0x0000
#define DAC_CONTROL_2 0x1000
#define DAC_VOLUME_0 0x2000
#define DAC_VOLUME_1 0x3000
#define DAC_VOLUME_2 0x4000
#define DAC_VOLUME_3 0x5000
#define DAC_VOLUME_4 0x6000
#define DAC_VOLUME_5 0x7000
#define ADC_0_PEAK_LEVEL 0x8000
#define ADC_1_PEAK_LEVEL 0x9000
#define ADC_2_PEAK_LEVEL 0xA000
#define ADC_3_PEAK_LEVEL 0xB000
#define ADC_CONTROL_1 0xC000
#define ADC_CONTROL_2 0xD000
#define ADC_CONTROL_3 0xE000
// names for slots in ad1836 audio frame
#define INTERNAL_ADC_L0 0
#define INTERNAL_ADC_L1 1
#define INTERNAL_ADC_R0 4
#define INTERNAL_ADC_R1 5
#define INTERNAL_DAC_L0 0
#define INTERNAL_DAC_L1 1
#define INTERNAL_DAC_L2 2
#define INTERNAL_DAC_R0 4
#define INTERNAL_DAC_R1 5
#define INTERNAL_DAC_R2 6
// size of array iCodec1836TxRegs and iCodec1836RxRegs
#define CODEC_1836_REGS_LENGTH 11
// SPI transfer mode
#define TIMOD_DMA_TX 0x0003
// SPORT0 word length
#define SLEN_32 0x001f
// DMA flow mode
#define FLOW_1 0x1000
// array for registers to configure the ad1836
// names are defined in "Talkthrough.h"
short sCodec1836TxRegs[CODEC_1836_REGS_LENGTH] =
{
DAC_CONTROL_1 | 0x000,
DAC_CONTROL_2 | 0x000,
DAC_VOLUME_0 | 0x3ff,
DAC_VOLUME_1 | 0x3ff,
DAC_VOLUME_2 | 0x3ff,
DAC_VOLUME_3 | 0x3ff,
DAC_VOLUME_4 | 0x3ff,
DAC_VOLUME_5 | 0x3ff,
ADC_CONTROL_1 | 0x000,
ADC_CONTROL_2 | 0x180,
ADC_CONTROL_3 | 0x000
};
// SPORT0 DMA transmit buffer
int iTxBuffer1[8];
// SPORT0 DMA receive buffer
int iRxBuffer1[8];
EX_INTERRUPT_HANDLER(Sport0_RX_ISR_AUDIO);
//--------------------------------------------------------------------------//
// Test paramaters //
//--------------------------------------------------------------------------//
#define MAX_SAMPLES 256
#define REQUIRED_SAMPLES ((MAX_SAMPLES) * 250)
#define DESIRED_FREQ ((float)3000.0)
#define SAMPLE_RATE ((float)48000.0)
#define AMPLITUDE ((float)2147483647)
#define PI ((float)3.141592765309)
#define ACCEPTABLE_DEVIATION_PCT ((float)0.015)
#define ACCEPTABLE_DEVIATION (DESIRED_FREQ * ACCEPTABLE_DEVIATION_PCT)
#define MAX_DESIRED_FREQ (DESIRED_FREQ + ACCEPTABLE_DEVIATION)
#define MIN_DESIRED_FREQ (DESIRED_FREQ - ACCEPTABLE_DEVIATION)
#define MIN_SIGNAL_STRENGTH (float)30.0
//--------------------------------------------------------------------------//
// Variables used for test
//--------------------------------------------------------------------------//
volatile int g_iSampleIndexAudio = 1;
volatile int g_iSampleCount = 0;
short g_fSineWaveIn_Left0[MAX_SAMPLES];
short g_fSineWaveIn_Right0[MAX_SAMPLES];
short g_fSineWaveIn_Left1[MAX_SAMPLES];
short g_fSineWaveIn_Right1[MAX_SAMPLES];
short g_fSineWaveIn_Left2[MAX_SAMPLES];
short g_fSineWaveIn_Right2[MAX_SAMPLES];
bool g_bTestDAC3_ADC2;
//--------------------------------------------------------------------------//
// Function: Init_EBIU //
// //
// Description: This function initialises and enables asynchronous memory //
// banks in External Bus Interface Unit so that Flash A can be //
// accessed. //
//--------------------------------------------------------------------------//
void Init_EBIU(void)
{
*pEBIU_AMBCTL0 = 0x7bb07bb0;
*pEBIU_AMBCTL1 = 0x7bb07bb0;
*pEBIU_AMGCTL = 0x000f;
}
//--------------------------------------------------------------------------//
// Function: Init_Flash //
// //
// Description: This function initialises pin direction of Port A in Flash A//
// to output. The AD1836_RESET on the ADSP-BF533 EZ-KIT board //
// is connected to Port A. //
//--------------------------------------------------------------------------//
void Init_Flash(void)
{
*pFlashA_PortA_Dir = 0x1;
}
//--------------------------------------------------------------------------//
// Function: Init1836() //
// //
// Description: This function sets up the SPI port to configure the AD1836. //
// The content of the array sCodec1836TxRegs is sent to the //
// codec. //
//--------------------------------------------------------------------------//
void Init1836(void)
{
int i;
int j;
static unsigned char ucActive_LED = 0x01;
// write to Port A to reset AD1836
*pFlashA_PortA_Data = 0x00;
ssync();
// write to Port A to enable AD1836
*pFlashA_PortA_Data = ucActive_LED;
// wait to recover from reset
for (i=0; i<0xf000; i++)asm("nop;");
// Enable PF4
*pSPI_FLG = FLS4;
// Set baud rate SCK = SCLK/(2*SPIBAUD) SCK = 2MHz
*pSPI_BAUD = 20;
// configure spi port
// SPI DMA write, 16-bit data, MSB first, SPI Master
*pSPI_CTL = TIMOD_DMA_TX | SIZE | MSTR;
// Set up DMA5 to transmit
// Map DMA5 to SPI
*pDMA5_PERIPHERAL_MAP = 0x5000;
// Configure DMA5
// 16-bit transfers
*pDMA5_CONFIG = WDSIZE_16;
// Start address of data buffer
*pDMA5_START_ADDR = sCodec1836TxRegs;
// DMA inner loop count
*pDMA5_X_COUNT = CODEC_1836_REGS_LENGTH;
// Inner loop address increment
*pDMA5_X_MODIFY = 2;
// enable DMAs
*pDMA5_CONFIG = (*pDMA5_CONFIG | DMAEN);
// enable spi
*pSPI_CTL = (*pSPI_CTL | SPE);
// wait until dma transfers for spi are finished
for (j=0; j<0xaff; j++)asm("nop;");
// disable spi
*pSPI_CTL = 0x0000;
}
//--------------------------------------------------------------------------//
// Function: Init_Sport0 //
// //
// Description: Configure Sport0 for TDM mode, to transmit/receive data //
// to/from the AD1836. Configure Sport for external clocks and //
// framesyncs. //
//--------------------------------------------------------------------------//
void Init_Sport0_AUDIO(void)
{
// Sport0 receive configuration
// External CLK, External Frame sync, MSB first
// 32-bit data
*pSPORT0_RCR1 = RFSR;
*pSPORT0_RCR2 = SLEN_32;
// Sport0 transmit configuration
// External CLK, External Frame sync, MSB first
// 24-bit data
*pSPORT0_TCR1 = TFSR;
*pSPORT0_TCR2 = SLEN_32;
// Enable MCM 8 transmit & receive channels
*pSPORT0_MTCS0 = 0x000000FF;
*pSPORT0_MRCS0 = 0x000000FF;
// Set MCM configuration register and enable MCM mode
*pSPORT0_MCMC1 = 0x0000;
*pSPORT0_MCMC2 = 0x101c;
}
//--------------------------------------------------------------------------//
// Function: Init_DMA //
// //
// Description: Initialise DMA1 in autobuffer mode to receive and DMA2 in //
// autobuffer mode to transmit //
//--------------------------------------------------------------------------//
void Init_DMA(void)
{
// Set up DMA1 to receive
// Map DMA1 to Sport0 RX
*pDMA1_PERIPHERAL_MAP = 0x1000;
// Configure DMA1
// 32-bit transfers, Interrupt on completion, Autobuffer mode
*pDMA1_CONFIG = WNR | WDSIZE_32 | DI_EN | FLOW_1;
// Start address of data buffer
*pDMA1_START_ADDR = iRxBuffer1;
// DMA inner loop count
*pDMA1_X_COUNT = 8;
// Inner loop address increment
*pDMA1_X_MODIFY = 4;
// Set up DMA2 to transmit
// Map DMA2 to Sport0 TX
*pDMA2_PERIPHERAL_MAP = 0x2000;
// Configure DMA2
// 32-bit transfers, Autobuffer mode
*pDMA2_CONFIG = WDSIZE_32 | FLOW_1;
// Start address of data buffer
*pDMA2_START_ADDR = iTxBuffer1;
// DMA inner loop count
*pDMA2_X_COUNT = 8;
// Inner loop address increment
*pDMA2_X_MODIFY = 4;
}
//--------------------------------------------------------------------------//
// Function: Init_Interrupts //
// //
// Description: Initialise Interrupt for Sport0 RX //
//--------------------------------------------------------------------------//
void Init_Sport_Interrupts(void)
{
// Set Sport0 RX (DMA1) interrupt priority to 2 = IVG9
*pSIC_IAR0 = 0xffffffff;
*pSIC_IAR1 = 0xffffff2f;
*pSIC_IAR2 = 0xffffffff;
// assign ISRs to interrupt vectors
// Sport0 RX ISR -> IVG 9
register_handler(ik_ivg9, Sport0_RX_ISR_AUDIO);
// enable Sport0 RX interrupt
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -