serial_flash_test.c
来自「Freescale MCF5445evb 参考测试代码」· C语言 代码 · 共 304 行
C
304 行
/*! * \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 + =
减小字号Ctrl + -
显示快捷键?