MX25R6435F Library Example
Fork of MX25Rxx35F_Serial_NOR_Flash_Testbench by
main.cpp@0:b2771f496313, 2015-07-08 (annotated)
- Committer:
- alec1
- Date:
- Wed Jul 08 20:59:56 2015 +0000
- Revision:
- 0:b2771f496313
- Child:
- 1:550759f64702
Rev0
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" |
alec1 | 0:b2771f496313 | 4 | DigitalOut myled3(LED3); //Red |
alec1 | 0:b2771f496313 | 5 | DigitalOut myled1(LED1); //Blue |
alec1 | 0:b2771f496313 | 6 | DigitalOut led_green(LED_GREEN); |
alec1 | 0:b2771f496313 | 7 | |
alec1 | 0:b2771f496313 | 8 | // SPI_MX25R(PinName mosi, PinName miso, PinName sclk, PinName cs) ; |
alec1 | 0:b2771f496313 | 9 | // FRDM-K64F |
alec1 | 0:b2771f496313 | 10 | // D13 SPI0_SCK (PTD1) J2<12> |
alec1 | 0:b2771f496313 | 11 | // D12 SPI0_MISO (PTD3) J2<10> |
alec1 | 0:b2771f496313 | 12 | // D11 SPI0_MOSI (PTD2) J2<8> |
alec1 | 0:b2771f496313 | 13 | // D10 SPI0_PCS0 (PTD0) J2<6> |
alec1 | 0:b2771f496313 | 14 | // Vdd =3.3V = J3<4> |
alec1 | 0:b2771f496313 | 15 | // Gnd =0.0V = J2<14> |
alec1 | 0:b2771f496313 | 16 | SPI_MX25R spi_mem(PTD2, PTD3, PTD1, PTD0) ; |
alec1 | 0:b2771f496313 | 17 | |
alec1 | 0:b2771f496313 | 18 | void usage(void) |
alec1 | 0:b2771f496313 | 19 | { |
alec1 | 0:b2771f496313 | 20 | printf("==== List of Commands =============================================================\n\r") ; |
alec1 | 0:b2771f496313 | 21 | printf("\n\r") ; |
alec1 | 0:b2771f496313 | 22 | printf("rdid (Read Manu and Dev ID, 9Fh)\n\r") ; |
alec1 | 0:b2771f496313 | 23 | printf("wren (Write Enable, set WEL=1, 06h)\n\r") ; |
alec1 | 0:b2771f496313 | 24 | printf("wrdi (Write Disable, set WEL=0, 04h)\n\r") ; |
alec1 | 0:b2771f496313 | 25 | printf("rdsr (Read Status Register, 05h + 00h)\n\r") ; |
alec1 | 0:b2771f496313 | 26 | printf("reset (ResetEnable + SoftwareReset = 66h + 99h)\n\r") ; |
alec1 | 0:b2771f496313 | 27 | printf("hp (Enter HP mode = WREN=06h + WRSR= 01h 00 00 02h )\n\r") ; |
alec1 | 0:b2771f496313 | 28 | printf("lp (Enter LP mode = WREN=06h + WRSR= 01h 00 00 00h )\n\r") ; |
alec1 | 0:b2771f496313 | 29 | printf("rdcr (Read Config Register, 15h + 00 00h)\n\r") ; |
alec1 | 0:b2771f496313 | 30 | printf("read address (read 1 byte of data, ex: read 0x0000)\n\r") ; |
alec1 | 0:b2771f496313 | 31 | printf("rd4 address (read 4 bytes of data, ex: read 0x0000)\n\r") ; |
alec1 | 0:b2771f496313 | 32 | printf("rd256 address (read 256 bytes of data, ex: read 0x0000)\n\r") ; |
alec1 | 0:b2771f496313 | 33 | printf("pp address (256B Page Program, ex: pp 0x00 <- note: routine sets WEL)\n\r") ; |
alec1 | 0:b2771f496313 | 34 | printf("se address (4KB Sector Erase, ex: be 0x00 <- note: routine sets WEL)\n\r") ; |
alec1 | 0:b2771f496313 | 35 | printf("be address (64KB Block Erase, ex: be 0x00 <- note: routine sets WEL)\n\r") ; |
alec1 | 0:b2771f496313 | 36 | printf("32Kbe address (32KB Block Erase, ex: 32kbe 0x00 <- note: routine sets WEL)\n\r") ; |
alec1 | 0:b2771f496313 | 37 | printf("ce (Chip Erase = C7h, ex: ce <- note: routine sets WEL)\n\r") ; |
alec1 | 0:b2771f496313 | 38 | printf("\n\r") ; |
alec1 | 0:b2771f496313 | 39 | printf("===================================================================================\n\r") ; |
alec1 | 0:b2771f496313 | 40 | } |
alec1 | 0:b2771f496313 | 41 | |
alec1 | 0:b2771f496313 | 42 | void rd256(unsigned long address) |
alec1 | 0:b2771f496313 | 43 | { |
alec1 | 0:b2771f496313 | 44 | unsigned int i, j ; |
alec1 | 0:b2771f496313 | 45 | unsigned char data[0x10] ; |
alec1 | 0:b2771f496313 | 46 | |
alec1 | 0:b2771f496313 | 47 | printf(" : ") ; |
alec1 | 0:b2771f496313 | 48 | for (i = 0 ; i < 0x10 ; i++ ) { |
alec1 | 0:b2771f496313 | 49 | printf("+%X ",i) ; |
alec1 | 0:b2771f496313 | 50 | } |
alec1 | 0:b2771f496313 | 51 | printf("\n\r") ; |
alec1 | 0:b2771f496313 | 52 | for (j = 0 ; j < 0x10 ; j++ ) { |
alec1 | 0:b2771f496313 | 53 | printf("%06X : ", address + (0x10 * j)) ; |
alec1 | 0:b2771f496313 | 54 | for (i = 0 ; i < 0x10 ; i++ ) { |
alec1 | 0:b2771f496313 | 55 | data[i] = spi_mem.read8(address + 0x10 * j + i) ; |
alec1 | 0:b2771f496313 | 56 | printf("%02X ", data[i]) ; |
alec1 | 0:b2771f496313 | 57 | } |
alec1 | 0:b2771f496313 | 58 | printf(": ") ; |
alec1 | 0:b2771f496313 | 59 | for (i = 0 ; i < 0x10 ; i++ ) { |
alec1 | 0:b2771f496313 | 60 | if (isprint(data[i])) { |
alec1 | 0:b2771f496313 | 61 | printf("%c", data[i]) ; |
alec1 | 0:b2771f496313 | 62 | } else { |
alec1 | 0:b2771f496313 | 63 | printf(".") ; |
alec1 | 0:b2771f496313 | 64 | } |
alec1 | 0:b2771f496313 | 65 | } |
alec1 | 0:b2771f496313 | 66 | printf(" :\n\r") ; |
alec1 | 0:b2771f496313 | 67 | } |
alec1 | 0:b2771f496313 | 68 | printf("\n\r") ; |
alec1 | 0:b2771f496313 | 69 | } |
alec1 | 0:b2771f496313 | 70 | |
alec1 | 0:b2771f496313 | 71 | int main() { |
alec1 | 0:b2771f496313 | 72 | char cmd[32] ; |
alec1 | 0:b2771f496313 | 73 | //int tmp = 0 ; |
alec1 | 0:b2771f496313 | 74 | int i ; |
alec1 | 0:b2771f496313 | 75 | int numData = 256 ; |
alec1 | 0:b2771f496313 | 76 | unsigned long address = 0 ; |
alec1 | 0:b2771f496313 | 77 | unsigned char data[256] ; |
alec1 | 0:b2771f496313 | 78 | |
alec1 | 0:b2771f496313 | 79 | extern serial_t stdio_uart ; |
alec1 | 0:b2771f496313 | 80 | serial_baud(&stdio_uart, 9600) ; |
alec1 | 0:b2771f496313 | 81 | |
alec1 | 0:b2771f496313 | 82 | printf("\n\r") ; |
alec1 | 0:b2771f496313 | 83 | printf("\n\r") ; |
alec1 | 0:b2771f496313 | 84 | printf("\n\r") ; |
alec1 | 0:b2771f496313 | 85 | printf("\n\r") ; |
alec1 | 0:b2771f496313 | 86 | printf("\n\r ####################################################\n\r") ; |
alec1 | 0:b2771f496313 | 87 | printf(" # #\n\r") ; |
alec1 | 0:b2771f496313 | 88 | printf(" # Macronix MX25Rxx35F Serial NOR Flash Testbench #\n\r") ; |
alec1 | 0:b2771f496313 | 89 | printf(" # #\n\r") ; |
alec1 | 0:b2771f496313 | 90 | printf(" ####################################################\n\r") ; |
alec1 | 0:b2771f496313 | 91 | printf("\n\r") ; |
alec1 | 0:b2771f496313 | 92 | usage() ; |
alec1 | 0:b2771f496313 | 93 | |
alec1 | 0:b2771f496313 | 94 | myled3 = 1; |
alec1 | 0:b2771f496313 | 95 | myled1 = 1; |
alec1 | 0:b2771f496313 | 96 | led_green = 0; |
alec1 | 0:b2771f496313 | 97 | |
alec1 | 0:b2771f496313 | 98 | while(1){ |
alec1 | 0:b2771f496313 | 99 | printf("> ") ; |
alec1 | 0:b2771f496313 | 100 | scanf("%s", cmd) ; |
alec1 | 0:b2771f496313 | 101 | if (strcmp(cmd, "read") == 0) { |
alec1 | 0:b2771f496313 | 102 | scanf("%X", &address) ; |
alec1 | 0:b2771f496313 | 103 | data[0] = spi_mem.read8(address) ; |
alec1 | 0:b2771f496313 | 104 | printf("%01X : 0x%02X\n\r", address, data[0]) ; |
alec1 | 0:b2771f496313 | 105 | |
alec1 | 0:b2771f496313 | 106 | } else if (strcmp(cmd, "rd4") == 0) { |
alec1 | 0:b2771f496313 | 107 | scanf("%X", &address) ; |
alec1 | 0:b2771f496313 | 108 | printf(" 4B data = 0x%08X\n\r", spi_mem.rd32(address)) ; |
alec1 | 0:b2771f496313 | 109 | |
alec1 | 0:b2771f496313 | 110 | } else if (strcmp(cmd, "rdsr") == 0) { // Read Status Register |
alec1 | 0:b2771f496313 | 111 | data[0] = spi_mem.readStatus() ; |
alec1 | 0:b2771f496313 | 112 | printf(" status register = 0x%02X\n\r", data[0]) ; |
alec1 | 0:b2771f496313 | 113 | printf("RDSR = 05h done\n\r") ; |
alec1 | 0:b2771f496313 | 114 | led_green = 1; |
alec1 | 0:b2771f496313 | 115 | |
alec1 | 0:b2771f496313 | 116 | } else if (strcmp(cmd, "reset") == 0) { // ResetEnable + Software Reset |
alec1 | 0:b2771f496313 | 117 | spi_mem.resetEnable() ; |
alec1 | 0:b2771f496313 | 118 | spi_mem.reset() ; |
alec1 | 0:b2771f496313 | 119 | printf("Software ResestEnable 66h + Reset 99h completed\n\r") ; |
alec1 | 0:b2771f496313 | 120 | led_green = 1; |
alec1 | 0:b2771f496313 | 121 | |
alec1 | 0:b2771f496313 | 122 | } else if (strcmp(cmd, "rdcr") == 0) { // Read Configuration Register |
alec1 | 0:b2771f496313 | 123 | printf(" configuration register = 0x%04X\n\r", spi_mem.readConfig()) ; |
alec1 | 0:b2771f496313 | 124 | printf("RDCR = 15h done\n\r") ; |
alec1 | 0:b2771f496313 | 125 | led_green = 1; |
alec1 | 0:b2771f496313 | 126 | |
alec1 | 0:b2771f496313 | 127 | } else if (strcmp(cmd, "rdid") == 0) { // Read ID |
alec1 | 0:b2771f496313 | 128 | printf(" ID = 0x%06X\n\r", spi_mem.readID()) ; |
alec1 | 0:b2771f496313 | 129 | printf("RDID = 9Fh done\n\r") ; |
alec1 | 0:b2771f496313 | 130 | led_green = 1; |
alec1 | 0:b2771f496313 | 131 | |
alec1 | 0:b2771f496313 | 132 | } else if (strcmp(cmd, "wren") == 0) { // Write Enable |
alec1 | 0:b2771f496313 | 133 | spi_mem.writeEnable() ; |
alec1 | 0:b2771f496313 | 134 | printf(" WREN = 06h set\n\r") ; |
alec1 | 0:b2771f496313 | 135 | led_green = 1; |
alec1 | 0:b2771f496313 | 136 | |
alec1 | 0:b2771f496313 | 137 | } else if (strcmp(cmd, "wrdi") == 0) { // Write Disable |
alec1 | 0:b2771f496313 | 138 | spi_mem.writeDisable() ; |
alec1 | 0:b2771f496313 | 139 | printf(" done\n\r") ; |
alec1 | 0:b2771f496313 | 140 | |
alec1 | 0:b2771f496313 | 141 | } else if (strcmp(cmd, "pp") == 0) { // Page Program |
alec1 | 0:b2771f496313 | 142 | scanf("%X", &address) ; |
alec1 | 0:b2771f496313 | 143 | printf("writing %d bytes to 0x%X\n\r",numData, address) ; |
alec1 | 0:b2771f496313 | 144 | spi_mem.writeEnable() ; // send WREN 1st |
alec1 | 0:b2771f496313 | 145 | for (i = 0 ; i < numData ; i++ ) { |
alec1 | 0:b2771f496313 | 146 | data[i] = i & 0xFF ; |
alec1 | 0:b2771f496313 | 147 | } |
alec1 | 0:b2771f496313 | 148 | spi_mem.programPage(address, data, numData) ; |
alec1 | 0:b2771f496313 | 149 | data[0] = 0 ; |
alec1 | 0:b2771f496313 | 150 | while((data[0] & 0x01) != 0x01 ) { |
alec1 | 0:b2771f496313 | 151 | printf(".") ; |
alec1 | 0:b2771f496313 | 152 | data[0] = spi_mem.readStatus() ; |
alec1 | 0:b2771f496313 | 153 | wait(0.01) ; |
alec1 | 0:b2771f496313 | 154 | } |
alec1 | 0:b2771f496313 | 155 | printf("\n\r") ; |
alec1 | 0:b2771f496313 | 156 | printf(" PP = 02h done\n\r") ; |
alec1 | 0:b2771f496313 | 157 | led_green = 1; |
alec1 | 0:b2771f496313 | 158 | |
alec1 | 0:b2771f496313 | 159 | } else if (strcmp(cmd, "ce") == 0) { // Chip Erase |
alec1 | 0:b2771f496313 | 160 | spi_mem.writeEnable() ; // send WREN 1st |
alec1 | 0:b2771f496313 | 161 | spi_mem.chipErase() ; |
alec1 | 0:b2771f496313 | 162 | data[0] = 0x01 ; // poll if WIP bit SR<0>=1 |
alec1 | 0:b2771f496313 | 163 | while((data[0] & 0x01) != 0 ) { |
alec1 | 0:b2771f496313 | 164 | printf("wait, chip erase in progress") ; |
alec1 | 0:b2771f496313 | 165 | data[0] = spi_mem.readStatus() ; |
alec1 | 0:b2771f496313 | 166 | printf(" --> status register = 0x%02X\n\r", data[0]) ; |
alec1 | 0:b2771f496313 | 167 | wait(5) ; |
alec1 | 0:b2771f496313 | 168 | } // end poll |
alec1 | 0:b2771f496313 | 169 | printf("CE = C7h done\n\r") ; |
alec1 | 0:b2771f496313 | 170 | led_green = 0; |
alec1 | 0:b2771f496313 | 171 | |
alec1 | 0:b2771f496313 | 172 | } else if (strcmp(cmd, "se") == 0) { // Sector Erase |
alec1 | 0:b2771f496313 | 173 | scanf("%X", &address) ; |
alec1 | 0:b2771f496313 | 174 | printf("Eraseing address 0x%X\n\r", address) ; |
alec1 | 0:b2771f496313 | 175 | spi_mem.writeEnable() ; // send WREN 1st |
alec1 | 0:b2771f496313 | 176 | spi_mem.sectorErase(address) ; |
alec1 | 0:b2771f496313 | 177 | data[0] = 0x01 ; // poll if WIP bit SR<0>=1 |
alec1 | 0:b2771f496313 | 178 | while((data[0] & 0x01) != 0 ) { |
alec1 | 0:b2771f496313 | 179 | printf(".") ; |
alec1 | 0:b2771f496313 | 180 | data[0] = spi_mem.readStatus() ; |
alec1 | 0:b2771f496313 | 181 | wait(0.1) ; |
alec1 | 0:b2771f496313 | 182 | } // end poll |
alec1 | 0:b2771f496313 | 183 | printf("SE = 20h done\n\r") ; |
alec1 | 0:b2771f496313 | 184 | led_green = 0; |
alec1 | 0:b2771f496313 | 185 | |
alec1 | 0:b2771f496313 | 186 | } else if (strcmp(cmd, "be") == 0) { // 64KB Block Erase |
alec1 | 0:b2771f496313 | 187 | scanf("%X", &address) ; |
alec1 | 0:b2771f496313 | 188 | printf("Eraseing address 0x%X\n\r", address) ; |
alec1 | 0:b2771f496313 | 189 | spi_mem.writeEnable() ; // send WREN 1st |
alec1 | 0:b2771f496313 | 190 | spi_mem.blockErase(address) ; |
alec1 | 0:b2771f496313 | 191 | data[0] = 0x01 ; // poll if WIP bit SR<0>=1 |
alec1 | 0:b2771f496313 | 192 | while((data[0] & 0x01) != 0 ) { |
alec1 | 0:b2771f496313 | 193 | printf(".") ; |
alec1 | 0:b2771f496313 | 194 | data[0] = spi_mem.readStatus() ; |
alec1 | 0:b2771f496313 | 195 | wait(0.1) ; |
alec1 | 0:b2771f496313 | 196 | } // end poll |
alec1 | 0:b2771f496313 | 197 | printf("BE = D8h done\n\r") ; |
alec1 | 0:b2771f496313 | 198 | led_green = 0; |
alec1 | 0:b2771f496313 | 199 | |
alec1 | 0:b2771f496313 | 200 | } else if (strcmp(cmd, "32kbe") == 0) { // 32KB Block Erase |
alec1 | 0:b2771f496313 | 201 | scanf("%X", &address) ; |
alec1 | 0:b2771f496313 | 202 | printf("Eraseing address 0x%X\n\r", address) ; |
alec1 | 0:b2771f496313 | 203 | spi_mem.writeEnable() ; // send WREN 1st |
alec1 | 0:b2771f496313 | 204 | spi_mem.blockErase(address) ; |
alec1 | 0:b2771f496313 | 205 | data[0] = 0x01 ; // poll if WIP bit SR<0>=1 |
alec1 | 0:b2771f496313 | 206 | while((data[0] & 0x01) != 0 ) { |
alec1 | 0:b2771f496313 | 207 | printf(".") ; |
alec1 | 0:b2771f496313 | 208 | data[0] = spi_mem.readStatus() ; |
alec1 | 0:b2771f496313 | 209 | wait(0.1) ; |
alec1 | 0:b2771f496313 | 210 | } // end poll |
alec1 | 0:b2771f496313 | 211 | printf("32KBE = 52h done\n\r") ; |
alec1 | 0:b2771f496313 | 212 | led_green = 0; |
alec1 | 0:b2771f496313 | 213 | |
alec1 | 0:b2771f496313 | 214 | } else if (strcmp(cmd, "hp") == 0) { // Enter High Performance Mode |
alec1 | 0:b2771f496313 | 215 | spi_mem.writeEnable() ; // send WREN 1st |
alec1 | 0:b2771f496313 | 216 | spi_mem.hpmode() ; |
alec1 | 0:b2771f496313 | 217 | printf(" You are now in High Performance mode\n\r") ; |
alec1 | 0:b2771f496313 | 218 | led_green = 0; |
alec1 | 0:b2771f496313 | 219 | |
alec1 | 0:b2771f496313 | 220 | } else if (strcmp(cmd, "lp") == 0) { // Enter Low Power Mode |
alec1 | 0:b2771f496313 | 221 | spi_mem.writeEnable() ; // send WREN 1st |
alec1 | 0:b2771f496313 | 222 | spi_mem.lpmode() ; |
alec1 | 0:b2771f496313 | 223 | printf(" You are now in Low Power mode\n\r") ; |
alec1 | 0:b2771f496313 | 224 | led_green = 0; |
alec1 | 0:b2771f496313 | 225 | |
alec1 | 0:b2771f496313 | 226 | } else if (strcmp(cmd, "rd256") == 0) { |
alec1 | 0:b2771f496313 | 227 | scanf("%X", &address) ; |
alec1 | 0:b2771f496313 | 228 | rd256(address) ; |
alec1 | 0:b2771f496313 | 229 | } else if (strcmp(cmd, "help") == 0) { |
alec1 | 0:b2771f496313 | 230 | usage() ; |
alec1 | 0:b2771f496313 | 231 | } else { |
alec1 | 0:b2771f496313 | 232 | printf("Command NOT Recognized [ %s ]\n\r", cmd) ; |
alec1 | 0:b2771f496313 | 233 | usage() ; |
alec1 | 0:b2771f496313 | 234 | } |
alec1 | 0:b2771f496313 | 235 | } |
alec1 | 0:b2771f496313 | 236 | } |