Freescale FRDM-K64F development platform with external Macronix Serial NOR Flash used to perform SPI Read, Program, and Erase.
main.cpp
00001 #include <ctype.h> 00002 #include "mbed.h" 00003 #include "SPI_MX25R.h" 00004 DigitalOut myled3(LED3); //Red 00005 DigitalOut myled1(LED1); //Blue 00006 DigitalOut led_green(LED_GREEN); 00007 DigitalOut led_red(LED_RED); 00008 00009 // SPI_MX25R(PinName mosi, PinName miso, PinName sclk, PinName cs) ; 00010 // FRDM-K64F 00011 // D13 SPI0_SCK (PTD1) J2<12> 00012 // D12 SPI0_MISO (PTD3) J2<10> 00013 // D11 SPI0_MOSI (PTD2) J2<8> 00014 // D10 SPI0_PCS0 (PTD0) J2<6> 00015 // Vdd =3.3V = J3<4> 00016 // Gnd =0.0V = J2<14> 00017 SPI_MX25R spi_mem(PTD2, PTD3, PTD1,PTD0) ; 00018 00019 00020 void rdRange(unsigned long rd_start_address, unsigned long rd_end_address) 00021 { 00022 unsigned int i, j ; 00023 unsigned char data[0x10] ; 00024 unsigned long current_address = rd_start_address ; 00025 printf("\n\r") ; 00026 printf("rd_start_address = 0x%08X\n\r", rd_start_address) ; 00027 printf("rd_end_address = 0x%08X\n\r", rd_end_address) ; 00028 printf("\n\r") ; 00029 printf(" ") ; // print header +0 to +F 00030 for (i = 0 ; i < 0x10 ; i++ ) { 00031 printf("+%X ",i) ; 00032 } 00033 printf("\n\r") ; 00034 printf(" -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --") ; 00035 printf("\n\r") ; 00036 for (i = rd_start_address ; current_address < rd_end_address ; i++ ) { 00037 printf("%06X : ", current_address ) ; // print start address : 00038 for (j = 0 ; j <= 15 ; j++ ) { 00039 data[j] = spi_mem.read8(current_address ) ; 00040 printf("%02X ", data[j]) ; 00041 current_address = current_address + 0x01 ; 00042 } 00043 printf(": ") ; 00044 for (i = 0 ; i < 0x10 ; i++ ) { 00045 if (isprint(data[i])) { 00046 printf("%c", data[i]) ; 00047 } else { 00048 printf(".") ; 00049 } 00050 } 00051 printf(" :\n\r") ; 00052 } 00053 printf("\n\r") ; 00054 } 00055 00056 void rdSFDPRange(unsigned long rd_start_address, unsigned long rd_end_address) 00057 { 00058 unsigned int i, j ; 00059 unsigned char data[0x10] ; 00060 unsigned long current_address = rd_start_address ; 00061 printf("\n\r") ; 00062 printf("rd_start_address = 0x%08X\n\r", rd_start_address) ; 00063 printf("rd_end_address = 0x%08X\n\r", rd_end_address) ; 00064 printf("\n\r") ; 00065 printf(" ") ; // print header +0 to +F 00066 for (i = 0 ; i < 0x10 ; i++ ) { 00067 printf("+%X ",i) ; 00068 } 00069 printf("\n\r") ; 00070 printf(" -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --") ; 00071 printf("\n\r") ; 00072 for (i = rd_start_address ; current_address < rd_end_address ; i++ ) { 00073 printf("%06X : ", current_address ) ; // print start address : 00074 for (j = 0 ; j <= 15 ; j++ ) { 00075 data[j] = spi_mem.readSFDP(current_address ) ; 00076 printf("%02X ", data[j]) ; 00077 current_address = current_address + 0x01 ; 00078 } 00079 printf(": ") ; 00080 for (i = 0 ; i < 0x10 ; i++ ) { 00081 if (isprint(data[i])) { 00082 printf("%c", data[i]) ; 00083 } else { 00084 printf(".") ; 00085 } 00086 } 00087 printf(" :\n\r") ; 00088 } 00089 printf("\n\r") ; 00090 } 00091 00092 void rdFREADRange(unsigned long rd_start_address, unsigned long rd_end_address) 00093 { 00094 unsigned int i, j ; 00095 unsigned char data[0x10] ; 00096 unsigned long current_address = rd_start_address ; 00097 printf("\n\r") ; 00098 printf("rd_start_address = 0x%08X\n\r", rd_start_address) ; 00099 printf("rd_end_address = 0x%08X\n\r", rd_end_address) ; 00100 printf("\n\r") ; 00101 printf(" ") ; // print header +0 to +F 00102 for (i = 0 ; i < 0x10 ; i++ ) { 00103 printf("+%X ",i) ; 00104 } 00105 printf("\n\r") ; 00106 printf(" -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --") ; 00107 printf("\n\r") ; 00108 for (i = rd_start_address ; current_address < rd_end_address ; i++ ) { 00109 printf("%06X : ", current_address ) ; // print start address : 00110 for (j = 0 ; j <= 15 ; j++ ) { 00111 data[j] = spi_mem.readFREAD(current_address ) ; 00112 printf("%02X ", data[j]) ; 00113 current_address = current_address + 0x01 ; 00114 } 00115 printf(": ") ; 00116 for (i = 0 ; i < 0x10 ; i++ ) { 00117 if (isprint(data[i])) { 00118 printf("%c", data[i]) ; 00119 } else { 00120 printf(".") ; 00121 } 00122 } 00123 printf(" :\n\r") ; 00124 } 00125 printf("\n\r") ; 00126 } 00127 00128 void commandMenu(void) // TeraTerm Display (Enable Terminal Local Echo On). 00129 { 00130 printf("== Commands =========== (Comments) ===============================================\n\r") ; 00131 printf("\n\r") ; 00132 printf(" wren (Write Enable, set WEL=1, 06h)\n\r") ; 00133 printf(" wrdi (Write Disable, set WEL=0, 04h)\n\r") ; 00134 printf(" rdid (Read Manu & JEDEC Dev ID, 9Fh)\n\r") ; 00135 printf(" rems (Read Elect. Manu & Dev ID,90h)\n\r") ; 00136 printf(" res (Read Elect. Signiture, ABh)\n\r") ; 00137 printf(" rdsr (Read Status Register, 05h)\n\r") ; 00138 printf(" rdcr (Read Config Register, 15h)\n\r") ; 00139 printf(" rdscr (Read Security Register, 2Bh)\n\r") ; 00140 printf(" enso (Enter Secure OTP Area, B1h)\n\r") ; 00141 printf(" exso (Exit Secure OTP Area, C1h)\n\r") ; 00142 printf(" reset (ResetEnable + SoftwareReset = 66h + 99h)\n\r") ; 00143 printf(" hp (Enter HP mode = WREN=06h + WRSR= 01h 000002h)\n\r") ; 00144 printf(" lp (Enter LP mode = WREN=06h + WRSR= 01h 000000h)\n\r") ; 00145 printf(" wrsr data_3B (Write SR 01h +3B data,ex: wrsr 000002h, set wren 1st)\n\r") ; 00146 printf(" wrscr data_1B (Write Security Reg 2Fh +1B data, caution LDSO bit OTP!)\n\r") ; 00147 printf(" se address (4KB Sector Erase, ex: be 0x00 <- note: sets WEL)\n\r") ; 00148 printf(" be address (64KB Block Erase, ex: be 0x00 <- note: sets WEL)\n\r") ; 00149 printf(" 32Kbe address (32KB Block Erase, ex: 32kbe 0x00 <- note: sets WEL)\n\r") ; 00150 printf(" ce (Chip Erase = C7h, ex: ce <- note: sets WEL)\n\r") ; 00151 printf(" pp address (256B Page Program, ex: pp 0x00 <- note: sets WEL)\n\r") ; 00152 printf(" read address (read 1 byte of data, ex: read 0x0000)\n\r") ; 00153 printf(" rd1 startadr endadr (read range of data, ex: rd1 0x00 0x10)\n\r") ; 00154 printf(" fread startadr endadr (read range of data, ex: sfdp 0x00 0x10)\n\r") ; 00155 printf(" sfdp startadr endadr (read range of SFDP, ex: sfdp 0x00 0x10)\n\r") ; 00156 printf("==================================================================================\n\r") ; 00157 printf("\n\r") ; 00158 } 00159 00160 int main() { 00161 char cmd[32] ; 00162 int i ; 00163 int numData = 256 ; 00164 unsigned long address = 0 ; 00165 unsigned long rd_start_address = 0 ; 00166 unsigned long rd_end_address = 0 ; 00167 unsigned char data[256] ; 00168 00169 extern serial_t stdio_uart ; 00170 serial_baud(&stdio_uart, 9600) ; 00171 00172 printf("\n\r") ; 00173 printf("\n\r") ; 00174 printf("\n\r") ; 00175 printf("\n\r") ; 00176 printf("\n\r ####################################################\n\r") ; 00177 printf(" # #\n\r") ; 00178 printf(" # Macronix MX25Rxx35F Serial NOR Flash Testbench #\n\r") ; 00179 printf(" # #\n\r") ; 00180 printf(" ####################################################\n\r") ; 00181 printf("\n\r") ; 00182 printf("\n\r") ; 00183 commandMenu() ; 00184 00185 myled3 = 1; 00186 myled1 = 1; 00187 led_green = 0; 00188 led_red = 1; 00189 00190 while(1){ 00191 printf("Enter command from list, or type menu.\n\r") ; 00192 printf("> ") ; 00193 scanf("%s", cmd) ; 00194 00195 if (strcmp(cmd, "read") == 0) { // Read Byte 00196 scanf("%X", &address) ; 00197 data[0] = spi_mem.read8(address) ; 00198 printf("%01X : 0x%02X\n\r", address, data[0]) ; 00199 00200 } else if (strcmp(cmd, "rd1") == 0) { // Read Range 00201 scanf("%X", &rd_start_address) ; 00202 scanf("%X", &rd_end_address) ; 00203 rdRange(rd_start_address, rd_end_address) ; 00204 00205 } else if (strcmp(cmd, "rdsr") == 0) { // Read Status Register 00206 data[0] = spi_mem.readStatus() ; 00207 printf(" status register = 0x%02X\n\r", data[0]) ; 00208 printf("RDSR = 05h done\n\r") ; 00209 00210 } else if (strcmp(cmd, "rdscr") == 0) { // Read Security Register 00211 data[0] = spi_mem.readSecurity() ; 00212 printf(" security register = 0x%02X\n\r", data[0]) ; 00213 printf("RDSR = 05h done\n\r") ; 00214 00215 } else if (strcmp(cmd, "reset") == 0) { // ResetEnable + Software Reset 00216 spi_mem.resetEnable() ; 00217 spi_mem.reset() ; 00218 printf("Software ResestEnable 66h + Reset 99h completed\n\r") ; 00219 00220 } else if (strcmp(cmd, "rdcr") == 0) { // Read Configuration Register 00221 printf(" configuration register = 0x%04X\n\r", spi_mem.readConfig()) ; 00222 printf("RDCR = 15h done\n\r") ; 00223 00224 } else if (strcmp(cmd, "rdid") == 0) { // Read Manufacturer and JEDEC Device ID 00225 printf(" ID = 0x%06X\n\r", spi_mem.readID()) ; 00226 printf("RDID = 9Fh done\n\r") ; 00227 00228 } else if (strcmp(cmd, "rems") == 0) { // Read Electronic Munufacturer and Device ID 00229 printf(" ID = 0x%04X\n\r", spi_mem.readREMS()) ; 00230 printf("REMS = 90h done\n\r") ; 00231 00232 } else if (strcmp(cmd, "res") == 0) { // Read Electronic Signiture 00233 data[0] = spi_mem.readRES() ; 00234 printf(" Electronic Signiture = 0x%02X\n\r", data[0]) ; 00235 printf("RES = ABh done\n\r") ; 00236 00237 } else if (strcmp(cmd, "wren") == 0) { // Write Enable 00238 spi_mem.writeEnable() ; 00239 printf(" WREN = 06h set\n\r") ; 00240 00241 } else if (strcmp(cmd, "wrdi") == 0) { // Write Disable 00242 spi_mem.writeDisable() ; 00243 printf(" done\n\r") ; 00244 00245 } else if (strcmp(cmd, "enso") == 0) { // Enter Secure OTP Area 00246 spi_mem.enterSecureOTP() ; 00247 printf(" Entered Secure OTP Area\n\r") ; 00248 00249 } else if (strcmp(cmd, "exso") == 0) { // Exit Secure OTP Area 00250 spi_mem.exitSecureOTP() ; 00251 printf(" Entered Secure OTP Area\n\r") ; 00252 00253 } else if (strcmp(cmd, "pp") == 0) { // Page Program 00254 scanf("%X", &address) ; 00255 printf("writing %d bytes to 0x%X\n\r",numData, address) ; 00256 spi_mem.writeEnable() ; // send WREN 1st 00257 for (i = 0 ; i < numData ; i++ ) { 00258 data[i] = i & 0xFF ; 00259 } 00260 spi_mem.programPage(address, data, numData) ; 00261 data[0] = 0 ; 00262 while((data[0] & 0x01) != 0x01 ) { 00263 printf(".") ; 00264 data[0] = spi_mem.readStatus() ; 00265 wait(0.01) ; 00266 } 00267 printf("\n\r") ; 00268 printf(" PP = 02h done\n\r") ; 00269 00270 } else if (strcmp(cmd, "ce") == 0) { // Chip Erase 00271 spi_mem.writeEnable() ; // send WREN 1st 00272 spi_mem.chipErase() ; 00273 data[0] = 0x01 ; // poll if WIP bit SR<0>=1 00274 while((data[0] & 0x01) != 0 ) { 00275 printf("wait, chip erase in progress") ; 00276 data[0] = spi_mem.readStatus() ; 00277 printf(" --> status register = 0x%02X\n\r", data[0]) ; 00278 wait(5) ; 00279 } // end poll 00280 printf("CE = C7h done\n\r") ; 00281 00282 } else if (strcmp(cmd, "se") == 0) { // Sector Erase 00283 scanf("%X", &address) ; 00284 printf("Eraseing address 0x%X\n\r", address) ; 00285 spi_mem.writeEnable() ; // send WREN 1st 00286 spi_mem.sectorErase(address) ; 00287 data[0] = 0x01 ; // poll if WIP bit SR<0>=1 00288 while((data[0] & 0x01) != 0 ) { 00289 printf(".") ; 00290 data[0] = spi_mem.readStatus() ; 00291 wait(0.1) ; 00292 } // end poll 00293 printf("SE = 20h done\n\r") ; 00294 00295 } else if (strcmp(cmd, "be") == 0) { // 64KB Block Erase 00296 scanf("%X", &address) ; 00297 printf("Eraseing address 0x%X\n\r", address) ; 00298 spi_mem.writeEnable() ; // send WREN 1st 00299 spi_mem.blockErase(address) ; 00300 data[0] = 0x01 ; // poll if WIP bit SR<0>=1 00301 while((data[0] & 0x01) != 0 ) { 00302 printf(".") ; 00303 data[0] = spi_mem.readStatus() ; 00304 wait(0.1) ; 00305 } // end poll 00306 printf("BE = D8h done\n\r") ; 00307 00308 } else if (strcmp(cmd, "32kbe") == 0) { // 32KB Block Erase 00309 scanf("%X", &address) ; 00310 printf("Eraseing address 0x%X\n\r", address) ; 00311 spi_mem.writeEnable() ; // send WREN 1st 00312 spi_mem.blockErase(address) ; 00313 data[0] = 0x01 ; // poll if WIP bit SR<0>=1 00314 while((data[0] & 0x01) != 0 ) { 00315 printf(".") ; 00316 data[0] = spi_mem.readStatus() ; 00317 wait(0.1) ; 00318 } // end poll 00319 printf("32KBE = 52h done\n\r") ; 00320 00321 } else if (strcmp(cmd, "wrsr") == 0) { // Write to Status and Configuration Reg 1 and 2 00322 scanf("%X", &address) ; 00323 spi_mem.writeStatusreg(address) ; // Write SR cmd 01h +SRdata 00h +CR1data 00h +CR2data 02h, (CR2<1> = 1 to Enter HP Mode) 00324 wait(0.5) ; 00325 printf(" You wrote 0x%X to Staus and Config Register 1 and 2 \n\r", address) ; 00326 00327 } else if (strcmp(cmd, "wrscr") == 0) { // Write to Security Reg 00328 scanf("%X", &address) ; 00329 spi_mem.writeSecurityreg(address) ; // WRSCUR cmd 2Fh + 1B of data 00330 wait(0.5) ; 00331 printf(" You wrote 0x%X to Security Register \n\r", address) ; 00332 00333 } else if (strcmp(cmd, "hp") == 0) { // Enter High Performance Mode 00334 spi_mem.writeEnable() ; // send WREN 1st 00335 spi_mem.writeStatusreg(0x000002) ; // Write SR cmd 01h +SRdata 00h +CR1data 00h +CR2data 02h, (CR2<1> = 1 to Ernter HP Mode) 00336 printf(" You are now in High Performance mode (Red LED on)\n\r") ; 00337 led_red = 0; 00338 led_green = 1; 00339 00340 } else if (strcmp(cmd, "lp") == 0) { // Enter Low Power Mode 00341 spi_mem.writeEnable() ; // send WREN 1st 00342 spi_mem.writeStatusreg(0x000000) ; // Write SR cmd 01h +SRdata 00h +CR1data 00h +CR2data 00h, (CR2<1> = 0 to Ernter LP Mode) 00343 printf(" You are now in Low Power mode (Green LED on)\n\r") ; 00344 led_green = 0; 00345 led_red = 1; 00346 00347 } else if (strcmp(cmd, "fread") == 0) { // Read SFDP Range 00348 scanf("%X", &rd_start_address) ; 00349 scanf("%X", &rd_end_address) ; 00350 rdFREADRange(rd_start_address, rd_end_address) ; 00351 00352 } else if (strcmp(cmd, "sfdp") == 0) { // Read SFDP Range 00353 scanf("%X", &rd_start_address) ; 00354 scanf("%X", &rd_end_address) ; 00355 rdSFDPRange(rd_start_address, rd_end_address) ; 00356 00357 } else if (strcmp(cmd, "help") == 0) { 00358 commandMenu() ; 00359 } else if (strcmp(cmd, "menu") == 0) { 00360 commandMenu() ; 00361 } else { 00362 printf("Command NOT Recognized [ %s ]\n\r", cmd) ; 00363 commandMenu() ; 00364 } 00365 } 00366 }
Generated on Tue Jul 12 2022 19:07:22 by 1.7.2