MX25R6435F Library Example

Dependencies:   SPI_MX25R mbed

Fork of MX25Rxx35F_Serial_NOR_Flash_Testbench by alec cohen

Committer:
Arkadi
Date:
Wed Mar 28 13:19:29 2018 +0000
Revision:
4:bbde9a0a0b0d
Parent:
3:5dcc71b5ea22
MX25R6435F Library example

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