J L / Mbed 2 deprecated Neptune_170620

Dependencies:   mbed

Committer:
Picmon
Date:
Wed Jun 17 10:11:19 2020 +0000
Revision:
0:20b4b057fa7f
Neptune;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Picmon 0:20b4b057fa7f 1 /*
Picmon 0:20b4b057fa7f 2 * Ser25lcxxx library
Picmon 0:20b4b057fa7f 3 * Copyright (c) 2010 Hendrik Lipka
Picmon 0:20b4b057fa7f 4 *
Picmon 0:20b4b057fa7f 5 * Permission is hereby granted, free of charge, to any person obtaining a copy
Picmon 0:20b4b057fa7f 6 * of this software and associated documentation files (the "Software"), to deal
Picmon 0:20b4b057fa7f 7 * in the Software without restriction, including without limitation the rights
Picmon 0:20b4b057fa7f 8 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
Picmon 0:20b4b057fa7f 9 * copies of the Software, and to permit persons to whom the Software is
Picmon 0:20b4b057fa7f 10 * furnished to do so, subject to the following conditions:
Picmon 0:20b4b057fa7f 11 *
Picmon 0:20b4b057fa7f 12 * The above copyright notice and this permission notice shall be included in
Picmon 0:20b4b057fa7f 13 * all copies or substantial portions of the Software.
Picmon 0:20b4b057fa7f 14 *
Picmon 0:20b4b057fa7f 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Picmon 0:20b4b057fa7f 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Picmon 0:20b4b057fa7f 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
Picmon 0:20b4b057fa7f 18 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Picmon 0:20b4b057fa7f 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Picmon 0:20b4b057fa7f 20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
Picmon 0:20b4b057fa7f 21 * THE SOFTWARE.
Picmon 0:20b4b057fa7f 22 */
Picmon 0:20b4b057fa7f 23
Picmon 0:20b4b057fa7f 24 #include "mbed.h"
Picmon 0:20b4b057fa7f 25 #include "Definitions.h"
Picmon 0:20b4b057fa7f 26 #include "Ser25lcxxx.h"
Picmon 0:20b4b057fa7f 27 #include "wait_api.h"
Picmon 0:20b4b057fa7f 28 #include "NVM.h"
Picmon 0:20b4b057fa7f 29
Picmon 0:20b4b057fa7f 30 #define HIGH(x) ((x&0xff00)>>8)
Picmon 0:20b4b057fa7f 31 #define LOW(x) (x&0xff)
Picmon 0:20b4b057fa7f 32
Picmon 0:20b4b057fa7f 33 extern Serial pc;//Debug Port via USB
Picmon 0:20b4b057fa7f 34 extern char ramNVM[];//NVM value store
Picmon 0:20b4b057fa7f 35
Picmon 0:20b4b057fa7f 36 Ser25LCxxx::Ser25LCxxx(SPI *spi, PinName enable, int bytes, int pagesize) {
Picmon 0:20b4b057fa7f 37 _spi=spi;
Picmon 0:20b4b057fa7f 38 _enable=new DigitalOut(enable);
Picmon 0:20b4b057fa7f 39 _size=bytes;
Picmon 0:20b4b057fa7f 40 _pageSize=pagesize;
Picmon 0:20b4b057fa7f 41 _enable->write(1);
Picmon 0:20b4b057fa7f 42 }
Picmon 0:20b4b057fa7f 43
Picmon 0:20b4b057fa7f 44 Ser25LCxxx::~Ser25LCxxx() {
Picmon 0:20b4b057fa7f 45 delete _enable;
Picmon 0:20b4b057fa7f 46 }
Picmon 0:20b4b057fa7f 47
Picmon 0:20b4b057fa7f 48 char* Ser25LCxxx::read(unsigned int startAdr, unsigned int len) {
Picmon 0:20b4b057fa7f 49 // assertion
Picmon 0:20b4b057fa7f 50 if (startAdr+len>_size)
Picmon 0:20b4b057fa7f 51 return NULL;
Picmon 0:20b4b057fa7f 52 char* ret=(char*)malloc(len);
Picmon 0:20b4b057fa7f 53 _enable->write(0);
Picmon 0:20b4b057fa7f 54 wait_us(1);
Picmon 0:20b4b057fa7f 55 // send address
Picmon 0:20b4b057fa7f 56 if (_size<512) { // 256 and 128 bytes
Picmon 0:20b4b057fa7f 57 _spi->write(0x03);
Picmon 0:20b4b057fa7f 58 _spi->write(LOW(startAdr));
Picmon 0:20b4b057fa7f 59 } else if (512==_size) { // 4k variant adds 9th address bit to command
Picmon 0:20b4b057fa7f 60 _spi->write(startAdr>255?0xb:0x3);
Picmon 0:20b4b057fa7f 61 _spi->write(LOW(startAdr));
Picmon 0:20b4b057fa7f 62 } else if (_size<131072) { // everything up to 512k
Picmon 0:20b4b057fa7f 63 _spi->write(0x03);
Picmon 0:20b4b057fa7f 64 _spi->write(HIGH(startAdr));
Picmon 0:20b4b057fa7f 65 _spi->write(LOW(startAdr));
Picmon 0:20b4b057fa7f 66 } else { // 25xx1024, needs 3 byte address
Picmon 0:20b4b057fa7f 67 _spi->write(0x03);
Picmon 0:20b4b057fa7f 68 _spi->write(startAdr>>16);
Picmon 0:20b4b057fa7f 69 _spi->write(HIGH(startAdr));
Picmon 0:20b4b057fa7f 70 _spi->write(LOW(startAdr));
Picmon 0:20b4b057fa7f 71 }
Picmon 0:20b4b057fa7f 72 // read data into buffer
Picmon 0:20b4b057fa7f 73 for (int i=0;i<len;i++) {
Picmon 0:20b4b057fa7f 74 ret[i]=_spi->write(0);
Picmon 0:20b4b057fa7f 75 }
Picmon 0:20b4b057fa7f 76 wait_us(1);
Picmon 0:20b4b057fa7f 77 _enable->write(1);
Picmon 0:20b4b057fa7f 78 return ret;
Picmon 0:20b4b057fa7f 79 }
Picmon 0:20b4b057fa7f 80
Picmon 0:20b4b057fa7f 81 bool Ser25LCxxx::write(unsigned int startAdr, unsigned int len, const char* data) {
Picmon 0:20b4b057fa7f 82 if (startAdr+len>_size)
Picmon 0:20b4b057fa7f 83 return -1;
Picmon 0:20b4b057fa7f 84
Picmon 0:20b4b057fa7f 85 int ofs=0;
Picmon 0:20b4b057fa7f 86 while (ofs<len) {
Picmon 0:20b4b057fa7f 87 // calculate amount of data to write into current page
Picmon 0:20b4b057fa7f 88 int pageLen=_pageSize-((startAdr+ofs)%_pageSize);
Picmon 0:20b4b057fa7f 89 if (ofs+pageLen>len)
Picmon 0:20b4b057fa7f 90 pageLen=len-ofs;
Picmon 0:20b4b057fa7f 91 // write single page
Picmon 0:20b4b057fa7f 92 bool b=writePage(startAdr+ofs,pageLen,data+ofs);
Picmon 0:20b4b057fa7f 93 if (!b)
Picmon 0:20b4b057fa7f 94 return false;
Picmon 0:20b4b057fa7f 95 // and switch to next page
Picmon 0:20b4b057fa7f 96 ofs+=pageLen;
Picmon 0:20b4b057fa7f 97 }
Picmon 0:20b4b057fa7f 98 return true;
Picmon 0:20b4b057fa7f 99 }
Picmon 0:20b4b057fa7f 100
Picmon 0:20b4b057fa7f 101 bool Ser25LCxxx::writePage(unsigned int startAdr, unsigned int len, const char* data) {
Picmon 0:20b4b057fa7f 102 enableWrite();
Picmon 0:20b4b057fa7f 103
Picmon 0:20b4b057fa7f 104 _enable->write(0);
Picmon 0:20b4b057fa7f 105 wait_us(1);
Picmon 0:20b4b057fa7f 106
Picmon 0:20b4b057fa7f 107 if (_size<512) { // 256 and 128 bytes
Picmon 0:20b4b057fa7f 108 _spi->write(0x02);
Picmon 0:20b4b057fa7f 109 _spi->write(LOW(startAdr));
Picmon 0:20b4b057fa7f 110 } else if (512==_size) { // 4k variant adds 9th address bit to command
Picmon 0:20b4b057fa7f 111 _spi->write(startAdr>255?0xa:0x2);
Picmon 0:20b4b057fa7f 112 _spi->write(LOW(startAdr));
Picmon 0:20b4b057fa7f 113 } else if (_size<131072) { // everything up to 512k
Picmon 0:20b4b057fa7f 114 _spi->write(0x02);
Picmon 0:20b4b057fa7f 115 _spi->write(HIGH(startAdr));
Picmon 0:20b4b057fa7f 116 _spi->write(LOW(startAdr));
Picmon 0:20b4b057fa7f 117 } else { // 25xx1024, needs 3 byte address
Picmon 0:20b4b057fa7f 118 _spi->write(0x02);
Picmon 0:20b4b057fa7f 119 _spi->write(startAdr>>16);
Picmon 0:20b4b057fa7f 120 _spi->write(HIGH(startAdr));
Picmon 0:20b4b057fa7f 121 _spi->write(LOW(startAdr));
Picmon 0:20b4b057fa7f 122 }
Picmon 0:20b4b057fa7f 123
Picmon 0:20b4b057fa7f 124 // do real write
Picmon 0:20b4b057fa7f 125 for (int i=0;i<len;i++) {
Picmon 0:20b4b057fa7f 126 _spi->write(data[i]);
Picmon 0:20b4b057fa7f 127 }
Picmon 0:20b4b057fa7f 128 wait_us(1);
Picmon 0:20b4b057fa7f 129 // disable to start physical write
Picmon 0:20b4b057fa7f 130 _enable->write(1);
Picmon 0:20b4b057fa7f 131
Picmon 0:20b4b057fa7f 132 waitForWrite();
Picmon 0:20b4b057fa7f 133
Picmon 0:20b4b057fa7f 134 return true;
Picmon 0:20b4b057fa7f 135 }
Picmon 0:20b4b057fa7f 136
Picmon 0:20b4b057fa7f 137 bool Ser25LCxxx::clearPage(unsigned int pageNum) {
Picmon 0:20b4b057fa7f 138 enableWrite();
Picmon 0:20b4b057fa7f 139 if (_size<65535) {
Picmon 0:20b4b057fa7f 140 char* s=(char*)malloc(_pageSize);
Picmon 0:20b4b057fa7f 141 for (int i=0;i<_pageSize;i++) {
Picmon 0:20b4b057fa7f 142 s[i]=0xff;
Picmon 0:20b4b057fa7f 143 }
Picmon 0:20b4b057fa7f 144 bool b=writePage(_pageSize*pageNum,_pageSize,s);
Picmon 0:20b4b057fa7f 145 delete s;
Picmon 0:20b4b057fa7f 146 return b;
Picmon 0:20b4b057fa7f 147 } else {
Picmon 0:20b4b057fa7f 148 _enable->write(0);
Picmon 0:20b4b057fa7f 149 wait_us(1);
Picmon 0:20b4b057fa7f 150 _spi->write(0x42);
Picmon 0:20b4b057fa7f 151 _spi->write(HIGH(_pageSize*pageNum));
Picmon 0:20b4b057fa7f 152 _spi->write(LOW(_pageSize*pageNum));
Picmon 0:20b4b057fa7f 153 wait_us(1);
Picmon 0:20b4b057fa7f 154 _enable->write(1);
Picmon 0:20b4b057fa7f 155
Picmon 0:20b4b057fa7f 156 waitForWrite();
Picmon 0:20b4b057fa7f 157 }
Picmon 0:20b4b057fa7f 158 return true;
Picmon 0:20b4b057fa7f 159 }
Picmon 0:20b4b057fa7f 160
Picmon 0:20b4b057fa7f 161 void Ser25LCxxx::clearMem() {
Picmon 0:20b4b057fa7f 162 enableWrite();
Picmon 0:20b4b057fa7f 163 if (_size<65535) {
Picmon 0:20b4b057fa7f 164 for (int i=0;i<_size/_pageSize;i++) {
Picmon 0:20b4b057fa7f 165 if (!clearPage(i))
Picmon 0:20b4b057fa7f 166 break;
Picmon 0:20b4b057fa7f 167 }
Picmon 0:20b4b057fa7f 168 }
Picmon 0:20b4b057fa7f 169 else
Picmon 0:20b4b057fa7f 170 {
Picmon 0:20b4b057fa7f 171 _enable->write(0);
Picmon 0:20b4b057fa7f 172 wait_us(1);
Picmon 0:20b4b057fa7f 173 _spi->write(0xc7);
Picmon 0:20b4b057fa7f 174 wait_us(1);
Picmon 0:20b4b057fa7f 175 _enable->write(1);
Picmon 0:20b4b057fa7f 176
Picmon 0:20b4b057fa7f 177 waitForWrite();
Picmon 0:20b4b057fa7f 178 }
Picmon 0:20b4b057fa7f 179 }
Picmon 0:20b4b057fa7f 180
Picmon 0:20b4b057fa7f 181 int Ser25LCxxx::readStatus() {
Picmon 0:20b4b057fa7f 182 _enable->write(0);
Picmon 0:20b4b057fa7f 183 wait_us(1);
Picmon 0:20b4b057fa7f 184 _spi->write(0x5);
Picmon 0:20b4b057fa7f 185 int status=_spi->write(0x00);
Picmon 0:20b4b057fa7f 186 wait_us(1);
Picmon 0:20b4b057fa7f 187 _enable->write(1);
Picmon 0:20b4b057fa7f 188 return status;
Picmon 0:20b4b057fa7f 189 }
Picmon 0:20b4b057fa7f 190
Picmon 0:20b4b057fa7f 191 void Ser25LCxxx::waitForWrite() {
Picmon 0:20b4b057fa7f 192 while (true) {
Picmon 0:20b4b057fa7f 193 if (0==readStatus()&1)
Picmon 0:20b4b057fa7f 194 break;
Picmon 0:20b4b057fa7f 195 wait_us(10);
Picmon 0:20b4b057fa7f 196 }
Picmon 0:20b4b057fa7f 197 }
Picmon 0:20b4b057fa7f 198
Picmon 0:20b4b057fa7f 199 void Ser25LCxxx::enableWrite()
Picmon 0:20b4b057fa7f 200 {
Picmon 0:20b4b057fa7f 201 _enable->write(0);
Picmon 0:20b4b057fa7f 202 wait_us(1);
Picmon 0:20b4b057fa7f 203 _spi->write(0x06);
Picmon 0:20b4b057fa7f 204 wait_us(1);
Picmon 0:20b4b057fa7f 205 _enable->write(1);
Picmon 0:20b4b057fa7f 206 }
Picmon 0:20b4b057fa7f 207
Picmon 0:20b4b057fa7f 208 void dumpLine(char* s, int len,int disp)
Picmon 0:20b4b057fa7f 209 {
Picmon 0:20b4b057fa7f 210 for (int i=0;i<len;i++)
Picmon 0:20b4b057fa7f 211 {
Picmon 0:20b4b057fa7f 212 //ramNVM[i]=s[i];
Picmon 0:20b4b057fa7f 213
Picmon 0:20b4b057fa7f 214 switch(disp)
Picmon 0:20b4b057fa7f 215 {
Picmon 0:20b4b057fa7f 216 case HEX: pc.printf("\r\n|(%d) \t 0x%02X |",i,s[i]); break;
Picmon 0:20b4b057fa7f 217 //case STR: pc.printf("%s ",s[i]); break;
Picmon 0:20b4b057fa7f 218 case CHR: pc.printf("%c ",s[i]); break;
Picmon 0:20b4b057fa7f 219 }
Picmon 0:20b4b057fa7f 220 }
Picmon 0:20b4b057fa7f 221 }
Picmon 0:20b4b057fa7f 222
Picmon 0:20b4b057fa7f 223 void dump(char *s, int len,int disp)
Picmon 0:20b4b057fa7f 224 {
Picmon 0:20b4b057fa7f 225 int i=0;
Picmon 0:20b4b057fa7f 226 while (i<len)
Picmon 0:20b4b057fa7f 227 {
Picmon 0:20b4b057fa7f 228 if (i+16<len)
Picmon 0:20b4b057fa7f 229 dumpLine(s+i,16,disp);
Picmon 0:20b4b057fa7f 230 else
Picmon 0:20b4b057fa7f 231 dumpLine(s+i,len-i,disp);
Picmon 0:20b4b057fa7f 232 i+=16;
Picmon 0:20b4b057fa7f 233 }
Picmon 0:20b4b057fa7f 234 }