MX25R6435F Library Example

Dependencies:   SPI_MX25R mbed

Fork of MX25Rxx35F_Serial_NOR_Flash_Testbench by alec cohen

Revision:
1:550759f64702
Parent:
0:b2771f496313
Child:
2:32ff86163041
--- a/main.cpp	Wed Jul 08 20:59:56 2015 +0000
+++ b/main.cpp	Mon Jul 20 20:56:50 2015 +0000
@@ -4,6 +4,7 @@
 DigitalOut myled3(LED3); //Red
 DigitalOut myled1(LED1); //Blue
 DigitalOut led_green(LED_GREEN);
+DigitalOut led_red(LED_RED);
 
 // SPI_MX25R(PinName mosi, PinName miso, PinName sclk, PinName cs) ;
 // FRDM-K64F
@@ -13,47 +14,67 @@
 // D10 SPI0_PCS0 (PTD0) J2<6>
 //          Vdd =3.3V = J3<4>
 //          Gnd =0.0V = J2<14>
-SPI_MX25R spi_mem(PTD2, PTD3, PTD1, PTD0) ;
+SPI_MX25R spi_mem(PTD2, PTD3, PTD1,PTD0) ;
 
-void usage(void)
-{
-    printf("==== List of Commands =============================================================\n\r") ;
-    printf("\n\r") ;
-    printf("rdid                (Read Manu and Dev ID,     9Fh)\n\r") ;
-    printf("wren                (Write Enable,  set WEL=1, 06h)\n\r") ;
-    printf("wrdi                (Write Disable, set WEL=0, 04h)\n\r") ;
-    printf("rdsr                (Read Status Register,     05h + 00h)\n\r") ;
-    printf("reset               (ResetEnable + SoftwareReset = 66h + 99h)\n\r") ;
-    printf("hp                  (Enter HP mode = WREN=06h + WRSR= 01h 00 00 02h )\n\r") ;
-    printf("lp                  (Enter LP mode = WREN=06h + WRSR= 01h 00 00 00h )\n\r") ;
-    printf("rdcr                (Read Config Register, 15h + 00 00h)\n\r") ;
-    printf("read  address       (read 1 byte of data, ex: read 0x0000)\n\r") ;
-    printf("rd4   address       (read 4 bytes of data, ex: read 0x0000)\n\r") ;
-    printf("rd256 address       (read 256 bytes of data, ex: read 0x0000)\n\r") ;
-    printf("pp    address       (256B Page Program, ex: pp 0x00    <- note: routine sets WEL)\n\r") ;
-    printf("se    address       (4KB Sector Erase,  ex: be 0x00    <- note: routine sets WEL)\n\r") ;
-    printf("be    address       (64KB Block Erase,  ex: be 0x00    <- note: routine sets WEL)\n\r") ;
-    printf("32Kbe address       (32KB Block Erase,  ex: 32kbe 0x00 <- note: routine sets WEL)\n\r") ;
-    printf("ce                  (Chip Erase = C7h,  ex: ce         <- note: routine sets WEL)\n\r") ;
-    printf("\n\r") ;
-    printf("===================================================================================\n\r") ;
-}
 
