main
Default mainpagebasic-serialflash-projectmain
Description Source Call Graph
Start Line: 507
int main(void)
{
    unsigned int jedecId;
    unsigned int numPages;
    unsigned int pageSize;
    unsigned int i, j;
    unsigned int address;
    unsigned char pBuffer[MAXPAGESIZE];

    // Configure the DBGU
    TRACE_CONFIGURE(DBGU_STANDARD, 115200, BOARD_MCK);
    printf("-- Basic Serial Firmware Dataflash Project %s --\n\r", SOFTPACK_VERSION);
    printf("-- %s\n\r", BOARD_NAME);
    printf("-- Compiled: %s %s --\n\r", __DATE__, __TIME__);

    // Initialize the SPI and serial flash
    PIO_Configure(pins, PIO_LISTSIZE(pins));
    AIC_ConfigureIT(SPI_ID, 0, ISR_Spi);
    SPID_Configure(&spid, SPI_BASE, SPI_ID);
    AT26_Configure(&at26, &spid, SPI_CS);
    AIC_EnableIT(SPI_ID);
    TRACE_INFO("SPI and AT26 drivers initialized\n\r");
    
    // Read the JEDEC ID of the device to identify it
    jedecId = AT26_ReadJedecId(&at26);
    if (AT26_FindDevice(&at26, jedecId)) {

        TRACE_INFO("%s serial flash detected\n\r", AT26_Name(&at26));
    }
    else {

        TRACE_ERROR("Failed to recognize the device (JEDEC ID is 0x%08X).\n\r", jedecId);
        return 1;
    }
    ASSERT(MAXPAGESIZE >= AT26_PageSize(&at26), "-F- MAXPAGESIZE too small\n\r");

    // Get device parameters
    numPages = AT26_PageNumber(&at26);
    pageSize = AT26_PageSize(&at26);

    // Unprotected the flash
    AT26_Unprotect(&at26);
    TRACE_INFO("Flash unprotected\n\r");

    // Erase the chip
    TRACE_INFO("Chip is being erased...\n\r");
    AT26_EraseChip(&at26);
    TRACE_INFO("Checking erase ...\n\r");

    // Check that the chip has been erased correctly
    address = 0;
    for (i=0; i < numPages; i++) {

        TRACE_INFO("Checking page #%u\r", i);
        AT26_Read(&at26, pBuffer, pageSize, address);
        for (j=0; j < pageSize; j++) {

            if (pBuffer[j] != 0xFF) {

                TRACE_ERROR("Failed erase on page%u:byte%u\n\r", i, j);
                TRACE_ERROR(
                          "-E- Expected 0xFF, read 0x%02X\n\r",
                          pBuffer[j]);
                return 2;
            }
        }

        address += pageSize;
    }
    TRACE_INFO("Erase successful.\n\r");

    // Program a "walking one" pattern on each page
    TRACE_INFO("Programming a walking 1 on all pages ...\n\r");
    address = 0;
    for (i=0; i < numPages; i++) {

        TRACE_INFO("Programming page #%u\r", i);

        // Fill buffer
        for (j=0; j < pageSize; j++) {

            pBuffer[j] = 1 << (j & 0x7);
        }

        // Write buffer
        AT26_Write(&at26, pBuffer, pageSize, address);

        // Read page back and check result
        memset(pBuffer, 0, pageSize);
        AT26_Read(&at26, pBuffer, pageSize, address);

        for (j=0; j < pageSize; j++) {

            if (pBuffer[j] != (1 << (j & 0x7))) {

                TRACE_ERROR("Failed program on page%u:byte%u\n\r", i, j);
                TRACE_ERROR(
                          "-E- Expected 0x%02X, read 0x%02X\n\r",
                          1 << (j & 0x7),
                          pBuffer[j]);
                return 3;
            }
        }

        address += pageSize;
    }

    TRACE_INFO("Walking 1 test successful.\n\r");

    return 0;
}