Lucas Lim / Mbed 2 deprecated HSP_Temperature_Barometer_CS3237

Dependencies:   mbed

Committer:
lucaslwl
Date:
Mon Aug 26 08:11:41 2019 +0000
Revision:
22:5c07298d3383
add library folder

Who changed what in which revision?

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