📄 serial_flash_test.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 + -