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:
Thu Jul 23 17:11:38 2015 +0000
Revision:
2:32ff86163041
Parent:
1:550759f64702
added support for cmds REMS, RES, RDSCUR, WRSCUR

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 1:550759f64702 7 DigitalOut led_red(LED_RED);
alec1 2:32ff86163041 8
alec1 0:b2771f496313 9 // SPI_MX25R(PinName mosi, PinName miso, PinName sclk, PinName cs) ;
alec1 0:b2771f496313 10 // FRDM-K64F
alec1 0:b2771f496313 11 // D13 SPI0_SCK (PTD1) J2<12>
alec1 0:b2771f496313 12 // D12 SPI0_MISO (PTD3) J2<10>
alec1 0:b2771f496313 13 // D11 SPI0_MOSI (PTD2) J2<8>
alec1 0:b2771f496313 14 // D10 SPI0_PCS0 (PTD0) J2<6>
alec1 0:b2771f496313 15 // Vdd =3.3V = J3<4>
alec1 0:b2771f496313 16 // Gnd =0.0V = J2<14>
alec1 1:550759f64702 17 SPI_MX25R spi_mem(PTD2, PTD3, PTD1,PTD0) ;
alec1 2:32ff86163041 18
alec1 2:32ff86163041 19
alec1 1:550759f64702 20 void rdRange(unsigned long rd_start_address, unsigned long rd_end_address)
alec1 0:b2771f496313 21 {
alec1 0:b2771f496313 22 unsigned int i, j ;
alec1 0:b2771f496313 23 unsigned char data[0x10] ;
alec1 1:550759f64702 24 unsigned long current_address = rd_start_address ;
alec1 1:550759f64702 25 printf("\n\r") ;
alec1 1:550759f64702 26 printf("rd_start_address = 0x%08X\n\r", rd_start_address) ;
alec1 1:550759f64702 27 printf("rd_end_address = 0x%08X\n\r", rd_end_address) ;
alec1 1:550759f64702 28 printf("\n\r") ;
alec1 1:550759f64702 29 printf(" ") ; // print header +0 to +F
alec1 0:b2771f496313 30 for (i = 0 ; i < 0x10 ; i++ ) {
alec1 0:b2771f496313 31 printf("+%X ",i) ;
alec1 0:b2771f496313 32 }
alec1 0:b2771f496313 33 printf("\n\r") ;
alec1 1:550759f64702 34 printf(" -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --") ;
alec1 1:550759f64702 35 printf("\n\r") ;
alec1 1:550759f64702 36 for (i = rd_start_address ; current_address < rd_end_address ; i++ ) {
alec1 1:550759f64702 37 printf("%06X : ", current_address ) ; // print start address :
alec1 1:550759f64702 38 for (j = 0 ; j <= 15 ; j++ ) {
alec1 1:550759f64702 39 data[j] = spi_mem.read8(current_address ) ;
alec1 1:550759f64702 40 printf("%02X ", data[j]) ;
alec1 1:550759f64702 41 current_address = current_address + 0x01 ;
alec1 1:550759f64702 42 }
alec1 1:550759f64702 43 printf(": ") ;
alec1 0:b2771f496313 44 for (i = 0 ; i < 0x10 ; i++ ) {
alec1 1:550759f64702 45 if (isprint(data[i])) {
alec1 1:550759f64702 46 printf("%c", data[i]) ;
alec1 1:550759f64702 47 } else {
alec1 1:550759f64702 48 printf(".") ;
alec1 1:550759f64702 49 }
alec1 1:550759f64702 50 }
alec1 1:550759f64702 51 printf(" :\n\r") ;
alec1 1:550759f64702 52 }
alec1 1:550759f64702 53 printf("\n\r") ;
alec1 1:550759f64702 54 }
alec1 2:32ff86163041 55
alec1 1:550759f64702 56 void rdSFDPRange(unsigned long rd_start_address, unsigned long rd_end_address)
alec1 1:550759f64702 57 {
alec1 1:550759f64702 58 unsigned int i, j ;
alec1 1:550759f64702 59 unsigned char data[0x10] ;
alec1 1:550759f64702 60 unsigned long current_address = rd_start_address ;
alec1 1:550759f64702 61 printf("\n\r") ;
alec1 1:550759f64702 62 printf("rd_start_address = 0x%08X\n\r", rd_start_address) ;
alec1 1:550759f64702 63 printf("rd_end_address = 0x%08X\n\r", rd_end_address) ;
alec1 1:550759f64702 64 printf("\n\r") ;
alec1 1:550759f64702 65 printf(" ") ; // print header +0 to +F
alec1 1:550759f64702 66 for (i = 0 ; i < 0x10 ; i++ ) {
alec1 1:550759f64702 67 printf("+%X ",i) ;
alec1 1:550759f64702 68 }
alec1 1:550759f64702 69 printf("\n\r") ;
alec1 1:550759f64702 70 printf(" -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --") ;
alec1 1:550759f64702 71 printf("\n\r") ;
alec1 1:550759f64702 72 for (i = rd_start_address ; current_address < rd_end_address ; i++ ) {
alec1 1:550759f64702 73 printf("%06X : ", current_address ) ; // print start address :
alec1 1:550759f64702 74 for (j = 0 ; j <= 15 ; j++ ) {
alec1 1:550759f64702 75 data[j] = spi_mem.readSFDP(current_address ) ;
alec1 1:550759f64702 76 printf("%02X ", data[j]) ;
alec1 1:550759f64702 77 current_address = current_address + 0x01 ;
alec1 0:b2771f496313 78 }
alec1 0:b2771f496313 79 printf(": ") ;
alec1 0:b2771f496313 80 for (i = 0 ; i < 0x10 ; i++ ) {
alec1 0:b2771f496313 81 if (isprint(data[i])) {
alec1 0:b2771f496313 82 printf("%c", data[i]) ;
alec1 0:b2771f496313 83 } else {
alec1 0:b2771f496313 84 printf(".") ;
alec1 0:b2771f496313 85 }
alec1 0:b2771f496313 86 }
alec1 0:b2771f496313 87 printf(" :\n\r") ;
alec1 0:b2771f496313 88 }
alec1 0:b2771f496313 89 printf("\n\r") ;
alec1 1:550759f64702 90 }
alec1 2:32ff86163041 91
alec1 1:550759f64702 92 void rdFREADRange(unsigned long rd_start_address, unsigned long rd_end_address)
alec1 1:550759f64702 93 {
alec1 1:550759f64702 94 unsigned int i, j ;
alec1 1:550759f64702 95 unsigned char data[0x10] ;
alec1 1:550759f64702 96 unsigned long current_address = rd_start_address ;
alec1 1:550759f64702 97 printf("\n\r") ;
alec1 1:550759f64702 98 printf("rd_start_address = 0x%08X\n\r", rd_start_address) ;
alec1 1:550759f64702 99 printf("rd_end_address = 0x%08X\n\r", rd_end_address) ;
alec1 1:550759f64702 100 printf("\n\r") ;
alec1 1:550759f64702 101 printf(" ") ; // print header +0 to +F
alec1 1:550759f64702 102 for (i = 0 ; i < 0x10 ; i++ ) {
alec1 1:550759f64702 103 printf("+%X ",i) ;
alec1 1:550759f64702 104 }
alec1 1:550759f64702 105 printf("\n\r") ;
alec1 1:550759f64702 106 printf(" -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --") ;
alec1 1:550759f64702 107 printf("\n\r") ;
alec1 1:550759f64702 108 for (i = rd_start_address ; current_address < rd_end_address ; i++ ) {
alec1 1:550759f64702 109 printf("%06X : ", current_address ) ; // print start address :
alec1 1:550759f64702 110 for (j = 0 ; j <= 15 ; j++ ) {
alec1 1:550759f64702 111 data[j] = spi_mem.readFREAD(current_address ) ;
alec1 1:550759f64702 112 printf("%02X ", data[j]) ;
alec1 1:550759f64702 113 current_address = current_address + 0x01 ;
alec1 1:550759f64702 114 }
alec1 1:550759f64702 115 printf(": ") ;
alec1 1:550759f64702 116 for (i = 0 ; i < 0x10 ; i++ ) {
alec1 1:550759f64702 117 if (isprint(data[i])) {
alec1 1:550759f64702 118 printf("%c", data[i]) ;
alec1 1:550759f64702 119 } else {
alec1 1:550759f64702 120 printf(".") ;
alec1 1:550759f64702 121 }
alec1 1:550759f64702 122 }
alec1 1:550759f64702 123 printf(" :\n\r") ;
alec1 1:550759f64702 124 }
alec1 1:550759f64702 125 printf("\n\r") ;
alec1 1:550759f64702 126 }
alec1 2:32ff86163041 127
alec1 1:550759f64702 128 void commandMenu(void) // TeraTerm Display (Enable Terminal Local Echo On).
alec1 1:550759f64702 129 {
alec1 1:550759f64702 130 printf("== Commands =========== (Comments) ===============================================\n\r") ;
alec1 1:550759f64702 131 printf("\n\r") ;
alec1 1:550759f64702 132 printf(" wren (Write Enable, set WEL=1, 06h)\n\r") ;
alec1 1:550759f64702 133 printf(" wrdi (Write Disable, set WEL=0, 04h)\n\r") ;
alec1 2:32ff86163041 134 printf(" rdid (Read Manu & JEDEC Dev ID, 9Fh)\n\r") ;
alec1 2:32ff86163041 135 printf(" rems (Read Elect. Manu & Dev ID,90h)\n\r") ;
alec1 2:32ff86163041 136 printf(" res (Read Elect. Signiture, ABh)\n\r") ;
alec1 1:550759f64702 137 printf(" rdsr (Read Status Register, 05h)\n\r") ;
alec1 1:550759f64702 138 printf(" rdcr (Read Config Register, 15h)\n\r") ;
alec1 2:32ff86163041 139 printf(" rdscr (Read Security Register, 2Bh)\n\r") ;
alec1 2:32ff86163041 140 printf(" enso (Enter Secure OTP Area, B1h)\n\r") ;
alec1 2:32ff86163041 141 printf(" exso (Exit Secure OTP Area, C1h)\n\r") ;
alec1 1:550759f64702 142 printf(" reset (ResetEnable + SoftwareReset = 66h + 99h)\n\r") ;
alec1 1:550759f64702 143 printf(" hp (Enter HP mode = WREN=06h + WRSR= 01h 000002h)\n\r") ;
alec1 1:550759f64702 144 printf(" lp (Enter LP mode = WREN=06h + WRSR= 01h 000000h)\n\r") ;
alec1 1:550759f64702 145 printf(" wrsr data_3B (Write SR 01h +3B data,ex: wrsr 000002h, set wren 1st)\n\r") ;
alec1 2:32ff86163041 146 printf(" wrscr data_1B (Write Security Reg 2Fh +1B data, caution LDSO bit OTP!)\n\r") ;
alec1 1:550759f64702 147 printf(" se address (4KB Sector Erase, ex: be 0x00 <- note: sets WEL)\n\r") ;
alec1 1:550759f64702 148 printf(" be address (64KB Block Erase, ex: be 0x00 <- note: sets WEL)\n\r") ;
alec1 1:550759f64702 149 printf(" 32Kbe address (32KB Block Erase, ex: 32kbe 0x00 <- note: sets WEL)\n\r") ;
alec1 1:550759f64702 150 printf(" ce (Chip Erase = C7h, ex: ce <- note: sets WEL)\n\r") ;
alec1 1:550759f64702 151 printf(" pp address (256B Page Program, ex: pp 0x00 <- note: sets WEL)\n\r") ;
alec1 1:550759f64702 152 printf(" read address (read 1 byte of data, ex: read 0x0000)\n\r") ;
alec1 1:550759f64702 153 printf(" rd1 startadr endadr (read range of data, ex: rd1 0x00 0x10)\n\r") ;
alec1 1:550759f64702 154 printf(" fread startadr endadr (read range of data, ex: sfdp 0x00 0x10)\n\r") ;
alec1 1:550759f64702 155 printf(" sfdp startadr endadr (read range of SFDP, ex: sfdp 0x00 0x10)\n\r") ;
alec1 1:550759f64702 156 printf("==================================================================================\n\r") ;
alec1 1:550759f64702 157 printf("\n\r") ;
alec1 1:550759f64702 158 }
alec1 2:32ff86163041 159
alec1 0:b2771f496313 160 int main() {
alec1 0:b2771f496313 161 char cmd[32] ;
alec1 0:b2771f496313 162 int i ;
alec1 0:b2771f496313 163 int numData = 256 ;
alec1 0:b2771f496313 164 unsigned long address = 0 ;
alec1 1:550759f64702 165 unsigned long rd_start_address = 0 ;
alec1 1:550759f64702 166 unsigned long rd_end_address = 0 ;
alec1 0:b2771f496313 167 unsigned char data[256] ;
alec1 0:b2771f496313 168
alec1 0:b2771f496313 169 extern serial_t stdio_uart ;
alec1 0:b2771f496313 170 serial_baud(&stdio_uart, 9600) ;
alec1 0:b2771f496313 171
alec1 0:b2771f496313 172 printf("\n\r") ;
alec1 0:b2771f496313 173 printf("\n\r") ;
alec1 0:b2771f496313 174 printf("\n\r") ;
alec1 0:b2771f496313 175 printf("\n\r") ;
alec1 1:550759f64702 176 printf("\n\r ####################################################\n\r") ;
alec1 1:550759f64702 177 printf(" # #\n\r") ;
alec1 1:550759f64702 178 printf(" # Macronix MX25Rxx35F Serial NOR Flash Testbench #\n\r") ;
alec1 1:550759f64702 179 printf(" # #\n\r") ;
alec1 1:550759f64702 180 printf(" ####################################################\n\r") ;
alec1 0:b2771f496313 181 printf("\n\r") ;
alec1 1:550759f64702 182 printf("\n\r") ;
alec1 1:550759f64702 183 commandMenu() ;
alec1 0:b2771f496313 184
alec1 0:b2771f496313 185 myled3 = 1;
alec1 0:b2771f496313 186 myled1 = 1;
alec1 0:b2771f496313 187 led_green = 0;
alec1 1:550759f64702 188 led_red = 1;
alec1 0:b2771f496313 189
alec1 0:b2771f496313 190 while(1){
alec1 1:550759f64702 191 printf("Enter command from list, or type menu.\n\r") ;
alec1 0:b2771f496313 192 printf("> ") ;
alec1 0:b2771f496313 193 scanf("%s", cmd) ;
alec1 1:550759f64702 194
alec1 1:550759f64702 195 if (strcmp(cmd, "read") == 0) { // Read Byte
alec1 0:b2771f496313 196 scanf("%X", &address) ;
alec1 0:b2771f496313 197 data[0] = spi_mem.read8(address) ;
alec1 0:b2771f496313 198 printf("%01X : 0x%02X\n\r", address, data[0]) ;
alec1 1:550759f64702 199
alec1 1:550759f64702 200 } else if (strcmp(cmd, "rd1") == 0) { // Read Range
alec1 1:550759f64702 201 scanf("%X", &rd_start_address) ;
alec1 1:550759f64702 202 scanf("%X", &rd_end_address) ;
alec1 1:550759f64702 203 rdRange(rd_start_address, rd_end_address) ;
alec1 0:b2771f496313 204
alec1 1:550759f64702 205 } else if (strcmp(cmd, "rdsr") == 0) { // Read Status Register
alec1 0:b2771f496313 206 data[0] = spi_mem.readStatus() ;
alec1 0:b2771f496313 207 printf(" status register = 0x%02X\n\r", data[0]) ;
alec1 0:b2771f496313 208 printf("RDSR = 05h done\n\r") ;
alec1 2:32ff86163041 209
alec1 2:32ff86163041 210 } else if (strcmp(cmd, "rdscr") == 0) { // Read Security Register
alec1 2:32ff86163041 211 data[0] = spi_mem.readSecurity() ;
alec1 2:32ff86163041 212 printf(" security register = 0x%02X\n\r", data[0]) ;
alec1 2:32ff86163041 213 printf("RDSR = 05h done\n\r") ;
alec1 0:b2771f496313 214
alec1 0:b2771f496313 215 } else if (strcmp(cmd, "reset") == 0) { // ResetEnable + Software Reset
alec1 0:b2771f496313 216 spi_mem.resetEnable() ;
alec1 0:b2771f496313 217 spi_mem.reset() ;
alec1 0:b2771f496313 218 printf("Software ResestEnable 66h + Reset 99h completed\n\r") ;
alec1 0:b2771f496313 219
alec1 0:b2771f496313 220 } else if (strcmp(cmd, "rdcr") == 0) { // Read Configuration Register
alec1 0:b2771f496313 221 printf(" configuration register = 0x%04X\n\r", spi_mem.readConfig()) ;
alec1 0:b2771f496313 222 printf("RDCR = 15h done\n\r") ;
alec1 0:b2771f496313 223
alec1 2:32ff86163041 224 } else if (strcmp(cmd, "rdid") == 0) { // Read Manufacturer and JEDEC Device ID
alec1 0:b2771f496313 225 printf(" ID = 0x%06X\n\r", spi_mem.readID()) ;
alec1 0:b2771f496313 226 printf("RDID = 9Fh done\n\r") ;
alec1 2:32ff86163041 227
alec1 2:32ff86163041 228 } else if (strcmp(cmd, "rems") == 0) { // Read Electronic Munufacturer and Device ID
alec1 2:32ff86163041 229 printf(" ID = 0x%04X\n\r", spi_mem.readREMS()) ;
alec1 2:32ff86163041 230 printf("REMS = 90h done\n\r") ;
alec1 0:b2771f496313 231
alec1 2:32ff86163041 232 } else if (strcmp(cmd, "res") == 0) { // Read Electronic Signiture
alec1 2:32ff86163041 233 data[0] = spi_mem.readRES() ;
alec1 2:32ff86163041 234 printf(" Electronic Signiture = 0x%02X\n\r", data[0]) ;
alec1 2:32ff86163041 235 printf("RES = ABh done\n\r") ;
alec1 2:32ff86163041 236
alec1 0:b2771f496313 237 } else if (strcmp(cmd, "wren") == 0) { // Write Enable
alec1 0:b2771f496313 238 spi_mem.writeEnable() ;
alec1 0:b2771f496313 239 printf(" WREN = 06h set\n\r") ;
alec1 0:b2771f496313 240
alec1 0:b2771f496313 241 } else if (strcmp(cmd, "wrdi") == 0) { // Write Disable
alec1 0:b2771f496313 242 spi_mem.writeDisable() ;
alec1 0:b2771f496313 243 printf(" done\n\r") ;
alec1 0:b2771f496313 244
alec1 1:550759f64702 245 } else if (strcmp(cmd, "enso") == 0) { // Enter Secure OTP Area
alec1 1:550759f64702 246 spi_mem.enterSecureOTP() ;
alec1 1:550759f64702 247 printf(" Entered Secure OTP Area\n\r") ;
alec1 1:550759f64702 248
alec1 1:550759f64702 249 } else if (strcmp(cmd, "exso") == 0) { // Exit Secure OTP Area
alec1 1:550759f64702 250 spi_mem.exitSecureOTP() ;
alec1 1:550759f64702 251 printf(" Entered Secure OTP Area\n\r") ;
alec1 1:550759f64702 252
alec1 0:b2771f496313 253 } else if (strcmp(cmd, "pp") == 0) { // Page Program
alec1 0:b2771f496313 254 scanf("%X", &address) ;
alec1 0:b2771f496313 255 printf("writing %d bytes to 0x%X\n\r",numData, address) ;
alec1 0:b2771f496313 256 spi_mem.writeEnable() ; // send WREN 1st
alec1 0:b2771f496313 257 for (i = 0 ; i < numData ; i++ ) {
alec1 0:b2771f496313 258 data[i] = i & 0xFF ;
alec1 0:b2771f496313 259 }
alec1 0:b2771f496313 260 spi_mem.programPage(address, data, numData) ;
alec1 0:b2771f496313 261 data[0] = 0 ;
alec1 0:b2771f496313 262 while((data[0] & 0x01) != 0x01 ) {
alec1 0:b2771f496313 263 printf(".") ;
alec1 0:b2771f496313 264 data[0] = spi_mem.readStatus() ;
alec1 0:b2771f496313 265 wait(0.01) ;
alec1 0:b2771f496313 266 }
alec1 0:b2771f496313 267 printf("\n\r") ;
alec1 0:b2771f496313 268 printf(" PP = 02h done\n\r") ;
alec1 0:b2771f496313 269
alec1 1:550759f64702 270 } else if (strcmp(cmd, "ce") == 0) { // Chip Erase
alec1 0:b2771f496313 271 spi_mem.writeEnable() ; // send WREN 1st
alec1 0:b2771f496313 272 spi_mem.chipErase() ;
alec1 0:b2771f496313 273 data[0] = 0x01 ; // poll if WIP bit SR<0>=1
alec1 0:b2771f496313 274 while((data[0] & 0x01) != 0 ) {
alec1 0:b2771f496313 275 printf("wait, chip erase in progress") ;
alec1 0:b2771f496313 276 data[0] = spi_mem.readStatus() ;
alec1 0:b2771f496313 277 printf(" --> status register = 0x%02X\n\r", data[0]) ;
alec1 0:b2771f496313 278 wait(5) ;
alec1 0:b2771f496313 279 } // end poll
alec1 0:b2771f496313 280 printf("CE = C7h done\n\r") ;
alec1 0:b2771f496313 281
alec1 1:550759f64702 282 } else if (strcmp(cmd, "se") == 0) { // Sector Erase
alec1 0:b2771f496313 283 scanf("%X", &address) ;
alec1 0:b2771f496313 284 printf("Eraseing address 0x%X\n\r", address) ;
alec1 0:b2771f496313 285 spi_mem.writeEnable() ; // send WREN 1st
alec1 0:b2771f496313 286 spi_mem.sectorErase(address) ;
alec1 0:b2771f496313 287 data[0] = 0x01 ; // poll if WIP bit SR<0>=1
alec1 0:b2771f496313 288 while((data[0] & 0x01) != 0 ) {
alec1 0:b2771f496313 289 printf(".") ;
alec1 0:b2771f496313 290 data[0] = spi_mem.readStatus() ;
alec1 0:b2771f496313 291 wait(0.1) ;
alec1 0:b2771f496313 292 } // end poll
alec1 0:b2771f496313 293 printf("SE = 20h done\n\r") ;
alec1 0:b2771f496313 294
alec1 0:b2771f496313 295 } else if (strcmp(cmd, "be") == 0) { // 64KB Block Erase
alec1 0:b2771f496313 296 scanf("%X", &address) ;
alec1 0:b2771f496313 297 printf("Eraseing address 0x%X\n\r", address) ;
alec1 0:b2771f496313 298 spi_mem.writeEnable() ; // send WREN 1st
alec1 0:b2771f496313 299 spi_mem.blockErase(address) ;
alec1 1:550759f64702 300 data[0] = 0x01 ; // poll if WIP bit SR<0>=1
alec1 0:b2771f496313 301 while((data[0] & 0x01) != 0 ) {
alec1 0:b2771f496313 302 printf(".") ;
alec1 0:b2771f496313 303 data[0] = spi_mem.readStatus() ;
alec1 0:b2771f496313 304 wait(0.1) ;
alec1 0:b2771f496313 305 } // end poll
alec1 0:b2771f496313 306 printf("BE = D8h done\n\r") ;
alec1 0:b2771f496313 307
alec1 1:550759f64702 308 } else if (strcmp(cmd, "32kbe") == 0) { // 32KB Block Erase
alec1 0:b2771f496313 309 scanf("%X", &address) ;
alec1 0:b2771f496313 310 printf("Eraseing address 0x%X\n\r", address) ;
alec1 0:b2771f496313 311 spi_mem.writeEnable() ; // send WREN 1st
alec1 0:b2771f496313 312 spi_mem.blockErase(address) ;
alec1 0:b2771f496313 313 data[0] = 0x01 ; // poll if WIP bit SR<0>=1
alec1 0:b2771f496313 314 while((data[0] & 0x01) != 0 ) {
alec1 0:b2771f496313 315 printf(".") ;
alec1 0:b2771f496313 316 data[0] = spi_mem.readStatus() ;
alec1 0:b2771f496313 317 wait(0.1) ;
alec1 0:b2771f496313 318 } // end poll
alec1 0:b2771f496313 319 printf("32KBE = 52h done\n\r") ;
alec1 1:550759f64702 320
alec1 2:32ff86163041 321 } else if (strcmp(cmd, "wrsr") == 0) { // Write to Status and Configuration Reg 1 and 2
alec1 1:550759f64702 322 scanf("%X", &address) ;
alec1 1:550759f64702 323 spi_mem.writeStatusreg(address) ; // Write SR cmd 01h +SRdata 00h +CR1data 00h +CR2data 02h, (CR2<1> = 1 to Enter HP Mode)
alec1 1:550759f64702 324 wait(0.5) ;
alec1 1:550759f64702 325 printf(" You wrote 0x%X to Staus and Config Register 1 and 2 \n\r", address) ;
alec1 2:32ff86163041 326
alec1 2:32ff86163041 327 } else if (strcmp(cmd, "wrscr") == 0) { // Write to Security Reg
alec1 2:32ff86163041 328 scanf("%X", &address) ;
alec1 2:32ff86163041 329 spi_mem.writeSecurityreg(address) ; // WRSCUR cmd 2Fh + 1B of data
alec1 2:32ff86163041 330 wait(0.5) ;
alec1 2:32ff86163041 331 printf(" You wrote 0x%X to Security Register \n\r", address) ;
alec1 0:b2771f496313 332
alec1 0:b2771f496313 333 } else if (strcmp(cmd, "hp") == 0) { // Enter High Performance Mode
alec1 0:b2771f496313 334 spi_mem.writeEnable() ; // send WREN 1st
alec1 1:550759f64702 335 spi_mem.writeStatusreg(0x000002) ; // Write SR cmd 01h +SRdata 00h +CR1data 00h +CR2data 02h, (CR2<1> = 1 to Ernter HP Mode)
alec1 1:550759f64702 336 printf(" You are now in High Performance mode (Red LED on)\n\r") ;
alec1 1:550759f64702 337 led_red = 0;
alec1 1:550759f64702 338 led_green = 1;
alec1 0:b2771f496313 339
alec1 0:b2771f496313 340 } else if (strcmp(cmd, "lp") == 0) { // Enter Low Power Mode
alec1 0:b2771f496313 341 spi_mem.writeEnable() ; // send WREN 1st
alec1 1:550759f64702 342 spi_mem.writeStatusreg(0x000000) ; // Write SR cmd 01h +SRdata 00h +CR1data 00h +CR2data 00h, (CR2<1> = 0 to Ernter LP Mode)
alec1 1:550759f64702 343 printf(" You are now in Low Power mode (Green LED on)\n\r") ;
alec1 1:550759f64702 344 led_green = 0;
alec1 1:550759f64702 345 led_red = 1;
alec1 1:550759f64702 346
alec1 1:550759f64702 347 } else if (strcmp(cmd, "fread") == 0) { // Read SFDP Range
alec1 1:550759f64702 348 scanf("%X", &rd_start_address) ;
alec1 1:550759f64702 349 scanf("%X", &rd_end_address) ;
alec1 1:550759f64702 350 rdFREADRange(rd_start_address, rd_end_address) ;
alec1 1:550759f64702 351
alec1 1:550759f64702 352 } else if (strcmp(cmd, "sfdp") == 0) { // Read SFDP Range
alec1 1:550759f64702 353 scanf("%X", &rd_start_address) ;
alec1 1:550759f64702 354 scanf("%X", &rd_end_address) ;
alec1 1:550759f64702 355 rdSFDPRange(rd_start_address, rd_end_address) ;
alec1 1:550759f64702 356
alec1 0:b2771f496313 357 } else if (strcmp(cmd, "help") == 0) {
alec1 1:550759f64702 358 commandMenu() ;
alec1 1:550759f64702 359 } else if (strcmp(cmd, "menu") == 0) {
alec1 1:550759f64702 360 commandMenu() ;
alec1 0:b2771f496313 361 } else {
alec1 0:b2771f496313 362 printf("Command NOT Recognized [ %s ]\n\r", cmd) ;
alec1 1:550759f64702 363 commandMenu() ;
alec1 0:b2771f496313 364 }
alec1 0:b2771f496313 365 }
alec1 0:b2771f496313 366 }