-void rd256(unsigned long address)
+void rdRange(unsigned long rd_start_address, unsigned long rd_end_address)
 {
     unsigned int i, j ;
     unsigned char data[0x10] ;
-    
-    printf("       : ") ;
+    unsigned long current_address = rd_start_address ;
+    printf("\n\r") ;
+    printf("rd_start_address = 0x%08X\n\r", rd_start_address) ;  
+    printf("rd_end_address   = 0x%08X\n\r", rd_end_address) ;  
+    printf("\n\r") ;
+    printf("         ") ;             // print header +0 to +F
     for (i = 0 ; i < 0x10 ; i++ ) {
         printf("+%X ",i) ;
     }
     printf("\n\r") ;
-    for (j = 0 ; j < 0x10 ; j++ ) {
-        printf("%06X : ", address + (0x10 * j)) ; 
+    printf("         -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --") ;             
+    printf("\n\r") ;
+        for (i = rd_start_address ; current_address < rd_end_address ; i++ ) {
+        printf("%06X : ", current_address ) ;   // print start address :
+        for (j = 0 ; j <= 15 ; j++ ) {
+            data[j] = spi_mem.read8(current_address ) ;
+            printf("%02X ", data[j]) ;
+            current_address = current_address + 0x01 ;
+        }
+        printf(": ") ;
         for (i = 0 ; i < 0x10 ; i++ ) {
-            data[i] = spi_mem.read8(address + 0x10 * j + i) ;
-            printf("%02X ", data[i]) ;
+            if (isprint(data[i])) {
+                printf("%c", data[i]) ;
+            } else {
+                printf(".") ;
+            }
+        }
+        printf(" :\n\r") ;
+    }
+    printf("\n\r") ;
+}  
+
+void rdSFDPRange(unsigned long rd_start_address, unsigned long rd_end_address)
+{
+    unsigned int i, j ;
+    unsigned char data[0x10] ;
+    unsigned long current_address = rd_start_address ;
+    printf("\n\r") ;
+    printf("rd_start_address = 0x%08X\n\r", rd_start_address) ;  
+    printf("rd_end_address   = 0x%08X\n\r", rd_end_address) ;  
+    printf("\n\r") ;
+    printf("         ") ;             // print header +0 to +F
+    for (i = 0 ; i < 0x10 ; i++ ) {
+        printf("+%X ",i) ;
+    }
+    printf("\n\r") ;
+    printf("         -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --") ;             
+    printf("\n\r") ;
+        for (i = rd_start_address ; current_address < rd_end_address ; i++ ) {
+        printf("%06X : ", current_address ) ;   // print start address :
+        for (j = 0 ; j <= 15 ; j++ ) {
+            data[j] = spi_mem.readSFDP(current_address ) ;
+            printf("%02X ", data[j]) ;
+            current_address = current_address + 0x01 ;
         }
         printf(": ") ;
         for (i = 0 ; i < 0x10 ; i++ ) {
@@ -66,14 +87,79 @@
         printf(" :\n\r") ;
     }
     printf("\n\r") ;
-}    
+} 
+
+void rdFREADRange(unsigned long rd_start_address, unsigned long rd_end_address)
+{
+    unsigned int i, j ;
+    unsigned char data[0x10] ;
+    unsigned long current_address = rd_start_address ;
+    printf("\n\r") ;
+    printf("rd_start_address = 0x%08X\n\r", rd_start_address) ;  
+    printf("rd_end_address   = 0x%08X\n\r", rd_end_address) ;  
+    printf("\n\r") ;
+    printf("         ") ;             // print header +0 to +F
+    for (i = 0 ; i < 0x10 ; i++ ) {
+        printf("+%X ",i) ;
+    }
+    printf("\n\r") ;
+    printf("         -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --") ;             
+    printf("\n\r") ;
+        for (i = rd_start_address ; current_address < rd_end_address ; i++ ) {
+        printf("%06X : ", current_address ) ;   // print start address :
+        for (j = 0 ; j <= 15 ; j++ ) {
+            data[j] = spi_mem.readFREAD(current_address ) ;
+            printf("%02X ", data[j]) ;
+            current_address = current_address + 0x01 ;
+        }
+        printf(": ") ;
+        for (i = 0 ; i < 0x10 ; i++ ) {
+            if (isprint(data[i])) {
+                printf("%c", data[i]) ;
+            } else {
+                printf(".") ;
+            }
+        }
+        printf(" :\n\r") ;
+    }
+    printf("\n\r") ;
+} 
+
+void commandMenu(void)  // TeraTerm Display (Enable Terminal Local Echo On).
+{
+    printf("== Commands =========== (Comments) ===============================================\n\r") ;
+    printf("\n\r") ;
+    printf("  wren                  (Write Enable,  set WEL=1, 06h)\n\r") ;
+    printf("  wrdi                  (Write Disable, set WEL=0, 04h)\n\r") ;
+    printf("  rdid                  (Read Manu and Dev ID,     9Fh)\n\r") ;
+    printf("  rdsr                  (Read Status Register,     05h)\n\r") ;
+    printf("  rdcr                  (Read Config Register,     15h)\n\r") ;
+    printf("  reset                 (ResetEnable + SoftwareReset = 66h + 99h)\n\r") ;
+    printf("  hp                    (Enter HP mode = WREN=06h + WRSR= 01h 000002h)\n\r") ;
+    printf("  lp                    (Enter LP mode = WREN=06h + WRSR= 01h 000000h)\n\r") ;
+    printf("  enso                  (Enter Secure OTP Area, B1h)\n\r") ;
+    printf("  exso                  (Exit Secure OTP Area,  C1h)\n\r") ;
+    printf("  wrsr  data_3B         (Write SR 01h +3B data,ex: wrsr 000002h, set wren 1st)\n\r") ;
+    printf("  se    address         (4KB Sector Erase,     ex: be 0x00    <- note: sets WEL)\n\r") ;
+    printf("  be    address         (64KB Block Erase,     ex: be 0x00    <- note: sets WEL)\n\r") ;
+    printf("  32Kbe address         (32KB Block Erase,     ex: 32kbe 0x00 <- note: sets WEL)\n\r") ;
+    printf("  ce                    (Chip Erase = C7h,     ex: ce         <- note: sets WEL)\n\r") ;
+    printf("  pp    address         (256B Page Program,    ex: pp 0x00    <- note: sets WEL)\n\r") ;
+    printf("  read  address         (read 1 byte of data,  ex: read 0x0000)\n\r") ;
+    printf("  rd1   startadr endadr (read range of data,   ex: rd1  0x00 0x10)\n\r") ;
+    printf("  fread startadr endadr (read range of data,   ex: sfdp 0x00 0x10)\n\r") ;
+    printf("  sfdp  startadr endadr (read range of SFDP,   ex: sfdp 0x00 0x10)\n\r") ;
+    printf("==================================================================================\n\r") ;
+    printf("\n\r") ;
+}
 
 int main() {
     char cmd[32] ;
-    //int tmp = 0 ;
     int i ;
     int numData = 256 ;
     unsigned long address = 0 ;
+    unsigned long rd_start_address = 0 ;
+    unsigned long rd_end_address = 0 ;
     unsigned char data[256] ;
     
    extern serial_t stdio_uart ;
@@ -83,61 +169,69 @@
     printf("\n\r") ;
     printf("\n\r") ;
     printf("\n\r") ;
-printf("\n\r          ####################################################\n\r") ;
-    printf("          #                                                  #\n\r") ;
-    printf("          #  Macronix MX25Rxx35F Serial NOR Flash Testbench  #\n\r") ;
-    printf("          #                                                  #\n\r") ;
-    printf("          ####################################################\n\r") ;
+printf("\n\r               ####################################################\n\r") ;
+    printf("               #                                                  #\n\r") ;
+    printf("               #  Macronix MX25Rxx35F Serial NOR Flash Testbench  #\n\r") ;
+    printf("               #                                                  #\n\r") ;
+    printf("               ####################################################\n\r") ;
     printf("\n\r") ;
-    usage() ;
+    printf("\n\r") ;
+    commandMenu() ;
     
 myled3 = 1;
 myled1 = 1;
 led_green = 0;
+led_red = 1;
     
 while(1){
+        printf("Enter command from list, or type menu.\n\r") ;
         printf("> ") ;
         scanf("%s", cmd) ;
-        if (strcmp(cmd, "read") == 0) {
+        
+        if (strcmp(cmd, "read") == 0) {         // Read Byte
             scanf("%X", &address) ;
             data[0] = spi_mem.read8(address) ;
             printf("%01X : 0x%02X\n\r", address, data[0]) ;
+              
+        } else if (strcmp(cmd, "rd1") == 0) {   // Read Range
+            scanf("%X", &rd_start_address) ;
+            scanf("%X", &rd_end_address) ;
+            rdRange(rd_start_address, rd_end_address) ;
             
-        } else if (strcmp(cmd, "rd4") == 0) {
-            scanf("%X", &address) ;
-              printf("                               4B data = 0x%08X\n\r", spi_mem.rd32(address)) ;
-            
-        } else if (strcmp(cmd, "rdsr") == 0) { // Read Status Register
+        } else if (strcmp(cmd, "rdsr") == 0) {  // Read Status Register
             data[0] = spi_mem.readStatus() ;
             printf("                               status register = 0x%02X\n\r", data[0]) ;            
             printf("RDSR = 05h done\n\r") ;
-              led_green = 1;
               
         } else if (strcmp(cmd, "reset") == 0) { // ResetEnable + Software Reset 
             spi_mem.resetEnable() ;
             spi_mem.reset() ;       
             printf("Software ResestEnable 66h + Reset 99h completed\n\r") ;
-              led_green = 1;
               
         } else if (strcmp(cmd, "rdcr") == 0) { // Read Configuration Register
             printf("                               configuration register = 0x%04X\n\r", spi_mem.readConfig()) ;           
             printf("RDCR = 15h done\n\r") ;
-              led_green = 1;
               
         } else if (strcmp(cmd, "rdid") == 0) { // Read ID
             printf("                               ID = 0x%06X\n\r", spi_mem.readID()) ;
             printf("RDID = 9Fh done\n\r") ;
-              led_green = 1;
               
         } else if (strcmp(cmd, "wren") == 0) { // Write Enable
             spi_mem.writeEnable() ;
             printf("                               WREN = 06h set\n\r") ;
-              led_green = 1;
               
         } else if (strcmp(cmd, "wrdi") == 0) { // Write Disable
             spi_mem.writeDisable() ;
             printf("                               done\n\r") ;
             
+        } else if (strcmp(cmd, "enso") == 0) { // Enter Secure OTP Area
+            spi_mem.enterSecureOTP() ;
+            printf("                               Entered Secure OTP Area\n\r") ;
+          
+        } else if (strcmp(cmd, "exso") == 0) { // Exit Secure OTP Area
+            spi_mem.exitSecureOTP() ;
+            printf("                               Entered Secure OTP Area\n\r") ;  
+            
         } else if (strcmp(cmd, "pp") == 0)   { // Page Program
             scanf("%X", &address) ;
             printf("writing %d bytes to 0x%X\n\r",numData, address) ;
@@ -154,9 +248,8 @@
             }
             printf("\n\r") ;
             printf("                               PP = 02h done\n\r") ;
-              led_green = 1;
            
-                    } else if (strcmp(cmd, "ce") == 0) {    // Chip Erase
+        } else if (strcmp(cmd, "ce") == 0) {    // Chip Erase
             spi_mem.writeEnable() ; // send WREN 1st
             spi_mem.chipErase() ;
             data[0] = 0x01 ;           // poll if WIP bit SR<0>=1
@@ -167,9 +260,8 @@
                 wait(5) ;
                  }                  // end poll
             printf("CE = C7h done\n\r") ;
-              led_green = 0;
               
-                   } else if (strcmp(cmd, "se") == 0) {    // Sector Erase
+        } else if (strcmp(cmd, "se") == 0) {    // Sector Erase
             scanf("%X", &address) ;
              printf("Eraseing address 0x%X\n\r", address) ;
             spi_mem.writeEnable() ; // send WREN 1st
@@ -181,23 +273,21 @@
                 wait(0.1) ;
                  }                  // end poll
             printf("SE = 20h done\n\r") ;
-              led_green = 0;
                
         } else if (strcmp(cmd, "be") == 0) {    // 64KB Block Erase
             scanf("%X", &address) ;
              printf("Eraseing address 0x%X\n\r", address) ;
             spi_mem.writeEnable() ; // send WREN 1st
             spi_mem.blockErase(address) ;
-           data[0] = 0x01 ;           // poll if WIP bit SR<0>=1
+            data[0] = 0x01 ;           // poll if WIP bit SR<0>=1
             while((data[0] & 0x01) != 0 ) {
                 printf(".") ;
                 data[0] = spi_mem.readStatus() ;
                 wait(0.1) ;
                  }                  // end poll
             printf("BE = D8h done\n\r") ;
-              led_green = 0;
               
-                      } else if (strcmp(cmd, "32kbe") == 0) {    // 32KB Block Erase
+        } else if (strcmp(cmd, "32kbe") == 0) {    // 32KB Block Erase
             scanf("%X", &address) ;
              printf("Eraseing address 0x%X\n\r", address) ;
             spi_mem.writeEnable() ; // send WREN 1st
@@ -209,28 +299,44 @@
                 wait(0.1) ;
                  }                  // end poll
             printf("32KBE = 52h done\n\r") ;
-              led_green = 0;
+              
+          } else if (strcmp(cmd, "wrsr") == 0) {    // Write to Status and Configuration Reg 1 and 2
+            scanf("%X", &address) ;
+            spi_mem.writeStatusreg(address) ; // Write SR cmd 01h +SRdata 00h +CR1data 00h +CR2data 02h, (CR2<1> = 1 to Enter HP Mode)
+             wait(0.5) ;
+            printf("                               You wrote 0x%X to Staus and Config Register 1 and 2 \n\r", address) ;
               
         } else if (strcmp(cmd, "hp") == 0) {    // Enter High Performance Mode
             spi_mem.writeEnable() ; // send WREN 1st
-            spi_mem.hpmode() ;
-            printf("                               You are now in High Performance mode\n\r") ;
-              led_green = 0;
+            spi_mem.writeStatusreg(0x000002) ; // Write SR cmd 01h +SRdata 00h +CR1data 00h +CR2data 02h, (CR2<1> = 1 to Ernter HP Mode)
+            printf("                               You are now in High Performance mode (Red LED on)\n\r") ;
+                led_red = 0;
+                led_green = 1;
               
         } else if (strcmp(cmd, "lp") == 0) {    // Enter Low Power Mode
             spi_mem.writeEnable() ; // send WREN 1st
-            spi_mem.lpmode() ;
-            printf("                               You are now in Low Power mode\n\r") ;
-              led_green = 0;
-              
-        } else if (strcmp(cmd, "rd256") == 0) {
-            scanf("%X", &address) ;
-            rd256(address) ;
+            spi_mem.writeStatusreg(0x000000) ; // Write SR cmd 01h +SRdata 00h +CR1data 00h +CR2data 00h, (CR2<1> = 0 to Ernter LP Mode)
+            printf("                               You are now in Low Power mode (Green LED on)\n\r") ;
+                led_green = 0;
+                led_red = 1;
+            
+        } else if (strcmp(cmd, "fread") == 0) {  // Read SFDP Range
+            scanf("%X", &rd_start_address) ;
+            scanf("%X", &rd_end_address) ;
+            rdFREADRange(rd_start_address, rd_end_address) ;     
+            
+        } else if (strcmp(cmd, "sfdp") == 0) {  // Read SFDP Range
+            scanf("%X", &rd_start_address) ;
+            scanf("%X", &rd_end_address) ;
+            rdSFDPRange(rd_start_address, rd_end_address) ;
+            
         } else if (strcmp(cmd, "help") == 0) {
-            usage() ;
+            commandMenu() ;
+        } else if (strcmp(cmd, "menu") == 0) {
+            commandMenu() ; 
         } else {
             printf("Command NOT Recognized [ %s ]\n\r", cmd) ;
-            usage() ;
+            commandMenu() ;
         }
     }
 }
\ No newline at end of file