main
Default mainpagebasic-ssc-i2s-at73c213-projectmain
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;
        }
    }
}