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

📄 serial_flash_test.c

📁 Freescale MCF5445evb 参考测试代码
💻 C
字号:
/*! * \file    serial_flash_test.c * \brief   Test the serial flash interface on Jamaica (MCF5445x EVB) * \version $Revision: 1.6 $ * \author  Michael Norman */ #include "common.h"#include "serial_flash.h"#include "dspi.h"#include "jamaica_tests.h"uint32 sbf_code[] ={#if 0 // SRAM = 0x80000000    0x80001000,     0x80000008,     0x203C8000,     0x00000680,     0x00000221,     0x4E7B0C05,     0x203C07FF,     0x000123C0,     0xFC008004,     0x203C0800,     0x000023C0,     0xFC008018,     0x203C0000,     0x014023C0,     0xFC008020,     0x203C0000,     0x000123C0,     0xFC00801C,     0x4E71203C,     0x00200000,     0x123C00FF,     0x13C10800,     0x00054E71,     0x538066FA,     0x203C0020,     0x0000123C,     0x000013C1,     0x08000005,     0x4E715380,     0x66FA60D0,#else // SRAM = 0x00000000    0x00001000,     0x00000008,     0x203C0A00,     0x000023C0,     0xFC008000,     0x203C0000,     0x000123C0,     0xFC008004,     0x203C0800,     0x000023C0,     0xFC008018,     0x203C0000,     0x014023C0,     0xFC008020,     0x203C0000,     0x000123C0,     0xFC00801C,     0x4E71203C,     0x00200000,     0x123C00FF,     0x13C10800,     0x00054E71,     0x538066FA,     0x203C0020,     0x0000123C,     0x000013C1,     0x08000005,     0x4E715380,     0x66FA60D0#endif};uint8 sbf_config[] = #ifdef SBF_OSC_BOOT{    0x03,       /* BLDIV = 3 (CLKIN / 4) */    (sizeof(sbf_code)/4 & 0x00FF),        /* BLL[7:0] */    (sizeof(sbf_code)/4 & 0xFF00) >> 8,   /* BLL[15:8] */    0x34, 0x12, /* RCON[15:0], PCI Subsystem Vendor ID = 0x1234 */    0x78, 0x56, /* RCON[31:16], PCI Subsystem ID = 0x5678 */    0x00,       /* RCON[39:32], PCI Revision ID = 0x0 */    0x00, 0x80, 0x06,   /* RCON[63:40], PCI Class Code = 0x068000 */    0x57, 0x19, /* RCON[79:64], PCI Vendor ID */    0x07, 0x58, /* RCON[95:80], PCI Device ID */    0xFF,       /* RCON[103:96], PCI configurations */    0x00,       /* RCON[111:104], enable PLL */    20-1,//,8-1        /* RCON[119:112], PLL multiplier *(x20) */    0x88//0x98        /* RCON[127:120], 8-bit FB, muxed, oscillator bypass, BME */};#else{    0x03,       /* BLDIV = 3 (CLKIN / 4) */    (sizeof(sbf_code)/4 & 0x00FF),        /* BLL[7:0] */    (sizeof(sbf_code)/4 & 0xFF00) >> 8,   /* BLL[15:8] */    0x34, 0x12, /* RCON[15:0], PCI Subsystem Vendor ID = 0x1234 */    0x78, 0x56, /* RCON[31:16], PCI Subsystem ID = 0x5678 */    0x00,       /* RCON[39:32], PCI Revision ID = 0x0 */    0x00, 0x80, 0x06,   /* RCON[63:40], PCI Class Code = 0x068000 */    0x57, 0x19, /* RCON[79:64], PCI Vendor ID */    0x07, 0x58, /* RCON[95:80], PCI Device ID */    0xFF,       /* RCON[103:96], PCI configurations */    0x00,       /* RCON[111:104], enable PLL */    16-1,        /* RCON[119:112], PLL multiplier *(x8) */    0x98        /* RCON[127:120], 8-bit FB, muxed, oscillator bypass, BME */};#endifvoidspiflash_dump (int);/********************************************************************//*! * \brief   Serial Flash Test * \return  SPIFLASH_PASS or SPIFLASH_FAIL * * Use the DSPI module to read and write the serial flash * \todo    the dspi tx/rx protocol is a hack, fix this soon! */intserial_flash_test (void){    int i;    uint16 rxdata[20];    uint8 *u8sbfdata;        dspi_init();        //spiflash_dump(100);    /* Read SR */    while ((MCF_DSPI_DSR & 0x000000F0) != 0) {dspi_rx();}    dspi_tx(SPIFLASH_RDSR, 1, 0x80);    dspi_rx();    dspi_tx(0, 1, 0x00);    rxdata[0] = dspi_rx();    ASSERT((MCF_DSPI_DSR & 0x000000F0) == 0);    //printf("SPI Flash SR = %02x\n", rxdata[0]);    /* Read ID */    dspi_tx(SPIFLASH_RDID, 1, 0x80);    dspi_tx(0, 1, 0x80);    dspi_tx(0, 1, 0x80);    dspi_tx(0, 1, 0x00);    dspi_rx();    rxdata[0] = dspi_rx();    rxdata[1] = dspi_rx();    rxdata[2] = dspi_rx();    //printf("SPI Flash ID = %02x %02x %02x \n", rxdata[0], rxdata[1], rxdata[2]);    if (rxdata[0] != 0x20 || rxdata[1] != 0x20 || rxdata[2] != 0x15)        return SPIFLASH_FAIL;        /* Write Enable  */    //printf("Enable writes...\n");    dspi_tx(SPIFLASH_WREN, 1, 0x00);    dspi_rx();        /* Read SR */    while ((MCF_DSPI_DSR & 0x000000F0) != 0) {dspi_rx();}    dspi_tx(SPIFLASH_RDSR, 1, 0x80);    dspi_rx();    dspi_tx(0, 1, 0x00);    rxdata[0] = dspi_rx();    ASSERT((MCF_DSPI_DSR & 0x000000F0) == 0);    //printf("SPI Flash SR = %02x\n", rxdata[0]);    /* Sector Erase */    //printf("Erasing sector 0...");    dspi_tx(SPIFLASH_SE, 1, 0x80);    dspi_tx(0, 1, 0x80);    dspi_tx(0, 1, 0x80);    dspi_tx(0, 1, 0x00);    while ((MCF_DSPI_DSR & 0x000000F0) != 0) {dspi_rx();}        /* Wait for WIP to clear */    while ((MCF_DSPI_DSR & 0x000000F0) != 0) {dspi_rx();}    do     {        dspi_tx(SPIFLASH_RDSR, 1, 0x80);        dspi_rx();        dspi_tx(0, 1, 0x00);        rxdata[0] = dspi_rx();        //printf("SPI Flash SR = %02x\n", rxdata[0]);    } while (rxdata[0] & SPIFLASH_SR_WIP);    //printf("done\n");        //spiflash_dump(100);    /* Write Enable  */    //printf("Enable writes...\n");    dspi_tx(SPIFLASH_WREN, 1, 0x00);    dspi_rx();        /* Read SR */    while ((MCF_DSPI_DSR & 0x000000F0) != 0) {dspi_rx();}    dspi_tx(SPIFLASH_RDSR, 1, 0x80);    dspi_rx();    dspi_tx(0, 1, 0x00);    rxdata[0] = dspi_rx();    ASSERT((MCF_DSPI_DSR & 0x000000F0) == 0);    //printf("SPI Flash SR = %02x\n", rxdata[0]);    /* Page Program */    //printf("Programming...");    dspi_tx(SPIFLASH_PP, 1, 0x80);    dspi_rx();    dspi_tx(0x00, 1, 0x80);    dspi_rx();    dspi_tx(0x00, 1, 0x80);    dspi_rx();    dspi_tx(0x00, 1, 0x80);    dspi_rx();    u8sbfdata = (uint8 *)sbf_config;    for (i = 0; i < sizeof(sbf_config); i++)    {        dspi_tx(u8sbfdata[i], 1, 0x80);        dspi_rx();    }    u8sbfdata = (uint8 *)sbf_code;    for (i = 0; i < sizeof(sbf_code) - 1; i++)    {        dspi_tx(u8sbfdata[i], 1, 0x80);        dspi_rx();    }    dspi_tx(u8sbfdata[i], 1, 0x00);    dspi_rx();        /* Wait for WIP to clear */    while ((MCF_DSPI_DSR & 0x000000F0) != 0) {dspi_rx();}    do     {        dspi_tx(SPIFLASH_RDSR, 1, 0x80);        dspi_rx();        dspi_tx(0, 1, 0x00);        rxdata[0] = dspi_rx();        //printf("SPI Flash SR = %02x\n", rxdata[0]);    } while (rxdata[0] & SPIFLASH_SR_WIP);    //printf("done\n");        //spiflash_dump(sizeof(sbf_config) + sizeof(sbf_code));        /* Read */    dspi_tx(SPIFLASH_READ, 1, 0x80);    dspi_rx();    dspi_tx(0x00, 1, 0x80);    dspi_rx();    dspi_tx(0x00, 1, 0x80);    dspi_rx();    dspi_tx(0x00, 1, 0x80);    dspi_rx();        //printf("SPI Flash data:");    u8sbfdata = (uint8 *)sbf_config;    for (i = 0; i < sizeof(sbf_config); i++)    {        dspi_tx(0, 1, 0x80);        if (u8sbfdata[i] != dspi_rx())            return SPIFLASH_FAIL;    }    dspi_tx(0, 1, 0x00);    dspi_rx();    return SPIFLASH_PASS;}/********************************************************************/voidspiflash_dump (int bytes){    int i;        /* Read */    dspi_tx(SPIFLASH_READ, 1, 0x80);    dspi_rx();    dspi_tx(0x00, 1, 0x80);    dspi_rx();    dspi_tx(0x00, 1, 0x80);    dspi_rx();    dspi_tx(0x00, 1, 0x80);    dspi_rx();        printf("SPI Flash data:");    for (i = 0; i < bytes - 1; i++)    {        dspi_tx(0, 1, 0x80);        if (i % 16 == 0)            printf("\n%02x ",dspi_rx());        else            printf("%02x ",dspi_rx());    }    dspi_tx(0, 1, 0x00);    if (i % 16 == 0)        printf("\n%02x ",dspi_rx());    else        printf("%02x ",dspi_rx());        printf("\n");}/********************************************************************/

⌨️ 快捷键说明

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