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

Dependencies:   SPI_MX25R mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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 }