Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Ser25lcxxx.cpp@0:20b4b057fa7f, 2020-06-17 (annotated)
- Committer:
- Picmon
- Date:
- Wed Jun 17 10:11:19 2020 +0000
- Revision:
- 0:20b4b057fa7f
Neptune;
Who changed what in which revision?
User | Revision | Line number | New 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 | } |