Program test for Coragem
Dependencies: SX1272 SPI_MX25R
memory.txt@4:05d5aa4d3f2d, 2019-11-13 (annotated)
- Committer:
- marcoantonioara
- Date:
- Wed Nov 13 16:42:06 2019 +0000
- Revision:
- 4:05d5aa4d3f2d
Test version firmware Coragem using all sensors
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
marcoantonioara | 4:05d5aa4d3f2d | 1 | #include <ctype.h> |
marcoantonioara | 4:05d5aa4d3f2d | 2 | #include "SPI_MX25R.h" |
marcoantonioara | 4:05d5aa4d3f2d | 3 | |
marcoantonioara | 4:05d5aa4d3f2d | 4 | |
marcoantonioara | 4:05d5aa4d3f2d | 5 | |
marcoantonioara | 4:05d5aa4d3f2d | 6 | // SPI_MX25R(PinName mosi, PinName miso, PinName sclk, PinName cs) ; |
marcoantonioara | 4:05d5aa4d3f2d | 7 | SPI_MX25R spi_mem(P0_17, P0_20, P0_22, P0_24) ; |
marcoantonioara | 4:05d5aa4d3f2d | 8 | |
marcoantonioara | 4:05d5aa4d3f2d | 9 | |
marcoantonioara | 4:05d5aa4d3f2d | 10 | void rdRange(unsigned long rd_start_address, unsigned long rd_end_address) |
marcoantonioara | 4:05d5aa4d3f2d | 11 | { |
marcoantonioara | 4:05d5aa4d3f2d | 12 | unsigned int i, j ; |
marcoantonioara | 4:05d5aa4d3f2d | 13 | unsigned char data[0x10] ; |
marcoantonioara | 4:05d5aa4d3f2d | 14 | unsigned long current_address = rd_start_address ; |
marcoantonioara | 4:05d5aa4d3f2d | 15 | printf("\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 16 | printf("rd_start_address = 0x%08X\n\r", rd_start_address) ; |
marcoantonioara | 4:05d5aa4d3f2d | 17 | printf("rd_end_address = 0x%08X\n\r", rd_end_address) ; |
marcoantonioara | 4:05d5aa4d3f2d | 18 | printf("\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 19 | printf(" ") ; // print header +0 to +F |
marcoantonioara | 4:05d5aa4d3f2d | 20 | for (i = 0 ; i < 0x10 ; i++ ) { |
marcoantonioara | 4:05d5aa4d3f2d | 21 | printf("+%X ",i) ; |
marcoantonioara | 4:05d5aa4d3f2d | 22 | } |
marcoantonioara | 4:05d5aa4d3f2d | 23 | printf("\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 24 | printf(" -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --") ; |
marcoantonioara | 4:05d5aa4d3f2d | 25 | printf("\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 26 | for (i = rd_start_address ; current_address < rd_end_address ; i++ ) { |
marcoantonioara | 4:05d5aa4d3f2d | 27 | printf("%06X : ", current_address ) ; // print start address : |
marcoantonioara | 4:05d5aa4d3f2d | 28 | for (j = 0 ; j <= 15 ; j++ ) { |
marcoantonioara | 4:05d5aa4d3f2d | 29 | data[j] = spi_mem.read8(current_address ) ; |
marcoantonioara | 4:05d5aa4d3f2d | 30 | printf("%02X ", data[j]) ; |
marcoantonioara | 4:05d5aa4d3f2d | 31 | current_address = current_address + 0x01 ; |
marcoantonioara | 4:05d5aa4d3f2d | 32 | } |
marcoantonioara | 4:05d5aa4d3f2d | 33 | printf(": ") ; |
marcoantonioara | 4:05d5aa4d3f2d | 34 | for (i = 0 ; i < 0x10 ; i++ ) { |
marcoantonioara | 4:05d5aa4d3f2d | 35 | if (isprint(data[i])) { |
marcoantonioara | 4:05d5aa4d3f2d | 36 | printf("%c", data[i]) ; |
marcoantonioara | 4:05d5aa4d3f2d | 37 | } else { |
marcoantonioara | 4:05d5aa4d3f2d | 38 | printf(".") ; |
marcoantonioara | 4:05d5aa4d3f2d | 39 | } |
marcoantonioara | 4:05d5aa4d3f2d | 40 | } |
marcoantonioara | 4:05d5aa4d3f2d | 41 | printf(" :\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 42 | } |
marcoantonioara | 4:05d5aa4d3f2d | 43 | printf("\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 44 | } |
marcoantonioara | 4:05d5aa4d3f2d | 45 | |
marcoantonioara | 4:05d5aa4d3f2d | 46 | void rdSFDPRange(unsigned long rd_start_address, unsigned long rd_end_address) |
marcoantonioara | 4:05d5aa4d3f2d | 47 | { |
marcoantonioara | 4:05d5aa4d3f2d | 48 | unsigned int i, j ; |
marcoantonioara | 4:05d5aa4d3f2d | 49 | unsigned char data[0x10] ; |
marcoantonioara | 4:05d5aa4d3f2d | 50 | unsigned long current_address = rd_start_address ; |
marcoantonioara | 4:05d5aa4d3f2d | 51 | printf("\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 52 | printf("rd_start_address = 0x%08X\n\r", rd_start_address) ; |
marcoantonioara | 4:05d5aa4d3f2d | 53 | printf("rd_end_address = 0x%08X\n\r", rd_end_address) ; |
marcoantonioara | 4:05d5aa4d3f2d | 54 | printf("\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 55 | printf(" ") ; // print header +0 to +F |
marcoantonioara | 4:05d5aa4d3f2d | 56 | for (i = 0 ; i < 0x10 ; i++ ) { |
marcoantonioara | 4:05d5aa4d3f2d | 57 | printf("+%X ",i) ; |
marcoantonioara | 4:05d5aa4d3f2d | 58 | } |
marcoantonioara | 4:05d5aa4d3f2d | 59 | printf("\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 60 | printf(" -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --") ; |
marcoantonioara | 4:05d5aa4d3f2d | 61 | printf("\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 62 | for (i = rd_start_address ; current_address < rd_end_address ; i++ ) { |
marcoantonioara | 4:05d5aa4d3f2d | 63 | printf("%06X : ", current_address ) ; // print start address : |
marcoantonioara | 4:05d5aa4d3f2d | 64 | for (j = 0 ; j <= 15 ; j++ ) { |
marcoantonioara | 4:05d5aa4d3f2d | 65 | data[j] = spi_mem.readSFDP(current_address ) ; |
marcoantonioara | 4:05d5aa4d3f2d | 66 | printf("%02X ", data[j]) ; |
marcoantonioara | 4:05d5aa4d3f2d | 67 | current_address = current_address + 0x01 ; |
marcoantonioara | 4:05d5aa4d3f2d | 68 | } |
marcoantonioara | 4:05d5aa4d3f2d | 69 | printf(": ") ; |
marcoantonioara | 4:05d5aa4d3f2d | 70 | for (i = 0 ; i < 0x10 ; i++ ) { |
marcoantonioara | 4:05d5aa4d3f2d | 71 | if (isprint(data[i])) { |
marcoantonioara | 4:05d5aa4d3f2d | 72 | printf("%c", data[i]) ; |
marcoantonioara | 4:05d5aa4d3f2d | 73 | } else { |
marcoantonioara | 4:05d5aa4d3f2d | 74 | printf(".") ; |
marcoantonioara | 4:05d5aa4d3f2d | 75 | } |
marcoantonioara | 4:05d5aa4d3f2d | 76 | } |
marcoantonioara | 4:05d5aa4d3f2d | 77 | printf(" :\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 78 | } |
marcoantonioara | 4:05d5aa4d3f2d | 79 | printf("\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 80 | } |
marcoantonioara | 4:05d5aa4d3f2d | 81 | |
marcoantonioara | 4:05d5aa4d3f2d | 82 | void rdFREADRange(unsigned long rd_start_address, unsigned long rd_end_address) |
marcoantonioara | 4:05d5aa4d3f2d | 83 | { |
marcoantonioara | 4:05d5aa4d3f2d | 84 | unsigned int i, j ; |
marcoantonioara | 4:05d5aa4d3f2d | 85 | unsigned char data[0x10] ; |
marcoantonioara | 4:05d5aa4d3f2d | 86 | unsigned long current_address = rd_start_address ; |
marcoantonioara | 4:05d5aa4d3f2d | 87 | printf("\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 88 | printf("rd_start_address = 0x%08X\n\r", rd_start_address) ; |
marcoantonioara | 4:05d5aa4d3f2d | 89 | printf("rd_end_address = 0x%08X\n\r", rd_end_address) ; |
marcoantonioara | 4:05d5aa4d3f2d | 90 | printf("\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 91 | printf(" ") ; // print header +0 to +F |
marcoantonioara | 4:05d5aa4d3f2d | 92 | for (i = 0 ; i < 0x10 ; i++ ) { |
marcoantonioara | 4:05d5aa4d3f2d | 93 | printf("+%X ",i) ; |
marcoantonioara | 4:05d5aa4d3f2d | 94 | } |
marcoantonioara | 4:05d5aa4d3f2d | 95 | printf("\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 96 | printf(" -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --") ; |
marcoantonioara | 4:05d5aa4d3f2d | 97 | printf("\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 98 | for (i = rd_start_address ; current_address < rd_end_address ; i++ ) { |
marcoantonioara | 4:05d5aa4d3f2d | 99 | printf("%06X : ", current_address ) ; // print start address : |
marcoantonioara | 4:05d5aa4d3f2d | 100 | for (j = 0 ; j <= 15 ; j++ ) { |
marcoantonioara | 4:05d5aa4d3f2d | 101 | data[j] = spi_mem.readFREAD(current_address ) ; |
marcoantonioara | 4:05d5aa4d3f2d | 102 | printf("%02X ", data[j]) ; |
marcoantonioara | 4:05d5aa4d3f2d | 103 | current_address = current_address + 0x01 ; |
marcoantonioara | 4:05d5aa4d3f2d | 104 | } |
marcoantonioara | 4:05d5aa4d3f2d | 105 | printf(": ") ; |
marcoantonioara | 4:05d5aa4d3f2d | 106 | for (i = 0 ; i < 0x10 ; i++ ) { |
marcoantonioara | 4:05d5aa4d3f2d | 107 | if (isprint(data[i])) { |
marcoantonioara | 4:05d5aa4d3f2d | 108 | printf("%c", data[i]) ; |
marcoantonioara | 4:05d5aa4d3f2d | 109 | } else { |
marcoantonioara | 4:05d5aa4d3f2d | 110 | printf(".") ; |
marcoantonioara | 4:05d5aa4d3f2d | 111 | } |
marcoantonioara | 4:05d5aa4d3f2d | 112 | } |
marcoantonioara | 4:05d5aa4d3f2d | 113 | printf(" :\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 114 | } |
marcoantonioara | 4:05d5aa4d3f2d | 115 | printf("\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 116 | } |
marcoantonioara | 4:05d5aa4d3f2d | 117 | |
marcoantonioara | 4:05d5aa4d3f2d | 118 | void commandMenu(void) // TeraTerm Display (Enable Terminal Local Echo On). |
marcoantonioara | 4:05d5aa4d3f2d | 119 | { |
marcoantonioara | 4:05d5aa4d3f2d | 120 | printf("== Commands =========== (Comments) ===============================================\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 121 | printf("\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 122 | printf(" wren (Write Enable, set WEL=1, 06h)\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 123 | printf(" wrdi (Write Disable, set WEL=0, 04h)\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 124 | printf(" rdid (Read Manu & JEDEC Dev ID, 9Fh)\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 125 | printf(" rems (Read Elect. Manu & Dev ID,90h)\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 126 | printf(" res (Read Elect. Signiture, ABh)\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 127 | printf(" rdsr (Read Status Register, 05h)\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 128 | printf(" rdcr (Read Config Register, 15h)\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 129 | printf(" rdscr (Read Security Register, 2Bh)\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 130 | printf(" enso (Enter Secure OTP Area, B1h)\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 131 | printf(" exso (Exit Secure OTP Area, C1h)\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 132 | printf(" reset (ResetEnable + SoftwareReset = 66h + 99h)\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 133 | printf(" hp (Enter HP mode = WREN=06h + WRSR= 01h 000002h)\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 134 | printf(" lp (Enter LP mode = WREN=06h + WRSR= 01h 000000h)\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 135 | printf(" wrsr data_3B (Write SR 01h +3B data,ex: wrsr 000002h, set wren 1st)\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 136 | printf(" wrscr data_1B (Write Security Reg 2Fh +1B data, caution LDSO bit OTP!)\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 137 | printf(" se address (4KB Sector Erase, ex: be 0x00 <- note: sets WEL)\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 138 | printf(" be address (64KB Block Erase, ex: be 0x00 <- note: sets WEL)\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 139 | printf(" 32Kbe address (32KB Block Erase, ex: 32kbe 0x00 <- note: sets WEL)\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 140 | printf(" ce (Chip Erase = C7h, ex: ce <- note: sets WEL)\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 141 | printf(" pp address (256B Page Program, ex: pp 0x00 <- note: sets WEL)\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 142 | printf(" read address (read 1 byte of data, ex: read 0x0000)\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 143 | printf(" rd1 startadr endadr (read range of data, ex: rd1 0x00 0x10)\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 144 | printf(" fread startadr endadr (read range of data, ex: sfdp 0x00 0x10)\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 145 | printf(" sfdp startadr endadr (read range of SFDP, ex: sfdp 0x00 0x10)\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 146 | printf("==================================================================================\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 147 | printf("\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 148 | } |
marcoantonioara | 4:05d5aa4d3f2d | 149 | /* |
marcoantonioara | 4:05d5aa4d3f2d | 150 | void page_program (int address, int numData){ |
marcoantonioara | 4:05d5aa4d3f2d | 151 | |
marcoantonioara | 4:05d5aa4d3f2d | 152 | |
marcoantonioara | 4:05d5aa4d3f2d | 153 | int i ; |
marcoantonioara | 4:05d5aa4d3f2d | 154 | |
marcoantonioara | 4:05d5aa4d3f2d | 155 | //scanf("%X", &address) ; |
marcoantonioara | 4:05d5aa4d3f2d | 156 | printf("writing %d bytes to 0x%X\n\r",numData, address) ; |
marcoantonioara | 4:05d5aa4d3f2d | 157 | spi_mem.writeEnable() ; // send WREN 1st |
marcoantonioara | 4:05d5aa4d3f2d | 158 | for (i = 0 ; i < numData ; i++ ) { |
marcoantonioara | 4:05d5aa4d3f2d | 159 | data[i] = i & 0xFF ; |
marcoantonioara | 4:05d5aa4d3f2d | 160 | } |
marcoantonioara | 4:05d5aa4d3f2d | 161 | spi_mem.programPage(address, data, numData) ; |
marcoantonioara | 4:05d5aa4d3f2d | 162 | data[0] = 0 ; |
marcoantonioara | 4:05d5aa4d3f2d | 163 | while((data[0] & 0x01) != 0x01 ) { |
marcoantonioara | 4:05d5aa4d3f2d | 164 | printf(".") ; |
marcoantonioara | 4:05d5aa4d3f2d | 165 | data[0] = spi_mem.readStatus() ; |
marcoantonioara | 4:05d5aa4d3f2d | 166 | wait(0.01) ; |
marcoantonioara | 4:05d5aa4d3f2d | 167 | } |
marcoantonioara | 4:05d5aa4d3f2d | 168 | printf("\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 169 | printf(" PP = 02h done\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 170 | |
marcoantonioara | 4:05d5aa4d3f2d | 171 | |
marcoantonioara | 4:05d5aa4d3f2d | 172 | }*/ |
marcoantonioara | 4:05d5aa4d3f2d | 173 | |
marcoantonioara | 4:05d5aa4d3f2d | 174 | |
marcoantonioara | 4:05d5aa4d3f2d | 175 | void memory_test() { |
marcoantonioara | 4:05d5aa4d3f2d | 176 | |
marcoantonioara | 4:05d5aa4d3f2d | 177 | |
marcoantonioara | 4:05d5aa4d3f2d | 178 | char cmd[32] ; |
marcoantonioara | 4:05d5aa4d3f2d | 179 | //int i ; |
marcoantonioara | 4:05d5aa4d3f2d | 180 | int numData = 256 ; |
marcoantonioara | 4:05d5aa4d3f2d | 181 | unsigned long address = 0 ; |
marcoantonioara | 4:05d5aa4d3f2d | 182 | unsigned long rd_start_address = 0 ; |
marcoantonioara | 4:05d5aa4d3f2d | 183 | unsigned long rd_end_address = 0 ; |
marcoantonioara | 4:05d5aa4d3f2d | 184 | uint8_t data[256] ; |
marcoantonioara | 4:05d5aa4d3f2d | 185 | |
marcoantonioara | 4:05d5aa4d3f2d | 186 | int i ; |
marcoantonioara | 4:05d5aa4d3f2d | 187 | |
marcoantonioara | 4:05d5aa4d3f2d | 188 | spi_mem.writeEnable() ; // send WREN 1st |
marcoantonioara | 4:05d5aa4d3f2d | 189 | spi_mem.sectorErase(address) ; |
marcoantonioara | 4:05d5aa4d3f2d | 190 | data[0] = 0x01 ; // poll if WIP bit SR<0>=1 |
marcoantonioara | 4:05d5aa4d3f2d | 191 | for (i=0 ; i<25 ; i++){ |
marcoantonioara | 4:05d5aa4d3f2d | 192 | |
marcoantonioara | 4:05d5aa4d3f2d | 193 | while((data[0] & 0x01) != 0 ) { |
marcoantonioara | 4:05d5aa4d3f2d | 194 | printf(".\n") ; |
marcoantonioara | 4:05d5aa4d3f2d | 195 | data[0] = spi_mem.readStatus() ; |
marcoantonioara | 4:05d5aa4d3f2d | 196 | wait(0.1) ; |
marcoantonioara | 4:05d5aa4d3f2d | 197 | } // end poll |
marcoantonioara | 4:05d5aa4d3f2d | 198 | printf("SE = 20h done\n\r") ; |
marcoantonioara | 4:05d5aa4d3f2d | 199 | |
marcoantonioara | 4:05d5aa4d3f2d | 200 | |
marcoantonioara | 4:05d5aa4d3f2d | 201 | |
marcoantonioara | 4:05d5aa4d3f2d | 202 | |
marcoantonioara | 4:05d5aa4d3f2d | 203 | |
marcoantonioara | 4:05d5aa4d3f2d | 204 | |
marcoantonioara | 4:05d5aa4d3f2d | 205 | address =0; |
marcoantonioara | 4:05d5aa4d3f2d | 206 | printf("writing %d bytes to 0x%X\n\r",numData, address) ; |
marcoantonioara | 4:05d5aa4d3f2d | 207 | spi_mem.writeEnable() ; // send WREN 1st |
marcoantonioara | 4:05d5aa4d3f2d | 208 | for (i = 0 ; i < numData ; i++ ) { |
marcoantonioara | 4:05d5aa4d3f2d | 209 | data[i] = i+1 & 0xFF ; |
marcoantonioara | 4:05d5aa4d3f2d | 210 | } |
marcoantonioara | 4:05d5aa4d3f2d | 211 | spi_mem.programPage(address, data, numData) ; |
marcoantonioara | 4:05d5aa4d3f2d | 212 | data[0] = 0 ; |
marcoantonioara | 4:05d5aa4d3f2d | 213 | i=0; |
marcoantonioara | 4:05d5aa4d3f2d | 214 | while((data[0] & 0x01) != 0x01 ) { |
marcoantonioara | 4:05d5aa4d3f2d | 215 | printf(",\n") ; |
marcoantonioara | 4:05d5aa4d3f2d | 216 | data[0] = spi_mem.readStatus() ; |
marcoantonioara | 4:05d5aa4d3f2d | 217 | wait(0.01) ; |
marcoantonioara | 4:05d5aa4d3f2d | 218 | if (i > 3000) break; |
marcoantonioara | 4:05d5aa4d3f2d | 219 | else i++; |
marcoantonioara | 4:05d5aa4d3f2d | 220 | } |
marcoantonioara | 4:05d5aa4d3f2d | 221 | } |