Firmware enhancements for HSP_RPC_GUI 3.0.1

Dependencies:   USBDevice

Fork of HSP_RPC_GUI by Maxim Integrated

This command can be used to import the project to your local environment

This command can be used to compile the code and produce the HSP_RPC_GUI_3_0_1.bin

Quote:

mbed compile -t GCC_ARM -m MAX32620HSP

This link may be used to install the mbed command-line-interface (cli) if needed

Committer:
jbradshaw
Date:
Fri Apr 21 12:12:30 2017 -0500
Revision:
1:9490836294ea
Parent:
0:e4a10ed6eb92
Child:
3:8e9b9f5818aa
Flash device is now fully utilized for datalog of sensor data

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jbradshaw 1:9490836294ea 1
jbradshaw 0:e4a10ed6eb92 2 /*******************************************************************************
jbradshaw 0:e4a10ed6eb92 3 * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
jbradshaw 0:e4a10ed6eb92 4 *
jbradshaw 0:e4a10ed6eb92 5 * Permission is hereby granted, free of charge, to any person obtaining a
jbradshaw 0:e4a10ed6eb92 6 * copy of this software and associated documentation files (the "Software"),
jbradshaw 0:e4a10ed6eb92 7 * to deal in the Software without restriction, including without limitation
jbradshaw 0:e4a10ed6eb92 8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
jbradshaw 0:e4a10ed6eb92 9 * and/or sell copies of the Software, and to permit persons to whom the
jbradshaw 0:e4a10ed6eb92 10 * Software is furnished to do so, subject to the following conditions:
jbradshaw 0:e4a10ed6eb92 11 *
jbradshaw 0:e4a10ed6eb92 12 * The above copyright notice and this permission notice shall be included
jbradshaw 0:e4a10ed6eb92 13 * in all copies or substantial portions of the Software.
jbradshaw 0:e4a10ed6eb92 14 *
jbradshaw 0:e4a10ed6eb92 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
jbradshaw 0:e4a10ed6eb92 16 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
jbradshaw 0:e4a10ed6eb92 17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
jbradshaw 0:e4a10ed6eb92 18 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
jbradshaw 0:e4a10ed6eb92 19 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
jbradshaw 0:e4a10ed6eb92 20 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
jbradshaw 0:e4a10ed6eb92 21 * OTHER DEALINGS IN THE SOFTWARE.
jbradshaw 0:e4a10ed6eb92 22 *
jbradshaw 0:e4a10ed6eb92 23 * Except as contained in this notice, the name of Maxim Integrated
jbradshaw 0:e4a10ed6eb92 24 * Products, Inc. shall not be used except as stated in the Maxim Integrated
jbradshaw 0:e4a10ed6eb92 25 * Products, Inc. Branding Policy.
jbradshaw 0:e4a10ed6eb92 26 *
jbradshaw 0:e4a10ed6eb92 27 * The mere transfer of this software does not imply any licenses
jbradshaw 0:e4a10ed6eb92 28 * of trade secrets, proprietary technology, copyrights, patents,
jbradshaw 0:e4a10ed6eb92 29 * trademarks, maskwork rights, or any other form of intellectual
jbradshaw 0:e4a10ed6eb92 30 * property whatsoever. Maxim Integrated Products, Inc. retains all
jbradshaw 0:e4a10ed6eb92 31 * ownership rights.
jbradshaw 0:e4a10ed6eb92 32 *******************************************************************************
jbradshaw 0:e4a10ed6eb92 33 */
jbradshaw 0:e4a10ed6eb92 34
jbradshaw 0:e4a10ed6eb92 35 #include "mbed.h"
jbradshaw 0:e4a10ed6eb92 36 #include "S25FS512.h"
jbradshaw 0:e4a10ed6eb92 37 #include "QuadSpiInterface.h"
jbradshaw 1:9490836294ea 38 //#include "DebugRoutines.h"
jbradshaw 0:e4a10ed6eb92 39
jbradshaw 0:e4a10ed6eb92 40 //******************************************************************************
jbradshaw 0:e4a10ed6eb92 41 S25FS512::S25FS512(QuadSpiInterface *_quadSpiInterface) {
jbradshaw 1:9490836294ea 42 this->quadSpiInterface = _quadSpiInterface;
jbradshaw 0:e4a10ed6eb92 43 }
jbradshaw 0:e4a10ed6eb92 44
jbradshaw 0:e4a10ed6eb92 45 //******************************************************************************
jbradshaw 1:9490836294ea 46 S25FS512::~S25FS512()
jbradshaw 1:9490836294ea 47 {
jbradshaw 0:e4a10ed6eb92 48 }
jbradshaw 0:e4a10ed6eb92 49
jbradshaw 0:e4a10ed6eb92 50 //******************************************************************************
jbradshaw 1:9490836294ea 51 void S25FS512::init(void) {
jbradshaw 0:e4a10ed6eb92 52 setQuadMode();
jbradshaw 0:e4a10ed6eb92 53 }
jbradshaw 0:e4a10ed6eb92 54
jbradshaw 0:e4a10ed6eb92 55 //******************************************************************************
jbradshaw 0:e4a10ed6eb92 56 int S25FS512::wren4Wire(void) {
jbradshaw 0:e4a10ed6eb92 57 uint8_t cmdArray[8];
jbradshaw 0:e4a10ed6eb92 58 // Send WREN
jbradshaw 0:e4a10ed6eb92 59 cmdArray[0] = 0x06;
jbradshaw 1:9490836294ea 60 //wait_ms(1);
jbradshaw 0:e4a10ed6eb92 61 return reg_write_read_multiple_4Wire(cmdArray, 1, flashBuffer, 1);
jbradshaw 0:e4a10ed6eb92 62 }
jbradshaw 0:e4a10ed6eb92 63
jbradshaw 0:e4a10ed6eb92 64 //******************************************************************************
jbradshaw 0:e4a10ed6eb92 65 uint8_t S25FS512::wren(void) {
jbradshaw 0:e4a10ed6eb92 66 uint8_t cmdArray[8];
jbradshaw 0:e4a10ed6eb92 67 // Send WREN
jbradshaw 0:e4a10ed6eb92 68 cmdArray[0] = 0x06;
jbradshaw 1:9490836294ea 69 //wait_ms(1);
jbradshaw 0:e4a10ed6eb92 70 return reg_write_read_multiple_quad(cmdArray, 1, flashBuffer, 0);
jbradshaw 0:e4a10ed6eb92 71 }
jbradshaw 0:e4a10ed6eb92 72
jbradshaw 0:e4a10ed6eb92 73 //******************************************************************************
jbradshaw 1:9490836294ea 74 int8_t S25FS512::reg_write_read_multiple_quad_last(uint8_t *bufferOut, uint8_t numberOut, uint8_t *bufferIn, uint8_t numberIn, uint8_t last) {
jbradshaw 1:9490836294ea 75 int32_t success = 0;
jbradshaw 1:9490836294ea 76 //if (spiSlave.port != 1) {
jbradshaw 1:9490836294ea 77 // while (1);
jbradshaw 1:9490836294ea 78 //}
jbradshaw 1:9490836294ea 79 // success = SPI_Transmit(&spiSlave, dataIn, numberIn, dataOut, numberOut, MXC_E_SPI_UNIT_BYTES, MXC_E_SPI_MODE_QUAD, 0, last);//MXC_E_SPI_MODE_QUAD
jbradshaw 0:e4a10ed6eb92 80
jbradshaw 1:9490836294ea 81 success = quadSpiInterface->SPI_Transmit(
jbradshaw 1:9490836294ea 82 bufferOut, numberOut,
jbradshaw 1:9490836294ea 83 bufferIn, numberIn,
jbradshaw 1:9490836294ea 84 (int)last);
jbradshaw 0:e4a10ed6eb92 85
jbradshaw 1:9490836294ea 86 if (success != 0) return -1;
jbradshaw 1:9490836294ea 87 return 0;
jbradshaw 0:e4a10ed6eb92 88 }
jbradshaw 0:e4a10ed6eb92 89
jbradshaw 0:e4a10ed6eb92 90 //******************************************************************************
jbradshaw 0:e4a10ed6eb92 91 int8_t S25FS512::reg_write_read_multiple_4Wire(uint8_t *bufferOut,
jbradshaw 0:e4a10ed6eb92 92 uint8_t numberOut,
jbradshaw 0:e4a10ed6eb92 93 uint8_t *bufferIn,
jbradshaw 0:e4a10ed6eb92 94 uint8_t numberIn) {
jbradshaw 0:e4a10ed6eb92 95 int32_t success = 0;
jbradshaw 0:e4a10ed6eb92 96 success = quadSpiInterface->SPI_Transmit4Wire(bufferOut, numberOut, bufferIn,
jbradshaw 0:e4a10ed6eb92 97 numberIn, (int)1);
jbradshaw 0:e4a10ed6eb92 98
jbradshaw 0:e4a10ed6eb92 99 if (success != 0) return -1;
jbradshaw 0:e4a10ed6eb92 100 return 0;
jbradshaw 0:e4a10ed6eb92 101 }
jbradshaw 0:e4a10ed6eb92 102
jbradshaw 0:e4a10ed6eb92 103 //******************************************************************************
jbradshaw 1:9490836294ea 104 int8_t S25FS512::reg_write_read_multiple_quad(uint8_t *bufferOut, uint8_t numberOut, uint8_t *bufferIn, uint8_t numberIn) {
jbradshaw 1:9490836294ea 105 int8_t ret;
jbradshaw 1:9490836294ea 106 ret = reg_write_read_multiple_quad_last(bufferOut,numberOut,bufferIn,numberIn,1);
jbradshaw 1:9490836294ea 107 return ret;
jbradshaw 0:e4a10ed6eb92 108 }
jbradshaw 0:e4a10ed6eb92 109
jbradshaw 0:e4a10ed6eb92 110 //******************************************************************************
jbradshaw 0:e4a10ed6eb92 111 void S25FS512::readID(uint8_t *id) {
jbradshaw 1:9490836294ea 112 uint8_t cmd = 0x9F;
jbradshaw 1:9490836294ea 113 reg_write_read_multiple_quad(&cmd, 1, id, 4);
jbradshaw 0:e4a10ed6eb92 114 }
jbradshaw 0:e4a10ed6eb92 115
jbradshaw 0:e4a10ed6eb92 116 //******************************************************************************
jbradshaw 0:e4a10ed6eb92 117 int8_t S25FS512::writeAnyRegister(uint32_t address, uint8_t data) {
jbradshaw 1:9490836294ea 118 uint8_t cmdArray[5];
jbradshaw 1:9490836294ea 119 cmdArray[0] = 0x71;
jbradshaw 1:9490836294ea 120 cmdArray[1] = (address >> 16) & 0xFF;
jbradshaw 1:9490836294ea 121 cmdArray[2] = (address >> 8) & 0xFF;
jbradshaw 1:9490836294ea 122 cmdArray[3] = (address >> 0) & 0xFF;
jbradshaw 1:9490836294ea 123 cmdArray[4] = data;
jbradshaw 1:9490836294ea 124 return reg_write_read_multiple_quad(cmdArray,5,flashBuffer,0);
jbradshaw 0:e4a10ed6eb92 125 }
jbradshaw 0:e4a10ed6eb92 126
jbradshaw 0:e4a10ed6eb92 127 int8_t S25FS512::writeAnyRegister4Wire(uint32_t address, uint8_t data) {
jbradshaw 0:e4a10ed6eb92 128 uint8_t cmdArray[5];
jbradshaw 0:e4a10ed6eb92 129 cmdArray[0] = 0x71;
jbradshaw 0:e4a10ed6eb92 130 cmdArray[1] = (address >> 16) & 0xFF;
jbradshaw 0:e4a10ed6eb92 131 cmdArray[2] = (address >> 8) & 0xFF;
jbradshaw 0:e4a10ed6eb92 132 cmdArray[3] = (address >> 0) & 0xFF;
jbradshaw 0:e4a10ed6eb92 133 cmdArray[4] = data;
jbradshaw 0:e4a10ed6eb92 134 return reg_write_read_multiple_4Wire(cmdArray, 5, flashBuffer, 5);
jbradshaw 0:e4a10ed6eb92 135 }
jbradshaw 1:9490836294ea 136 //******************************************************************************
jbradshaw 1:9490836294ea 137 int8_t S25FS512::writeRegisters(void) {
jbradshaw 1:9490836294ea 138 uint8_t cmdArray[3];
jbradshaw 1:9490836294ea 139 wait_ms(1);
jbradshaw 1:9490836294ea 140 cmdArray[0] = 0x01;
jbradshaw 1:9490836294ea 141 cmdArray[1] = 0x00;
jbradshaw 1:9490836294ea 142 cmdArray[2] = 0x02; // set Quad to 1
jbradshaw 1:9490836294ea 143 reg_write_read_multiple_quad(cmdArray,3,flashBuffer,0);
jbradshaw 1:9490836294ea 144 return 0;
jbradshaw 1:9490836294ea 145 }
jbradshaw 1:9490836294ea 146
jbradshaw 0:e4a10ed6eb92 147
jbradshaw 0:e4a10ed6eb92 148 //******************************************************************************
jbradshaw 1:9490836294ea 149 int8_t S25FS512::readAnyRegister(uint32_t address, uint8_t *data, uint32_t length) {
jbradshaw 1:9490836294ea 150 uint8_t cmdArray[4];
jbradshaw 1:9490836294ea 151 cmdArray[0] = 0x65;
jbradshaw 1:9490836294ea 152 cmdArray[1] = (address >> 16) & 0xFF;
jbradshaw 1:9490836294ea 153 cmdArray[2] = (address >> 8) & 0xFF;
jbradshaw 1:9490836294ea 154 cmdArray[3] = (address >> 0) & 0xFF;
jbradshaw 1:9490836294ea 155 return reg_write_read_multiple_quad(cmdArray,4,data,length);
jbradshaw 0:e4a10ed6eb92 156 }
jbradshaw 0:e4a10ed6eb92 157
jbradshaw 0:e4a10ed6eb92 158 //******************************************************************************
jbradshaw 0:e4a10ed6eb92 159 int8_t S25FS512::bulkErase(void) {
jbradshaw 1:9490836294ea 160 uint8_t cmdArray[1];
jbradshaw 1:9490836294ea 161 cmdArray[0] = 0x60;
jbradshaw 1:9490836294ea 162 return reg_write_read_multiple_quad(cmdArray,1,flashBuffer,0);
jbradshaw 0:e4a10ed6eb92 163 }
jbradshaw 0:e4a10ed6eb92 164
jbradshaw 0:e4a10ed6eb92 165 //******************************************************************************
jbradshaw 0:e4a10ed6eb92 166 int8_t S25FS512::pageProgram(uint32_t address, uint8_t *buffer) {
jbradshaw 1:9490836294ea 167 uint32_t i;
jbradshaw 1:9490836294ea 168 uint8_t cmdArray[6 + 256];
jbradshaw 1:9490836294ea 169 uint8_t *ptr;
jbradshaw 1:9490836294ea 170
jbradshaw 1:9490836294ea 171 //for (i = 0; i < 256; i++) {
jbradshaw 1:9490836294ea 172 // dataArray[i] = i;
jbradshaw 1:9490836294ea 173 //}
jbradshaw 1:9490836294ea 174 cmdArray[0] = 0x12; //0x02; //0x71;
jbradshaw 1:9490836294ea 175 cmdArray[1] = (address >> 24) & 0xFF;
jbradshaw 1:9490836294ea 176 cmdArray[2] = (address >> 16) & 0xFF;
jbradshaw 1:9490836294ea 177 cmdArray[3] = (address >> 8) & 0xFF;
jbradshaw 1:9490836294ea 178 cmdArray[4] = (address >> 0) & 0xFF;
jbradshaw 1:9490836294ea 179 for (i = 0; i < 256; i++) {
jbradshaw 1:9490836294ea 180 cmdArray[5 + i] = buffer[i];
jbradshaw 1:9490836294ea 181 }
jbradshaw 1:9490836294ea 182 // reg_write_read_multiple_quad(cmdArray,256 + 4,flashBuffer,256 + 4);
jbradshaw 0:e4a10ed6eb92 183
jbradshaw 1:9490836294ea 184 ptr = cmdArray;
jbradshaw 1:9490836294ea 185 reg_write_read_multiple_quad_last(ptr,5 + 64,flashBuffer,0,0);
jbradshaw 1:9490836294ea 186 //wait_ms(1);
jbradshaw 1:9490836294ea 187 ptr += (5 + 64);
jbradshaw 1:9490836294ea 188 reg_write_read_multiple_quad_last(ptr,64,flashBuffer,0,0);
jbradshaw 1:9490836294ea 189 //wait_ms(1);
jbradshaw 1:9490836294ea 190 ptr += 64;
jbradshaw 1:9490836294ea 191 reg_write_read_multiple_quad_last(ptr,64,flashBuffer,0,0);
jbradshaw 1:9490836294ea 192 //wait_ms(1);
jbradshaw 1:9490836294ea 193 ptr += 64;
jbradshaw 1:9490836294ea 194 reg_write_read_multiple_quad_last(ptr,64,flashBuffer,0,1);
jbradshaw 1:9490836294ea 195 //wait_ms(1);
jbradshaw 1:9490836294ea 196 return 0;
jbradshaw 1:9490836294ea 197 }
jbradshaw 0:e4a10ed6eb92 198
jbradshaw 1:9490836294ea 199 //
jbradshaw 1:9490836294ea 200 // read page 0 and assure that it is empty
jbradshaw 1:9490836294ea 201 //
jbradshaw 1:9490836294ea 202 void S25FS512::test_verifyPage0Empty(uint8_t *ptr, int currentPage, int pagesWrittenTo) {
jbradshaw 1:9490836294ea 203 uint8_t data[512];
jbradshaw 1:9490836294ea 204 bool pageEmpty;
jbradshaw 1:9490836294ea 205 readPages_Helper(0, 0, data, 0);
jbradshaw 1:9490836294ea 206 pageEmpty = isPageEmpty(data);
jbradshaw 1:9490836294ea 207 if (pageEmpty == false) {
jbradshaw 1:9490836294ea 208 //PRINTD_2("ERROR: Page 0 is no longer empty!!!!!!!\r\n");
jbradshaw 1:9490836294ea 209 //PRINTD_2("Page 0->\r\n");
jbradshaw 1:9490836294ea 210 //DebugRoutines::dumpBuffer(data, 256);
jbradshaw 1:9490836294ea 211 //PRINTD_2("Page 0->\r\n");
jbradshaw 1:9490836294ea 212 readPages_Helper(0, 0, data, 0);
jbradshaw 1:9490836294ea 213 //DebugRoutines::dumpBuffer(data, 256);
jbradshaw 1:9490836294ea 214 //PRINTD_2("Page 0->\r\n");
jbradshaw 1:9490836294ea 215 readPages_Helper(0, 0, data, 0);
jbradshaw 1:9490836294ea 216 //DebugRoutines::dumpBuffer(data, 256);
jbradshaw 1:9490836294ea 217 if (ptr != NULL) {
jbradshaw 1:9490836294ea 218 //PRINTD_2("currentPage=%d ", (int)currentPage);
jbradshaw 1:9490836294ea 219 //PRINTD_2("pagesWrittenTo=%d\r\n", (int)pagesWrittenTo);
jbradshaw 1:9490836294ea 220 //PRINTD_2("Writing page data->\r\n");
jbradshaw 1:9490836294ea 221 //DebugRoutines::dumpBuffer(ptr, 256);
jbradshaw 1:9490836294ea 222 }
jbradshaw 1:9490836294ea 223 while (1) ;
jbradshaw 1:9490836294ea 224 }
jbradshaw 0:e4a10ed6eb92 225 }
jbradshaw 0:e4a10ed6eb92 226
jbradshaw 0:e4a10ed6eb92 227 //******************************************************************************
jbradshaw 1:9490836294ea 228 int8_t S25FS512::quadIoRead_Pages(uint32_t address, uint8_t *buffer, uint32_t numberOfPages) {
jbradshaw 1:9490836294ea 229 uint8_t cmdArray[5];
jbradshaw 1:9490836294ea 230 uint8_t *ptr;
jbradshaw 1:9490836294ea 231 uint8_t last;
jbradshaw 1:9490836294ea 232 uint32_t i;
jbradshaw 1:9490836294ea 233 cmdArray[0] = 0xEC; //0xEB;
jbradshaw 1:9490836294ea 234 cmdArray[1] = (address >> 24) & 0xFF;
jbradshaw 1:9490836294ea 235 cmdArray[2] = (address >> 16) & 0xFF;
jbradshaw 1:9490836294ea 236 cmdArray[3] = (address >> 8) & 0xFF;
jbradshaw 1:9490836294ea 237 cmdArray[4] = (address >> 0) & 0xFF;
jbradshaw 1:9490836294ea 238 //reg_write_read_multiple_quad(cmdArray,4,flashBuffer,32);
jbradshaw 1:9490836294ea 239 /* last = 0;
jbradshaw 1:9490836294ea 240 num = 0;
jbradshaw 1:9490836294ea 241 inc = 32;
jbradshaw 1:9490836294ea 242 while (num < number) {*/
jbradshaw 1:9490836294ea 243 ptr = buffer;
jbradshaw 1:9490836294ea 244 last = 0;
jbradshaw 1:9490836294ea 245 // only send the command
jbradshaw 1:9490836294ea 246 reg_write_read_multiple_quad_last(cmdArray, 5, ptr, 0, 0);
jbradshaw 1:9490836294ea 247 //wait_ms(1);
jbradshaw 1:9490836294ea 248 reg_write_read_multiple_quad_last(cmdArray, 0, ptr, 5, 0);
jbradshaw 1:9490836294ea 249 //wait_ms(1);
jbradshaw 1:9490836294ea 250 for (i = 0; i < numberOfPages; i++) {
jbradshaw 1:9490836294ea 251 reg_write_read_multiple_quad_last(cmdArray,0,ptr,64, 0);
jbradshaw 1:9490836294ea 252 //wait_ms(1);
jbradshaw 1:9490836294ea 253 ptr += 64;
jbradshaw 1:9490836294ea 254 reg_write_read_multiple_quad_last(cmdArray,0,ptr,64, 0);
jbradshaw 1:9490836294ea 255 //wait_ms(1);
jbradshaw 1:9490836294ea 256 ptr += 64;
jbradshaw 1:9490836294ea 257 reg_write_read_multiple_quad_last(cmdArray,0,ptr,64, 0);
jbradshaw 1:9490836294ea 258 //wait_ms(1);
jbradshaw 1:9490836294ea 259 ptr += 64;
jbradshaw 1:9490836294ea 260 // check if this is the last page
jbradshaw 1:9490836294ea 261 if ((i + 1) == numberOfPages) {
jbradshaw 1:9490836294ea 262 last = 1;
jbradshaw 1:9490836294ea 263 }
jbradshaw 1:9490836294ea 264 reg_write_read_multiple_quad_last(cmdArray,0,ptr,64, last);
jbradshaw 1:9490836294ea 265 //wait_ms(1);
jbradshaw 1:9490836294ea 266 ptr += 64;
jbradshaw 1:9490836294ea 267 }
jbradshaw 1:9490836294ea 268 return 0;
jbradshaw 0:e4a10ed6eb92 269 }
jbradshaw 0:e4a10ed6eb92 270
jbradshaw 0:e4a10ed6eb92 271 //******************************************************************************
jbradshaw 0:e4a10ed6eb92 272 int8_t S25FS512::checkBusy(void) {
jbradshaw 1:9490836294ea 273 uint8_t cmdArray[5];
jbradshaw 1:9490836294ea 274 cmdArray[0] = 0x05;
jbradshaw 1:9490836294ea 275 reg_write_read_multiple_quad(cmdArray,1,flashBuffer,2);
jbradshaw 1:9490836294ea 276 return flashBuffer[1] & 0x1;
jbradshaw 0:e4a10ed6eb92 277 }
jbradshaw 0:e4a10ed6eb92 278
jbradshaw 0:e4a10ed6eb92 279 //******************************************************************************
jbradshaw 0:e4a10ed6eb92 280 void S25FS512::waitTillNotBusy(void) {
jbradshaw 1:9490836294ea 281 while (checkBusy() == 1) { }
jbradshaw 0:e4a10ed6eb92 282 }
jbradshaw 0:e4a10ed6eb92 283
jbradshaw 0:e4a10ed6eb92 284 //******************************************************************************
jbradshaw 0:e4a10ed6eb92 285 int8_t S25FS512::sectorErase(uint32_t address) {
jbradshaw 1:9490836294ea 286 uint8_t cmdArray[5];
jbradshaw 1:9490836294ea 287 cmdArray[0] = 0xDC; //0xD8;
jbradshaw 1:9490836294ea 288 cmdArray[1] = (address >> 24) & 0xFF;
jbradshaw 1:9490836294ea 289 cmdArray[2] = (address >> 16) & 0xFF;
jbradshaw 1:9490836294ea 290 cmdArray[3] = (address >> 8) & 0xFF;
jbradshaw 1:9490836294ea 291 cmdArray[4] = (address >> 0) & 0xFF;
jbradshaw 1:9490836294ea 292 return reg_write_read_multiple_quad(cmdArray,5,flashBuffer,0);
jbradshaw 0:e4a10ed6eb92 293 }
jbradshaw 0:e4a10ed6eb92 294
jbradshaw 0:e4a10ed6eb92 295 //******************************************************************************
jbradshaw 0:e4a10ed6eb92 296 int8_t S25FS512::parameterSectorErase(uint32_t address) {
jbradshaw 1:9490836294ea 297 uint8_t cmdArray[5];
jbradshaw 1:9490836294ea 298 cmdArray[0] = 0x21; //0x20 (P4E), 0x21 (4P4E)
jbradshaw 1:9490836294ea 299 cmdArray[1] = (address >> 24) & 0xFF;
jbradshaw 1:9490836294ea 300 cmdArray[2] = (address >> 16) & 0xFF;
jbradshaw 1:9490836294ea 301 cmdArray[3] = (address >> 8) & 0xFF;
jbradshaw 1:9490836294ea 302 cmdArray[4] = (address >> 0) & 0xFF;
jbradshaw 1:9490836294ea 303 reg_write_read_multiple_quad(cmdArray,5,flashBuffer,0);
jbradshaw 1:9490836294ea 304 return 0;
jbradshaw 0:e4a10ed6eb92 305 }
jbradshaw 0:e4a10ed6eb92 306
jbradshaw 0:e4a10ed6eb92 307 //******************************************************************************
jbradshaw 0:e4a10ed6eb92 308 int8_t S25FS512::readIdentification(uint8_t *dataArray, uint8_t length) {
jbradshaw 1:9490836294ea 309 // 4QIOR = 0x9F
jbradshaw 1:9490836294ea 310 uint8_t cmdArray[1];
jbradshaw 1:9490836294ea 311 cmdArray[0] = 0x9F; // read ID command
jbradshaw 1:9490836294ea 312 return reg_write_read_multiple_quad(cmdArray,1,dataArray,length);
jbradshaw 0:e4a10ed6eb92 313 }
jbradshaw 0:e4a10ed6eb92 314
jbradshaw 0:e4a10ed6eb92 315 //******************************************************************************
jbradshaw 0:e4a10ed6eb92 316 uint8_t S25FS512::reset(void) {
jbradshaw 1:9490836294ea 317 uint8_t cmdArray[8];
jbradshaw 1:9490836294ea 318 wait_ms(1);
jbradshaw 1:9490836294ea 319 cmdArray[0] = 0x66;
jbradshaw 1:9490836294ea 320 reg_write_read_multiple_quad(cmdArray,1,flashBuffer,0);
jbradshaw 1:9490836294ea 321 wait_ms(1);
jbradshaw 1:9490836294ea 322 cmdArray[0] = 0x99;
jbradshaw 1:9490836294ea 323 reg_write_read_multiple_quad(cmdArray,1,flashBuffer,0);
jbradshaw 1:9490836294ea 324 return 0;
jbradshaw 0:e4a10ed6eb92 325 }
jbradshaw 0:e4a10ed6eb92 326
jbradshaw 0:e4a10ed6eb92 327 //******************************************************************************
jbradshaw 0:e4a10ed6eb92 328 uint8_t S25FS512::enableHWReset(void) {
jbradshaw 1:9490836294ea 329 uint8_t data[8];
jbradshaw 1:9490836294ea 330 wait_ms(1);
jbradshaw 1:9490836294ea 331 // CR2V Configuration Register-2 Volatile
jbradshaw 1:9490836294ea 332 // bit 5
jbradshaw 1:9490836294ea 333 readAnyRegister(0x00800003,data, 8);
jbradshaw 1:9490836294ea 334 writeAnyRegister(0x00800003,0x64);
jbradshaw 1:9490836294ea 335 return 0;
jbradshaw 0:e4a10ed6eb92 336 }
jbradshaw 0:e4a10ed6eb92 337
jbradshaw 0:e4a10ed6eb92 338 //******************************************************************************
jbradshaw 0:e4a10ed6eb92 339 uint8_t S25FS512::detect(void) {
jbradshaw 1:9490836294ea 340 uint8_t array[8];
jbradshaw 1:9490836294ea 341 uint8_t array2[8];
jbradshaw 1:9490836294ea 342
jbradshaw 1:9490836294ea 343 // Send WREN
jbradshaw 1:9490836294ea 344 wren();
jbradshaw 1:9490836294ea 345 // Send WREN
jbradshaw 1:9490836294ea 346 wren();
jbradshaw 1:9490836294ea 347 // delay
jbradshaw 1:9490836294ea 348 wait_ms(1);
jbradshaw 1:9490836294ea 349 // Put into quad mode
jbradshaw 1:9490836294ea 350 //setQuadMode();
jbradshaw 1:9490836294ea 351
jbradshaw 1:9490836294ea 352 // Send WDIS
jbradshaw 1:9490836294ea 353 // array[0] = 0x04;
jbradshaw 1:9490836294ea 354 // test_reg_write_multiple_4wire(array,1);
jbradshaw 1:9490836294ea 355
jbradshaw 1:9490836294ea 356 // Send WREN
jbradshaw 1:9490836294ea 357 wren();
jbradshaw 1:9490836294ea 358 // delay
jbradshaw 1:9490836294ea 359 wait_ms(1);
jbradshaw 0:e4a10ed6eb92 360
jbradshaw 1:9490836294ea 361 // Send write any register cmd
jbradshaw 1:9490836294ea 362 writeAnyRegister(0x0003, 0x48);
jbradshaw 1:9490836294ea 363 /*
jbradshaw 1:9490836294ea 364 //
jbradshaw 1:9490836294ea 365 // try reading the ID by using 4 wire spi for the command and quad for reading
jbradshaw 1:9490836294ea 366 //
jbradshaw 0:e4a10ed6eb92 367
jbradshaw 1:9490836294ea 368 // send read id cmd
jbradshaw 1:9490836294ea 369 array[0] = 0x9F;
jbradshaw 1:9490836294ea 370 test_reg_write_multiple_4wire(array,1);
jbradshaw 1:9490836294ea 371 // send read id via quad
jbradshaw 1:9490836294ea 372 test_reg_read_multiple_quad(array,7);
jbradshaw 1:9490836294ea 373 */
jbradshaw 1:9490836294ea 374 // delay
jbradshaw 1:9490836294ea 375 wait_ms(1);
jbradshaw 1:9490836294ea 376 array[0] = 0x9F; // read ID command
jbradshaw 1:9490836294ea 377 reg_write_read_multiple_quad(array,1,array2,7);
jbradshaw 1:9490836294ea 378
jbradshaw 1:9490836294ea 379 /*
jbradshaw 1:9490836294ea 380 //uint8_t val[5];
jbradshaw 1:9490836294ea 381 uint32_t result;
jbradshaw 1:9490836294ea 382 test_reg_write(0x9F);
jbradshaw 1:9490836294ea 383 test_reg_read2(0x9F,&result);
jbradshaw 1:9490836294ea 384 test_reg_read3(0x9F,&result);
jbradshaw 1:9490836294ea 385 */
jbradshaw 1:9490836294ea 386 return 0;
jbradshaw 0:e4a10ed6eb92 387 }
jbradshaw 0:e4a10ed6eb92 388
jbradshaw 0:e4a10ed6eb92 389 //******************************************************************************
jbradshaw 0:e4a10ed6eb92 390 int S25FS512::setQuadMode(void) {
jbradshaw 1:9490836294ea 391 wait_ms(1);
jbradshaw 0:e4a10ed6eb92 392 wren4Wire();
jbradshaw 1:9490836294ea 393 wait_ms(1);
jbradshaw 0:e4a10ed6eb92 394 writeAnyRegister4Wire(0x800002, 0x02); // set Quad = 1
jbradshaw 1:9490836294ea 395 wait_ms(1);
jbradshaw 0:e4a10ed6eb92 396 wren4Wire();
jbradshaw 1:9490836294ea 397 wait_ms(1);
jbradshaw 0:e4a10ed6eb92 398 writeAnyRegister4Wire(0x800003, 0x48); // set 8 latency, set QPI 4-4-4
jbradshaw 1:9490836294ea 399 return 0;
jbradshaw 0:e4a10ed6eb92 400 }
jbradshaw 0:e4a10ed6eb92 401
jbradshaw 0:e4a10ed6eb92 402 //******************************************************************************
jbradshaw 1:9490836294ea 403 bool S25FS512::isPageEmpty(uint8_t *ptr) {
jbradshaw 1:9490836294ea 404 int i;
jbradshaw 1:9490836294ea 405 for (i = 0; i < 256; i++) {
jbradshaw 1:9490836294ea 406 if (ptr[i] != 0xFF) return false;
jbradshaw 1:9490836294ea 407 }
jbradshaw 1:9490836294ea 408 return true;
jbradshaw 0:e4a10ed6eb92 409 }
jbradshaw 0:e4a10ed6eb92 410
jbradshaw 0:e4a10ed6eb92 411 //******************************************************************************
jbradshaw 0:e4a10ed6eb92 412 int8_t S25FS512::parameterSectorErase_Helper(uint32_t address) {
jbradshaw 1:9490836294ea 413 waitTillNotBusy();
jbradshaw 1:9490836294ea 414 wait_us(100);
jbradshaw 1:9490836294ea 415 wren();
jbradshaw 1:9490836294ea 416 wait_us(100);
jbradshaw 1:9490836294ea 417 parameterSectorErase(address);
jbradshaw 1:9490836294ea 418 wait_us(100);
jbradshaw 1:9490836294ea 419 waitTillNotBusy();
jbradshaw 1:9490836294ea 420 wait_us(100);
jbradshaw 1:9490836294ea 421 return 0;
jbradshaw 0:e4a10ed6eb92 422 }
jbradshaw 0:e4a10ed6eb92 423
jbradshaw 0:e4a10ed6eb92 424 //******************************************************************************
jbradshaw 0:e4a10ed6eb92 425 int8_t S25FS512::sectorErase_Helper(uint32_t address) {
jbradshaw 1:9490836294ea 426 waitTillNotBusy();
jbradshaw 1:9490836294ea 427 wait_us(100);
jbradshaw 1:9490836294ea 428 wren();
jbradshaw 1:9490836294ea 429 wait_us(100);
jbradshaw 1:9490836294ea 430
jbradshaw 1:9490836294ea 431 if (address < 0x20000) { //0x8000) {
jbradshaw 0:e4a10ed6eb92 432 parameterSectorErase(address);
jbradshaw 0:e4a10ed6eb92 433 } else {
jbradshaw 0:e4a10ed6eb92 434 sectorErase(address);
jbradshaw 1:9490836294ea 435 }
jbradshaw 1:9490836294ea 436 //if (address < 0x20000) {
jbradshaw 1:9490836294ea 437 //parameterSectorErase(address);
jbradshaw 1:9490836294ea 438 //} else {
jbradshaw 1:9490836294ea 439 //sectorErase(address);
jbradshaw 1:9490836294ea 440 //}
jbradshaw 1:9490836294ea 441 wait_us(100);
jbradshaw 1:9490836294ea 442 waitTillNotBusy();
jbradshaw 1:9490836294ea 443 wait_us(100);
jbradshaw 1:9490836294ea 444 return 0;
jbradshaw 0:e4a10ed6eb92 445 }
jbradshaw 0:e4a10ed6eb92 446
jbradshaw 0:e4a10ed6eb92 447 //******************************************************************************
jbradshaw 0:e4a10ed6eb92 448 int8_t S25FS512::bulkErase_Helper(void) {
jbradshaw 1:9490836294ea 449 waitTillNotBusy();
jbradshaw 1:9490836294ea 450 wait_us(100);
jbradshaw 1:9490836294ea 451 wren();
jbradshaw 1:9490836294ea 452 wait_us(100);
jbradshaw 1:9490836294ea 453 bulkErase();
jbradshaw 1:9490836294ea 454 wait_us(100);
jbradshaw 1:9490836294ea 455 waitTillNotBusy();
jbradshaw 1:9490836294ea 456 wait_us(100);
jbradshaw 1:9490836294ea 457 return 0;
jbradshaw 0:e4a10ed6eb92 458 }
jbradshaw 0:e4a10ed6eb92 459
jbradshaw 0:e4a10ed6eb92 460 //******************************************************************************
jbradshaw 1:9490836294ea 461 // write a page worth of data (256 bytes) from buffer, offset defined where in the buffer to begin write
jbradshaw 1:9490836294ea 462 int8_t S25FS512::writePage_Helper(uint32_t pageNumber, uint8_t *buffer, uint32_t offset) {
jbradshaw 1:9490836294ea 463 uint8_t *ptr;
jbradshaw 1:9490836294ea 464 waitTillNotBusy();
jbradshaw 1:9490836294ea 465 //wait_ms(1);
jbradshaw 1:9490836294ea 466 wren();
jbradshaw 1:9490836294ea 467 ptr = &buffer[offset];
jbradshaw 1:9490836294ea 468 //wait_ms(1);
jbradshaw 1:9490836294ea 469 pageProgram(pageNumber << 8,ptr);
jbradshaw 1:9490836294ea 470 wait_us(100);
jbradshaw 1:9490836294ea 471 waitTillNotBusy();
jbradshaw 1:9490836294ea 472
jbradshaw 1:9490836294ea 473 //wait_ms(1);
jbradshaw 1:9490836294ea 474 return 0;
jbradshaw 0:e4a10ed6eb92 475 }
jbradshaw 0:e4a10ed6eb92 476
jbradshaw 0:e4a10ed6eb92 477 //******************************************************************************
jbradshaw 0:e4a10ed6eb92 478 // read pages from flash into buffer, offset defined where in the buffer use
jbradshaw 1:9490836294ea 479 int8_t S25FS512::readPages_Helper(uint32_t startPageNumber,uint32_t endPageNumber, uint8_t *buffer, uint32_t offset) {
jbradshaw 1:9490836294ea 480 int8_t status = 0;
jbradshaw 1:9490836294ea 481 uint8_t *ptr;
jbradshaw 1:9490836294ea 482 uint32_t page;
jbradshaw 1:9490836294ea 483 ptr = &buffer[offset];
jbradshaw 1:9490836294ea 484 waitTillNotBusy();
jbradshaw 1:9490836294ea 485 for (page = startPageNumber; page <= endPageNumber; page++) {
jbradshaw 1:9490836294ea 486 wait_us(100);
jbradshaw 1:9490836294ea 487 status = quadIoRead_Pages((uint32_t)(page << 8), (uint8_t *)ptr, 1);
jbradshaw 1:9490836294ea 488 ptr += 0x100;
jbradshaw 1:9490836294ea 489 }
jbradshaw 1:9490836294ea 490 return status;
jbradshaw 0:e4a10ed6eb92 491 }
jbradshaw 1:9490836294ea 492
jbradshaw 1:9490836294ea 493