Description
Source
Call Graph
Start Line: 310
int main(void)
{
unsigned char key;
unsigned char isValid;
// Configure all pins
PIO_Configure(pins, PIO_LISTSIZE(pins));
// Initialize the DBGU
TRACE_CONFIGURE(DBGU_STANDARD, 115200, MCK);
// Configure and enable the SPI (required for accessing the DAC)
SPI_Configure(BOARD_AT73C213_SPI, BOARD_AT73C213_SPI_ID, SPI_CONFIGURATION);
SPI_Enable(BOARD_AT73C213_SPI);
// Clock configuration
#if defined(at91sam7seek)
// Switch to main oscillator
AT91C_BASE_PMC->PMC_MCKR = (AT91C_BASE_PMC->PMC_MCKR & ~AT91C_PMC_CSS) | AT91C_PMC_CSS_MAIN_CLK;
while ((AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) != AT91C_PMC_MCKRDY);
AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_CSS_MAIN_CLK;
while ((AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) != AT91C_PMC_MCKRDY);
// Enable its master clock (settings for a 48kHz sample rate)
AT91C_BASE_PMC->PMC_PCKR[2] = AT91C_PMC_CSS_MAIN_CLK;
AT91C_BASE_PMC->PMC_SCER = AT91C_PMC_PCK2;
while ((AT91C_BASE_PMC->PMC_SR & AT91C_PMC_PCK2RDY) == 0);
#elif defined(at91sam9260)
// Switch to slow clock oscillator
AT91C_BASE_PMC->PMC_MCKR = (AT91C_BASE_PMC->PMC_MCKR & ~AT91C_PMC_CSS) | AT91C_PMC_CSS_SLOW_CLK;
while ((AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) != AT91C_PMC_MCKRDY);
// Configure PLLA at 147.456MHz
AT91C_BASE_PMC->PMC_PLLAR = 0x20073F01;
while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCKA));
// Switch to slow clock + prescaler
AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_MDIV_2;
while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
// Switch to PLL + prescaler
AT91C_BASE_PMC->PMC_MCKR |= AT91C_PMC_CSS_PLLA_CLK;
while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
// Enable the DAC master clock
AT91C_BASE_PMC->PMC_PCKR[0] = AT91C_PMC_CSS_PLLA_CLK | AT91C_PMC_PRES_CLK_8;
AT91C_BASE_PMC->PMC_SCER = AT91C_PMC_PCK0;
while ((AT91C_BASE_PMC->PMC_SR & AT91C_PMC_PCK0RDY) == 0);
#elif defined(at91cap9stk)
// Switch to slow clock oscillator
AT91C_BASE_PMC->PMC_MCKR = (AT91C_BASE_PMC->PMC_MCKR & ~AT91C_PMC_CSS) | AT91C_PMC_CSS_SLOW_CLK;
while ((AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) != AT91C_PMC_MCKRDY);
// Configure PLLA at 98.304MHz
AT91C_BASE_PMC->PMC_PLLAR = 0x23FF3F7D;
while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCKA));
// Switch to slow clock + prescaler
AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_MDIV_2;
while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
// Switch to PLL + prescaler
AT91C_BASE_PMC->PMC_MCKR |= AT91C_PMC_CSS_PLLA_CLK;
while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
// Enable the DAC master clock : 12 288 000 Hz (= (98.304MHz / 8) = (48kHz * 256) )
AT91C_BASE_PMC->PMC_PCKR[2] = AT91C_PMC_CSS_PLLA_CLK | AT91C_PMC_PRES_CLK_8;
AT91C_BASE_PMC->PMC_SCER = AT91C_PMC_PCK2;
while ((AT91C_BASE_PMC->PMC_SR & AT91C_PMC_PCK2RDY) == 0);
#endif
printf("-- Basic SSC I2S AT73C213 Project %s --\n\r", SOFTPACK_VERSION);
printf("-- %s\n\r", BOARD_NAME);
printf("-- Compiled: %s %s --\n\r", __DATE__, __TIME__);
// Load WAV file information
isValid = WAV_IsValid(userWav);
ASSERT(isValid, "-F- Invalid WAV file provided\n\r");
isWavPlaying = 0;
// Sample rate must be 48kHz
printf("-I- Sample rate = %d Hz\n\r", userWav->sampleRate);
ASSERT(userWav->sampleRate == 48000, "-F- The WAV file must have a sample rate of 48kHz\n\r");
// Initialize the audio DAC
// Configure and enable the DAC
AT73C213_Enable(userWav->sampleRate,
userWav->bitsPerSample / 8,
userWav->numChannels,
MCK_SEL,
MCK);
// Configure and enable the SSC interrupt
AIC_ConfigureIT(BOARD_AT73C213_SSC_ID, 0, ISR_Ssc);
AIC_EnableIT(BOARD_AT73C213_SSC_ID);
// Enter menu loop
while (1) {
// Display menu
DisplayMenu();
// Process user input
key = DBGU_GetChar();
// Play WAV file
if ((key == 'W') && !isWavPlaying) {
PlayWavFile();
isWavPlaying = 1;
}
// Display WAV information
else if (key == 'I') {
DisplayWavInfo();
}
// Stop playback
else if ((key == 'S') && isWavPlaying) {
StopPlayback();
isWavPlaying = 0;
}
}
}