MX25R6435F Library Example
Fork of MX25Rxx35F_Serial_NOR_Flash_Testbench by
main.cpp@3:5dcc71b5ea22, 2018-03-28 (annotated)
- Committer:
- Arkadi
- Date:
- Wed Mar 28 13:17:39 2018 +0000
- Revision:
- 3:5dcc71b5ea22
- Parent:
- 2:32ff86163041
Modifed for STM32L476 , Added page read, nbytes read.
Who changed what in which revision?
User | Revision | Line number | New 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 | } |