MAX32620HSP (MAXREFDES100) RPC Example for Graphical User Interface

Dependencies:   USBDevice

Fork of HSP_Release by Jerry Bradshaw

This is an example program for the MAX32620HSP (MAXREFDES100 Health Sensor Platform). It demonstrates all the features of the platform and works with a companion graphical user interface (GUI) to help evaluate/configure/monitor the board. Go to the MAXREFDES100 product page and click on "design resources" to download the companion software. The GUI connects to the board through an RPC interface on a virtual serial port over the USB interface.

The RPC interface provides access to all the features of the board and is available to interface with other development environments such Matlab. This firmware provides realtime data streaming through the RPC interface over USB, and also provides the ability to log the data to flash for untethered battery operation. The data logging settings are configured through the GUI, and the GUI also provides the interface to download logged data.

Details on the RPC interface can be found here: HSP RPC Interface Documentation

Windows

With this program loaded, the MAX32620HSP will appear on your computer as a serial port. On Mac and Linux, this will happen by default. For Windows, you need to install a driver: HSP serial port windows driver

For more details about this platform and how to use it, see the MAXREFDES100 product page.

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