Freescale FRDM-K64F development platform with external Macronix Serial NOR Flash used to perform SPI Read, Program, and Erase.

Dependencies:   SPI_MX25R mbed

Committer:
alec1
Date:
Wed Jul 08 20:59:56 2015 +0000
Revision:
0:b2771f496313
Child:
1:550759f64702
Rev0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
alec1 0:b2771f496313 1 #include <ctype.h>
alec1 0:b2771f496313 2 #include "mbed.h"
alec1 0:b2771f496313 3 #include "SPI_MX25R.h"
alec1 0:b2771f496313 4 DigitalOut myled3(LED3); //Red
alec1 0:b2771f496313 5 DigitalOut myled1(LED1); //Blue
alec1 0:b2771f496313 6 DigitalOut led_green(LED_GREEN);
alec1 0:b2771f496313 7
alec1 0:b2771f496313 8 // SPI_MX25R(PinName mosi, PinName miso, PinName sclk, PinName cs) ;
alec1 0:b2771f496313 9 // FRDM-K64F
alec1 0:b2771f496313 10 // D13 SPI0_SCK (PTD1) J2<12>
alec1 0:b2771f496313 11 // D12 SPI0_MISO (PTD3) J2<10>
alec1 0:b2771f496313 12 // D11 SPI0_MOSI (PTD2) J2<8>
alec1 0:b2771f496313 13 // D10 SPI0_PCS0 (PTD0) J2<6>
alec1 0:b2771f496313 14 // Vdd =3.3V = J3<4>
alec1 0:b2771f496313 15 // Gnd =0.0V = J2<14>
alec1 0:b2771f496313 16 SPI_MX25R spi_mem(PTD2, PTD3, PTD1, PTD0) ;
alec1 0:b2771f496313 17
alec1 0:b2771f496313 18 void usage(void)
alec1 0:b2771f496313 19 {
alec1 0:b2771f496313 20 printf("==== List of Commands =============================================================\n\r") ;
alec1 0:b2771f496313 21 printf("\n\r") ;
alec1 0:b2771f496313 22 printf("rdid (Read Manu and Dev ID, 9Fh)\n\r") ;
alec1 0:b2771f496313 23 printf("wren (Write Enable, set WEL=1, 06h)\n\r") ;
alec1 0:b2771f496313 24 printf("wrdi (Write Disable, set WEL=0, 04h)\n\r") ;
alec1 0:b2771f496313 25 printf("rdsr (Read Status Register, 05h + 00h)\n\r") ;
alec1 0:b2771f496313 26 printf("reset (ResetEnable + SoftwareReset = 66h + 99h)\n\r") ;
alec1 0:b2771f496313 27 printf("hp (Enter HP mode = WREN=06h + WRSR= 01h 00 00 02h )\n\r") ;
alec1 0:b2771f496313 28 printf("lp (Enter LP mode = WREN=06h + WRSR= 01h 00 00 00h )\n\r") ;
alec1 0:b2771f496313 29 printf("rdcr (Read Config Register, 15h + 00 00h)\n\r") ;
alec1 0:b2771f496313 30 printf("read address (read 1 byte of data, ex: read 0x0000)\n\r") ;
alec1 0:b2771f496313 31 printf("rd4 address (read 4 bytes of data, ex: read 0x0000)\n\r") ;
alec1 0:b2771f496313 32 printf("rd256 address (read 256 bytes of data, ex: read 0x0000)\n\r") ;
alec1 0:b2771f496313 33 printf("pp address (256B Page Program, ex: pp 0x00 <- note: routine sets WEL)\n\r") ;
alec1 0:b2771f496313 34 printf("se address (4KB Sector Erase, ex: be 0x00 <- note: routine sets WEL)\n\r") ;
alec1 0:b2771f496313 35 printf("be address (64KB Block Erase, ex: be 0x00 <- note: routine sets WEL)\n\r") ;
alec1 0:b2771f496313 36 printf("32Kbe address (32KB Block Erase, ex: 32kbe 0x00 <- note: routine sets WEL)\n\r") ;
alec1 0:b2771f496313 37 printf("ce (Chip Erase = C7h, ex: ce <- note: routine sets WEL)\n\r") ;
alec1 0:b2771f496313 38 printf("\n\r") ;
alec1 0:b2771f496313 39 printf("===================================================================================\n\r") ;
alec1 0:b2771f496313 40 }
alec1 0:b2771f496313 41
alec1 0:b2771f496313 42 void rd256(unsigned long address)
alec1 0:b2771f496313 43 {
alec1 0:b2771f496313 44 unsigned int i, j ;
alec1 0:b2771f496313 45 unsigned char data[0x10] ;
alec1 0:b2771f496313 46
alec1 0:b2771f496313 47 printf(" : ") ;
alec1 0:b2771f496313 48 for (i = 0 ; i < 0x10 ; i++ ) {
alec1 0:b2771f496313 49 printf("+%X ",i) ;
alec1 0:b2771f496313 50 }
alec1 0:b2771f496313 51 printf("\n\r") ;
alec1 0:b2771f496313 52 for (j = 0 ; j < 0x10 ; j++ ) {
alec1 0:b2771f496313 53 printf("%06X : ", address + (0x10 * j)) ;
alec1 0:b2771f496313 54 for (i = 0 ; i < 0x10 ; i++ ) {
alec1 0:b2771f496313 55 data[i] = spi_mem.read8(address + 0x10 * j + i) ;
alec1 0:b2771f496313 56 printf("%02X ", data[i]) ;
alec1 0:b2771f496313 57 }
alec1 0:b2771f496313 58 printf(": ") ;
alec1 0:b2771f496313 59 for (i = 0 ; i < 0x10 ; i++ ) {
alec1 0:b2771f496313 60 if (isprint(data[i])) {
alec1 0:b2771f496313 61 printf("%c", data[i]) ;
alec1 0:b2771f496313 62 } else {
alec1 0:b2771f496313 63 printf(".") ;
alec1 0:b2771f496313 64 }
alec1 0:b2771f496313 65 }
alec1 0:b2771f496313 66 printf(" :\n\r") ;
alec1 0:b2771f496313 67 }
alec1 0:b2771f496313 68 printf("\n\r") ;
alec1 0:b2771f496313 69 }
alec1 0:b2771f496313 70
alec1 0:b2771f496313 71 int main() {
alec1 0:b2771f496313 72 char cmd[32] ;
alec1 0:b2771f496313 73 //int tmp = 0 ;
alec1 0:b2771f496313 74 int i ;
alec1 0:b2771f496313 75 int numData = 256 ;
alec1 0:b2771f496313 76 unsigned long address = 0 ;
alec1 0:b2771f496313 77 unsigned char data[256] ;
alec1 0:b2771f496313 78
alec1 0:b2771f496313 79 extern serial_t stdio_uart ;
alec1 0:b2771f496313 80 serial_baud(&stdio_uart, 9600) ;
alec1 0:b2771f496313 81
alec1 0:b2771f496313 82 printf("\n\r") ;
alec1 0:b2771f496313 83 printf("\n\r") ;
alec1 0:b2771f496313 84 printf("\n\r") ;
alec1 0:b2771f496313 85 printf("\n\r") ;
alec1 0:b2771f496313 86 printf("\n\r ####################################################\n\r") ;
alec1 0:b2771f496313 87 printf(" # #\n\r") ;
alec1 0:b2771f496313 88 printf(" # Macronix MX25Rxx35F Serial NOR Flash Testbench #\n\r") ;
alec1 0:b2771f496313 89 printf(" # #\n\r") ;
alec1 0:b2771f496313 90 printf(" ####################################################\n\r") ;
alec1 0:b2771f496313 91 printf("\n\r") ;
alec1 0:b2771f496313 92 usage() ;
alec1 0:b2771f496313 93
alec1 0:b2771f496313 94 myled3 = 1;
alec1 0:b2771f496313 95 myled1 = 1;
alec1 0:b2771f496313 96 led_green = 0;
alec1 0:b2771f496313 97
alec1 0:b2771f496313 98 while(1){
alec1 0:b2771f496313 99 printf("> ") ;
alec1 0:b2771f496313 100 scanf("%s", cmd) ;
alec1 0:b2771f496313 101 if (strcmp(cmd, "read") == 0) {
alec1 0:b2771f496313 102 scanf("%X", &address) ;
alec1 0:b2771f496313 103 data[0] = spi_mem.read8(address) ;
alec1 0:b2771f496313 104 printf("%01X : 0x%02X\n\r", address, data[0]) ;
alec1 0:b2771f496313 105
alec1 0:b2771f496313 106 } else if (strcmp(cmd, "rd4") == 0) {
alec1 0:b2771f496313 107 scanf("%X", &address) ;
alec1 0:b2771f496313 108 printf(" 4B data = 0x%08X\n\r", spi_mem.rd32(address)) ;
alec1 0:b2771f496313 109
alec1 0:b2771f496313 110 } else if (strcmp(cmd, "rdsr") == 0) { // Read Status Register
alec1 0:b2771f496313 111 data[0] = spi_mem.readStatus() ;
alec1 0:b2771f496313 112 printf(" status register = 0x%02X\n\r", data[0]) ;
alec1 0:b2771f496313 113 printf("RDSR = 05h done\n\r") ;
alec1 0:b2771f496313 114 led_green = 1;
alec1 0:b2771f496313 115
alec1 0:b2771f496313 116 } else if (strcmp(cmd, "reset") == 0) { // ResetEnable + Software Reset
alec1 0:b2771f496313 117 spi_mem.resetEnable() ;
alec1 0:b2771f496313 118 spi_mem.reset() ;
alec1 0:b2771f496313 119 printf("Software ResestEnable 66h + Reset 99h completed\n\r") ;
alec1 0:b2771f496313 120 led_green = 1;
alec1 0:b2771f496313 121
alec1 0:b2771f496313 122 } else if (strcmp(cmd, "rdcr") == 0) { // Read Configuration Register
alec1 0:b2771f496313 123 printf(" configuration register = 0x%04X\n\r", spi_mem.readConfig()) ;
alec1 0:b2771f496313 124 printf("RDCR = 15h done\n\r") ;
alec1 0:b2771f496313 125 led_green = 1;
alec1 0:b2771f496313 126
alec1 0:b2771f496313 127 } else if (strcmp(cmd, "rdid") == 0) { // Read ID
alec1 0:b2771f496313 128 printf(" ID = 0x%06X\n\r", spi_mem.readID()) ;
alec1 0:b2771f496313 129 printf("RDID = 9Fh done\n\r") ;
alec1 0:b2771f496313 130 led_green = 1;
alec1 0:b2771f496313 131
alec1 0:b2771f496313 132 } else if (strcmp(cmd, "wren") == 0) { // Write Enable
alec1 0:b2771f496313 133 spi_mem.writeEnable() ;
alec1 0:b2771f496313 134 printf(" WREN = 06h set\n\r") ;
alec1 0:b2771f496313 135 led_green = 1;
alec1 0:b2771f496313 136
alec1 0:b2771f496313 137 } else if (strcmp(cmd, "wrdi") == 0) { // Write Disable
alec1 0:b2771f496313 138 spi_mem.writeDisable() ;
alec1 0:b2771f496313 139 printf(" done\n\r") ;
alec1 0:b2771f496313 140
alec1 0:b2771f496313 141 } else if (strcmp(cmd, "pp") == 0) { // Page Program
alec1 0:b2771f496313 142 scanf("%X", &address) ;
alec1 0:b2771f496313 143 printf("writing %d bytes to 0x%X\n\r",numData, address) ;
alec1 0:b2771f496313 144 spi_mem.writeEnable() ; // send WREN 1st
alec1 0:b2771f496313 145 for (i = 0 ; i < numData ; i++ ) {
alec1 0:b2771f496313 146 data[i] = i & 0xFF ;
alec1 0:b2771f496313 147 }
alec1 0:b2771f496313 148 spi_mem.programPage(address, data, numData) ;
alec1 0:b2771f496313 149 data[0] = 0 ;
alec1 0:b2771f496313 150 while((data[0] & 0x01) != 0x01 ) {
alec1 0:b2771f496313 151 printf(".") ;
alec1 0:b2771f496313 152 data[0] = spi_mem.readStatus() ;
alec1 0:b2771f496313 153 wait(0.01) ;
alec1 0:b2771f496313 154 }
alec1 0:b2771f496313 155 printf("\n\r") ;
alec1 0:b2771f496313 156 printf(" PP = 02h done\n\r") ;
alec1 0:b2771f496313 157 led_green = 1;
alec1 0:b2771f496313 158
alec1 0:b2771f496313 159 } else if (strcmp(cmd, "ce") == 0) { // Chip Erase
alec1 0:b2771f496313 160 spi_mem.writeEnable() ; // send WREN 1st
alec1 0:b2771f496313 161 spi_mem.chipErase() ;
alec1 0:b2771f496313 162 data[0] = 0x01 ; // poll if WIP bit SR<0>=1
alec1 0:b2771f496313 163 while((data[0] & 0x01) != 0 ) {
alec1 0:b2771f496313 164 printf("wait, chip erase in progress") ;
alec1 0:b2771f496313 165 data[0] = spi_mem.readStatus() ;
alec1 0:b2771f496313 166 printf(" --> status register = 0x%02X\n\r", data[0]) ;
alec1 0:b2771f496313 167 wait(5) ;
alec1 0:b2771f496313 168 } // end poll
alec1 0:b2771f496313 169 printf("CE = C7h done\n\r") ;
alec1 0:b2771f496313 170 led_green = 0;
alec1 0:b2771f496313 171
alec1 0:b2771f496313 172 } else if (strcmp(cmd, "se") == 0) { // Sector Erase
alec1 0:b2771f496313 173 scanf("%X", &address) ;
alec1 0:b2771f496313 174 printf("Eraseing address 0x%X\n\r", address) ;
alec1 0:b2771f496313 175 spi_mem.writeEnable() ; // send WREN 1st
alec1 0:b2771f496313 176 spi_mem.sectorErase(address) ;
alec1 0:b2771f496313 177 data[0] = 0x01 ; // poll if WIP bit SR<0>=1
alec1 0:b2771f496313 178 while((data[0] & 0x01) != 0 ) {
alec1 0:b2771f496313 179 printf(".") ;
alec1 0:b2771f496313 180 data[0] = spi_mem.readStatus() ;
alec1 0:b2771f496313 181 wait(0.1) ;
alec1 0:b2771f496313 182 } // end poll
alec1 0:b2771f496313 183 printf("SE = 20h done\n\r") ;
alec1 0:b2771f496313 184 led_green = 0;
alec1 0:b2771f496313 185
alec1 0:b2771f496313 186 } else if (strcmp(cmd, "be") == 0) { // 64KB Block Erase
alec1 0:b2771f496313 187 scanf("%X", &address) ;
alec1 0:b2771f496313 188 printf("Eraseing address 0x%X\n\r", address) ;
alec1 0:b2771f496313 189 spi_mem.writeEnable() ; // send WREN 1st
alec1 0:b2771f496313 190 spi_mem.blockErase(address) ;
alec1 0:b2771f496313 191 data[0] = 0x01 ; // poll if WIP bit SR<0>=1
alec1 0:b2771f496313 192 while((data[0] & 0x01) != 0 ) {
alec1 0:b2771f496313 193 printf(".") ;
alec1 0:b2771f496313 194 data[0] = spi_mem.readStatus() ;
alec1 0:b2771f496313 195 wait(0.1) ;
alec1 0:b2771f496313 196 } // end poll
alec1 0:b2771f496313 197 printf("BE = D8h done\n\r") ;
alec1 0:b2771f496313 198 led_green = 0;
alec1 0:b2771f496313 199
alec1 0:b2771f496313 200 } else if (strcmp(cmd, "32kbe") == 0) { // 32KB Block Erase
alec1 0:b2771f496313 201 scanf("%X", &address) ;
alec1 0:b2771f496313 202 printf("Eraseing address 0x%X\n\r", address) ;
alec1 0:b2771f496313 203 spi_mem.writeEnable() ; // send WREN 1st
alec1 0:b2771f496313 204 spi_mem.blockErase(address) ;
alec1 0:b2771f496313 205 data[0] = 0x01 ; // poll if WIP bit SR<0>=1
alec1 0:b2771f496313 206 while((data[0] & 0x01) != 0 ) {
alec1 0:b2771f496313 207 printf(".") ;
alec1 0:b2771f496313 208 data[0] = spi_mem.readStatus() ;
alec1 0:b2771f496313 209 wait(0.1) ;
alec1 0:b2771f496313 210 } // end poll
alec1 0:b2771f496313 211 printf("32KBE = 52h done\n\r") ;
alec1 0:b2771f496313 212 led_green = 0;
alec1 0:b2771f496313 213
alec1 0:b2771f496313 214 } else if (strcmp(cmd, "hp") == 0) { // Enter High Performance Mode
alec1 0:b2771f496313 215 spi_mem.writeEnable() ; // send WREN 1st
alec1 0:b2771f496313 216 spi_mem.hpmode() ;
alec1 0:b2771f496313 217 printf(" You are now in High Performance mode\n\r") ;
alec1 0:b2771f496313 218 led_green = 0;
alec1 0:b2771f496313 219
alec1 0:b2771f496313 220 } else if (strcmp(cmd, "lp") == 0) { // Enter Low Power Mode
alec1 0:b2771f496313 221 spi_mem.writeEnable() ; // send WREN 1st
alec1 0:b2771f496313 222 spi_mem.lpmode() ;
alec1 0:b2771f496313 223 printf(" You are now in Low Power mode\n\r") ;
alec1 0:b2771f496313 224 led_green = 0;
alec1 0:b2771f496313 225
alec1 0:b2771f496313 226 } else if (strcmp(cmd, "rd256") == 0) {
alec1 0:b2771f496313 227 scanf("%X", &address) ;
alec1 0:b2771f496313 228 rd256(address) ;
alec1 0:b2771f496313 229 } else if (strcmp(cmd, "help") == 0) {
alec1 0:b2771f496313 230 usage() ;
alec1 0:b2771f496313 231 } else {
alec1 0:b2771f496313 232 printf("Command NOT Recognized [ %s ]\n\r", cmd) ;
alec1 0:b2771f496313 233 usage() ;
alec1 0:b2771f496313 234 }
alec1 0:b2771f496313 235 }
alec1 0:b2771f496313 236 }