Maxim Integrated / MAX30001EVSYSKIT
Committer:
Emre.Eken
Date:
Wed Jun 27 14:17:34 2018 +0300
Revision:
1:957e5bad16c2
first rev

Who changed what in which revision?

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