LIS3DH & BLE broadcast example for VTT Node V3 & mbed

Dependencies:   BLE_API TMP_nrf51 mbed nRF51822

Committer:
jejuho
Date:
Mon Jan 25 13:27:15 2016 +0000
Revision:
1:bd7fd35251ab
Parent:
0:de3e4a57ebe0
Initial version.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jejuho 0:de3e4a57ebe0 1 /* mbed AT45 Library, for driving the Atmel AT45 series Dataflash with Serial Interface (SPI)
jejuho 0:de3e4a57ebe0 2 * Copyright (c) 2012, Created by Steen Joergensen (stjo2809) inspired by Chris Styles AT45 library
jejuho 0:de3e4a57ebe0 3 *
jejuho 0:de3e4a57ebe0 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
jejuho 0:de3e4a57ebe0 5 * of this software and associated documentation files (the "Software"), to deal
jejuho 0:de3e4a57ebe0 6 * in the Software without restriction, including without limitation the rights
jejuho 0:de3e4a57ebe0 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
jejuho 0:de3e4a57ebe0 8 * copies of the Software, and to permit persons to whom the Software is
jejuho 0:de3e4a57ebe0 9 * furnished to do so, subject to the following conditions:
jejuho 0:de3e4a57ebe0 10 *
jejuho 0:de3e4a57ebe0 11 * The above copyright notice and this permission notice shall be included in
jejuho 0:de3e4a57ebe0 12 * all copies or substantial portions of the Software.
jejuho 0:de3e4a57ebe0 13 *
jejuho 0:de3e4a57ebe0 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
jejuho 0:de3e4a57ebe0 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
jejuho 0:de3e4a57ebe0 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
jejuho 0:de3e4a57ebe0 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
jejuho 0:de3e4a57ebe0 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
jejuho 0:de3e4a57ebe0 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
jejuho 0:de3e4a57ebe0 20 * THE SOFTWARE.
jejuho 0:de3e4a57ebe0 21 */
jejuho 0:de3e4a57ebe0 22
jejuho 0:de3e4a57ebe0 23 #include "mbed.h"
jejuho 0:de3e4a57ebe0 24 #include "AT45.h"
jejuho 0:de3e4a57ebe0 25 #include "nrf_delay.h"
jejuho 0:de3e4a57ebe0 26
jejuho 0:de3e4a57ebe0 27 //=============================================================================
jejuho 0:de3e4a57ebe0 28 // Public functions
jejuho 0:de3e4a57ebe0 29 //=============================================================================
jejuho 0:de3e4a57ebe0 30
jejuho 0:de3e4a57ebe0 31 AT45::AT45(SPI& spi, PinName ncs) : _spi(spi), _ncs(ncs)
jejuho 0:de3e4a57ebe0 32 {
jejuho 0:de3e4a57ebe0 33
jejuho 0:de3e4a57ebe0 34 _pages = -1; // number of pages
jejuho 0:de3e4a57ebe0 35 _pagesize = -1; // size of pages 256/264, 512/528, 1024/1056
jejuho 0:de3e4a57ebe0 36 _devicesize = -1; // In bytes
jejuho 0:de3e4a57ebe0 37 _deep_down = true; // variable for deep power down function (awake ?)
jejuho 0:de3e4a57ebe0 38 _deep_down_onoff = false; // variable for deep power down function (On/Off)
jejuho 0:de3e4a57ebe0 39
jejuho 0:de3e4a57ebe0 40 _initialize(); // Populate all this stuff
jejuho 0:de3e4a57ebe0 41
jejuho 0:de3e4a57ebe0 42 }
jejuho 0:de3e4a57ebe0 43
jejuho 0:de3e4a57ebe0 44 // This function returns the char
jejuho 0:de3e4a57ebe0 45 char AT45::read_byte(int address)
jejuho 0:de3e4a57ebe0 46 {
jejuho 0:de3e4a57ebe0 47 // return byte from address
jejuho 0:de3e4a57ebe0 48 return (_memread( address ));
jejuho 0:de3e4a57ebe0 49 }
jejuho 0:de3e4a57ebe0 50
jejuho 0:de3e4a57ebe0 51 int AT45::read_page(char* data, int page)
jejuho 0:de3e4a57ebe0 52 {
jejuho 0:de3e4a57ebe0 53 int address = -1;
jejuho 0:de3e4a57ebe0 54
jejuho 0:de3e4a57ebe0 55 if(_pagesize == 256)
jejuho 0:de3e4a57ebe0 56 {
jejuho 0:de3e4a57ebe0 57 address = page * 256;
jejuho 0:de3e4a57ebe0 58 }
jejuho 0:de3e4a57ebe0 59 else if(_pagesize == 264)
jejuho 0:de3e4a57ebe0 60 {
jejuho 0:de3e4a57ebe0 61 address = page * 512;
jejuho 0:de3e4a57ebe0 62 }
jejuho 0:de3e4a57ebe0 63 else if(_pagesize == 512)
jejuho 0:de3e4a57ebe0 64 {
jejuho 0:de3e4a57ebe0 65 address = page * 512;
jejuho 0:de3e4a57ebe0 66 }
jejuho 0:de3e4a57ebe0 67 else if(_pagesize == 528)
jejuho 0:de3e4a57ebe0 68 {
jejuho 0:de3e4a57ebe0 69 address = page * 1024;
jejuho 0:de3e4a57ebe0 70 }
jejuho 0:de3e4a57ebe0 71 else if(_pagesize == 1024)
jejuho 0:de3e4a57ebe0 72 {
jejuho 0:de3e4a57ebe0 73 address = page * 1024;
jejuho 0:de3e4a57ebe0 74 }
jejuho 0:de3e4a57ebe0 75 else if(_pagesize == 1056)
jejuho 0:de3e4a57ebe0 76 {
jejuho 0:de3e4a57ebe0 77 address = page * 2048;
jejuho 0:de3e4a57ebe0 78 }
jejuho 0:de3e4a57ebe0 79 else
jejuho 0:de3e4a57ebe0 80 {
jejuho 0:de3e4a57ebe0 81 return (-1); // something isnt configured right
jejuho 0:de3e4a57ebe0 82 }
jejuho 0:de3e4a57ebe0 83
jejuho 0:de3e4a57ebe0 84 _busy();
jejuho 0:de3e4a57ebe0 85 _flashread(1,address); // read the first page of the block into SRAM buffer 1
jejuho 0:de3e4a57ebe0 86 _busy(); // Wait until First page has loaded into buffer 1
jejuho 0:de3e4a57ebe0 87
jejuho 0:de3e4a57ebe0 88 // this is done directly as we are reading back an entire buffer, and this can be done more optimally than using _sramread
jejuho 0:de3e4a57ebe0 89 _select();
jejuho 0:de3e4a57ebe0 90 _spi.write(0xd4);
jejuho 0:de3e4a57ebe0 91 _sendaddr (0x0);
jejuho 0:de3e4a57ebe0 92 _spi.write (0x0); // dont care byte
jejuho 0:de3e4a57ebe0 93
jejuho 0:de3e4a57ebe0 94 for(int i=0; i<_pagesize ;i++)
jejuho 0:de3e4a57ebe0 95 {
jejuho 0:de3e4a57ebe0 96 data[i] = _spi.write (0x0);
jejuho 0:de3e4a57ebe0 97 }
jejuho 0:de3e4a57ebe0 98 _deselect();
jejuho 0:de3e4a57ebe0 99
jejuho 0:de3e4a57ebe0 100 return (0);
jejuho 0:de3e4a57ebe0 101 }
jejuho 0:de3e4a57ebe0 102 int AT45::read_block(char *data, int block) // under construction F&#65533;R CHECK AF MIC OG LERCHE
jejuho 0:de3e4a57ebe0 103 {
jejuho 0:de3e4a57ebe0 104 char temp_data[_pagesize];
jejuho 0:de3e4a57ebe0 105 int page_start;
jejuho 0:de3e4a57ebe0 106
jejuho 0:de3e4a57ebe0 107 if (block < _blocks || block == 0) {
jejuho 0:de3e4a57ebe0 108 page_start = block * 8;
jejuho 0:de3e4a57ebe0 109
jejuho 0:de3e4a57ebe0 110 for (int i=0; i<8; i++) {
jejuho 0:de3e4a57ebe0 111 read_page(temp_data, page_start);
jejuho 0:de3e4a57ebe0 112 //printf("%d Read round, Data is: %d\r\n",i,*temp_data);
jejuho 0:de3e4a57ebe0 113 page_start = page_start + 1;
jejuho 0:de3e4a57ebe0 114 for (int z=0; z<_pagesize ; z++) {
jejuho 0:de3e4a57ebe0 115 data[z+(_pagesize*i)] = temp_data[z];
jejuho 0:de3e4a57ebe0 116 }
jejuho 0:de3e4a57ebe0 117 }
jejuho 0:de3e4a57ebe0 118 } else {
jejuho 0:de3e4a57ebe0 119 //do nothing
jejuho 0:de3e4a57ebe0 120 }
jejuho 0:de3e4a57ebe0 121 //printf("Read done, Data is: %d\r\n",*data);
jejuho 0:de3e4a57ebe0 122 return (0);
jejuho 0:de3e4a57ebe0 123 }
jejuho 0:de3e4a57ebe0 124
jejuho 0:de3e4a57ebe0 125 int AT45::read_block(char *data[], int block) // under construction F&#65533; CHECK AF MIC OG LERCHE
jejuho 0:de3e4a57ebe0 126 {
jejuho 0:de3e4a57ebe0 127 char temp_data[_pagesize];
jejuho 0:de3e4a57ebe0 128 int page_start;
jejuho 0:de3e4a57ebe0 129
jejuho 0:de3e4a57ebe0 130 if(block < _blocks || block == 0)
jejuho 0:de3e4a57ebe0 131 {
jejuho 0:de3e4a57ebe0 132 page_start = block * 8;
jejuho 0:de3e4a57ebe0 133
jejuho 0:de3e4a57ebe0 134 for(int i=0; i<8 ;i++) // 8 pages in a block
jejuho 0:de3e4a57ebe0 135 {
jejuho 0:de3e4a57ebe0 136 read_page(temp_data, page_start);
jejuho 0:de3e4a57ebe0 137 page_start = page_start + 1;
jejuho 0:de3e4a57ebe0 138 for(int z=0; z<_pagesize ;z++)
jejuho 0:de3e4a57ebe0 139 {
jejuho 0:de3e4a57ebe0 140 data[i][z] = temp_data[z];
jejuho 0:de3e4a57ebe0 141 }
jejuho 0:de3e4a57ebe0 142 }
jejuho 0:de3e4a57ebe0 143 }
jejuho 0:de3e4a57ebe0 144 else
jejuho 0:de3e4a57ebe0 145 {
jejuho 0:de3e4a57ebe0 146 //do nothing
jejuho 0:de3e4a57ebe0 147 }
jejuho 0:de3e4a57ebe0 148
jejuho 0:de3e4a57ebe0 149 return (0);
jejuho 0:de3e4a57ebe0 150 }
jejuho 0:de3e4a57ebe0 151
jejuho 0:de3e4a57ebe0 152 // This function writes the char to the address supplied
jejuho 0:de3e4a57ebe0 153 // Note : We pass the raw address to the underlying functions
jejuho 0:de3e4a57ebe0 154 void AT45::write_byte(int address, char data)
jejuho 0:de3e4a57ebe0 155 {
jejuho 0:de3e4a57ebe0 156 _busy();
jejuho 0:de3e4a57ebe0 157 _flashread(1,address); // read the Flash page into SRAM buffer
jejuho 0:de3e4a57ebe0 158 _busy(); // wait for the read to complete
jejuho 0:de3e4a57ebe0 159 _sramwrite(1,address,data); // Write new data into SRAM
jejuho 0:de3e4a57ebe0 160 _busy(); // Make sure flash isnt busy
jejuho 0:de3e4a57ebe0 161 _flashwrite(1,address); // Write back to the page address
jejuho 0:de3e4a57ebe0 162 }
jejuho 0:de3e4a57ebe0 163
jejuho 0:de3e4a57ebe0 164 int AT45::write_page(char* data, int page)
jejuho 0:de3e4a57ebe0 165 {
jejuho 0:de3e4a57ebe0 166 int address = -1;
jejuho 0:de3e4a57ebe0 167
jejuho 0:de3e4a57ebe0 168 if(_pagesize == 256)
jejuho 0:de3e4a57ebe0 169 {
jejuho 0:de3e4a57ebe0 170 address = page * 256;
jejuho 0:de3e4a57ebe0 171 }
jejuho 0:de3e4a57ebe0 172 else if(_pagesize == 264)
jejuho 0:de3e4a57ebe0 173 {
jejuho 0:de3e4a57ebe0 174 address = page * 512;
jejuho 0:de3e4a57ebe0 175 }
jejuho 0:de3e4a57ebe0 176 else if(_pagesize == 512)
jejuho 0:de3e4a57ebe0 177 {
jejuho 0:de3e4a57ebe0 178 address = page * 512;
jejuho 0:de3e4a57ebe0 179 }
jejuho 0:de3e4a57ebe0 180 else if(_pagesize == 528)
jejuho 0:de3e4a57ebe0 181 {
jejuho 0:de3e4a57ebe0 182 address = page * 1024;
jejuho 0:de3e4a57ebe0 183 }
jejuho 0:de3e4a57ebe0 184 else if(_pagesize == 1024)
jejuho 0:de3e4a57ebe0 185 {
jejuho 0:de3e4a57ebe0 186 address = page * 1024;
jejuho 0:de3e4a57ebe0 187 }
jejuho 0:de3e4a57ebe0 188 else if(_pagesize == 1056)
jejuho 0:de3e4a57ebe0 189 {
jejuho 0:de3e4a57ebe0 190 address = page * 2048;
jejuho 0:de3e4a57ebe0 191 }
jejuho 0:de3e4a57ebe0 192 else
jejuho 0:de3e4a57ebe0 193 {
jejuho 0:de3e4a57ebe0 194 return (-1); // something isnt configured right
jejuho 0:de3e4a57ebe0 195 }
jejuho 0:de3e4a57ebe0 196
jejuho 0:de3e4a57ebe0 197 _select();
jejuho 0:de3e4a57ebe0 198 _spi.write(0x84); // writing to buffer #1
jejuho 0:de3e4a57ebe0 199 _sendaddr (0); // we are writing to the entire buffer
jejuho 0:de3e4a57ebe0 200
jejuho 0:de3e4a57ebe0 201 for(int i=0; i<_pagesize ;i++)
jejuho 0:de3e4a57ebe0 202 {
jejuho 0:de3e4a57ebe0 203 _spi.write (data[i]);
jejuho 0:de3e4a57ebe0 204 }
jejuho 0:de3e4a57ebe0 205 _deselect();
jejuho 0:de3e4a57ebe0 206
jejuho 0:de3e4a57ebe0 207 _busy(); // make sure the Flahs isnt busy
jejuho 0:de3e4a57ebe0 208
jejuho 0:de3e4a57ebe0 209 // issue command to write buffer 1 to the appropraite flash page
jejuho 0:de3e4a57ebe0 210 _select();
jejuho 0:de3e4a57ebe0 211 _spi.write (0x83);
jejuho 0:de3e4a57ebe0 212 _sendaddr (_getpaddr(address));
jejuho 0:de3e4a57ebe0 213 _deselect();
jejuho 0:de3e4a57ebe0 214
jejuho 0:de3e4a57ebe0 215 return (0);
jejuho 0:de3e4a57ebe0 216 }
jejuho 0:de3e4a57ebe0 217 int AT45::write_block(char *data, int block) // under construction F&#65533;R CHECK AF MIC OG LERCHE
jejuho 0:de3e4a57ebe0 218 {
jejuho 0:de3e4a57ebe0 219
jejuho 0:de3e4a57ebe0 220 int page_start;
jejuho 0:de3e4a57ebe0 221 char page_arr[_pagesize];
jejuho 0:de3e4a57ebe0 222
jejuho 0:de3e4a57ebe0 223 if (block < _blocks || block == 0)
jejuho 0:de3e4a57ebe0 224 {
jejuho 0:de3e4a57ebe0 225 page_start = block * 8;
jejuho 0:de3e4a57ebe0 226
jejuho 0:de3e4a57ebe0 227 for (int i=0; i<8 ; i++)
jejuho 0:de3e4a57ebe0 228 {
jejuho 0:de3e4a57ebe0 229 // Copy data from *data at 0 to 511 _ 512 - 1023, and so on every round.
jejuho 0:de3e4a57ebe0 230 memcpy(page_arr, &data[_pagesize*i], _pagesize);
jejuho 0:de3e4a57ebe0 231
jejuho 0:de3e4a57ebe0 232 write_page(page_arr, page_start);
jejuho 0:de3e4a57ebe0 233 page_start = page_start + 1;
jejuho 0:de3e4a57ebe0 234 }
jejuho 0:de3e4a57ebe0 235 } else {
jejuho 0:de3e4a57ebe0 236 //do nothing
jejuho 0:de3e4a57ebe0 237 }
jejuho 0:de3e4a57ebe0 238
jejuho 0:de3e4a57ebe0 239 return (0);
jejuho 0:de3e4a57ebe0 240 }
jejuho 0:de3e4a57ebe0 241 int AT45::write_block(char *data[], int block) // under construction F&#65533; CHECK AF MIC OG LERCHE
jejuho 0:de3e4a57ebe0 242 {
jejuho 0:de3e4a57ebe0 243 char temp_data[_pagesize];
jejuho 0:de3e4a57ebe0 244 int page_start;
jejuho 0:de3e4a57ebe0 245
jejuho 0:de3e4a57ebe0 246 if(block < _blocks || block == 0)
jejuho 0:de3e4a57ebe0 247 {
jejuho 0:de3e4a57ebe0 248 page_start = block * 8;
jejuho 0:de3e4a57ebe0 249
jejuho 0:de3e4a57ebe0 250 for(int i=0; i<8 ;i++)
jejuho 0:de3e4a57ebe0 251 {
jejuho 0:de3e4a57ebe0 252 for(int z=0; z<_pagesize ;z++)
jejuho 0:de3e4a57ebe0 253 {
jejuho 0:de3e4a57ebe0 254 temp_data[z] = data[i][z];
jejuho 0:de3e4a57ebe0 255 }
jejuho 0:de3e4a57ebe0 256 write_page(temp_data, page_start);
jejuho 0:de3e4a57ebe0 257 page_start = page_start + 1;
jejuho 0:de3e4a57ebe0 258 }
jejuho 0:de3e4a57ebe0 259 }
jejuho 0:de3e4a57ebe0 260 else
jejuho 0:de3e4a57ebe0 261 {
jejuho 0:de3e4a57ebe0 262 //do nothing
jejuho 0:de3e4a57ebe0 263 }
jejuho 0:de3e4a57ebe0 264
jejuho 0:de3e4a57ebe0 265 return (0);
jejuho 0:de3e4a57ebe0 266 }
jejuho 0:de3e4a57ebe0 267
jejuho 0:de3e4a57ebe0 268 int AT45::FAT_read(char* data, int page)
jejuho 0:de3e4a57ebe0 269 {
jejuho 0:de3e4a57ebe0 270 // For 256 byte pages, we read two pages
jejuho 0:de3e4a57ebe0 271 if((_pagesize == 256) || (_pagesize == 264))
jejuho 0:de3e4a57ebe0 272 {
jejuho 0:de3e4a57ebe0 273 int address = page * 512; // This is the start address of the 512 byte block
jejuho 0:de3e4a57ebe0 274
jejuho 0:de3e4a57ebe0 275 _flashread(1,address); // read the first page of the block into SRAM buffer 1
jejuho 0:de3e4a57ebe0 276 _busy(); // Wait until First page has loaded into buffer 1
jejuho 0:de3e4a57ebe0 277
jejuho 0:de3e4a57ebe0 278 // this is done directly as we are reading back an entire buffer, and this can be done more optimally than using _sramread
jejuho 0:de3e4a57ebe0 279 _select();
jejuho 0:de3e4a57ebe0 280 _spi.write(0xd4);
jejuho 0:de3e4a57ebe0 281 _sendaddr (0x0);
jejuho 0:de3e4a57ebe0 282 _spi.write (0x0); // dont care byte
jejuho 0:de3e4a57ebe0 283
jejuho 0:de3e4a57ebe0 284 for(int i=0;i<256;i++)
jejuho 0:de3e4a57ebe0 285 {
jejuho 0:de3e4a57ebe0 286 data[i] = _spi.write (0x0);
jejuho 0:de3e4a57ebe0 287 }
jejuho 0:de3e4a57ebe0 288 _deselect();
jejuho 0:de3e4a57ebe0 289
jejuho 0:de3e4a57ebe0 290 _flashread(1,address+256); // read the second page of the block into SRAM buffer 2
jejuho 0:de3e4a57ebe0 291 _busy(); // Wait until second page has loaded into buffer 2
jejuho 0:de3e4a57ebe0 292
jejuho 0:de3e4a57ebe0 293 // Now the second page is loaded, pull this out into the second half of the data buffer
jejuho 0:de3e4a57ebe0 294 // this is done directly as we are reading back an entire buffer, and this can be done more optimally than using _sramread
jejuho 0:de3e4a57ebe0 295 _select();
jejuho 0:de3e4a57ebe0 296 _spi.write(0xd4);
jejuho 0:de3e4a57ebe0 297 _sendaddr (0x0);
jejuho 0:de3e4a57ebe0 298 _spi.write (0x0); // dont care byte
jejuho 0:de3e4a57ebe0 299
jejuho 0:de3e4a57ebe0 300 for(int i=0;i<256;i++)
jejuho 0:de3e4a57ebe0 301 {
jejuho 0:de3e4a57ebe0 302 data[256+i] = _spi.write (0x0);
jejuho 0:de3e4a57ebe0 303 }
jejuho 0:de3e4a57ebe0 304 _deselect();
jejuho 0:de3e4a57ebe0 305 return (0);
jejuho 0:de3e4a57ebe0 306 }
jejuho 0:de3e4a57ebe0 307
jejuho 0:de3e4a57ebe0 308 // For 512 byte pages, we read just the single page, transfer it
jejuho 0:de3e4a57ebe0 309 else if((_pagesize == 512) || (_pagesize == 528))
jejuho 0:de3e4a57ebe0 310 {
jejuho 0:de3e4a57ebe0 311 int address = page * 512; // This is the start address of the 512 byte block
jejuho 0:de3e4a57ebe0 312
jejuho 0:de3e4a57ebe0 313 _busy(); // Wait until First page has loaded into buffer 1
jejuho 0:de3e4a57ebe0 314 _flashread(1,address); // read the first page of the block into SRAM buffer 1
jejuho 0:de3e4a57ebe0 315 _busy(); // Wait until First page has loaded into buffer 1
jejuho 0:de3e4a57ebe0 316
jejuho 0:de3e4a57ebe0 317 // Now the page has loaded, simply transfer it from the sram buffer to the data array
jejuho 0:de3e4a57ebe0 318 // this is done directly as we are reading back an entire buffer, and this can be done more optimally than using _sramread
jejuho 0:de3e4a57ebe0 319 _select();
jejuho 0:de3e4a57ebe0 320 _spi.write(0xd4);
jejuho 0:de3e4a57ebe0 321 _sendaddr (0x0);
jejuho 0:de3e4a57ebe0 322 _spi.write (0x0); // dont care byte
jejuho 0:de3e4a57ebe0 323
jejuho 0:de3e4a57ebe0 324 for(int i=0;i<512;i++)
jejuho 0:de3e4a57ebe0 325 {
jejuho 0:de3e4a57ebe0 326 data[i] = _spi.write (0x0);
jejuho 0:de3e4a57ebe0 327 }
jejuho 0:de3e4a57ebe0 328 _deselect();
jejuho 0:de3e4a57ebe0 329 return (0);
jejuho 0:de3e4a57ebe0 330 }
jejuho 0:de3e4a57ebe0 331
jejuho 0:de3e4a57ebe0 332 // For 1024 byte pages, we read just a single page, transfer half of it
jejuho 0:de3e4a57ebe0 333 else if((_pagesize == 1024) || (_pagesize == 1056))
jejuho 0:de3e4a57ebe0 334 {
jejuho 0:de3e4a57ebe0 335 int address = _getpaddr(page * 512); // This is the start address of the 512 byte block
jejuho 0:de3e4a57ebe0 336
jejuho 0:de3e4a57ebe0 337 _busy(); // Wait until First page has loaded into buffer 1
jejuho 0:de3e4a57ebe0 338
jejuho 0:de3e4a57ebe0 339 _flashread(1,address); // read the first page of the block into SRAM buffer 1
jejuho 0:de3e4a57ebe0 340
jejuho 0:de3e4a57ebe0 341 _busy(); // Wait until First page has loaded into buffer 1
jejuho 0:de3e4a57ebe0 342
jejuho 0:de3e4a57ebe0 343 // Now the page has loaded, simply transfer it from the sram buffer to the data array
jejuho 0:de3e4a57ebe0 344 // this is done directly as we are reading back an entire buffer, and this can be done more optimally than using _sramread
jejuho 0:de3e4a57ebe0 345
jejuho 0:de3e4a57ebe0 346 _select();
jejuho 0:de3e4a57ebe0 347 _spi.write(0xd4);
jejuho 0:de3e4a57ebe0 348
jejuho 0:de3e4a57ebe0 349 if (page %2) // odd numbered block, read from adress 0x200
jejuho 0:de3e4a57ebe0 350 {
jejuho 0:de3e4a57ebe0 351 _sendaddr (0x200);
jejuho 0:de3e4a57ebe0 352 }
jejuho 0:de3e4a57ebe0 353 else // even numbered block, then we are reading from sram buffer 0x0
jejuho 0:de3e4a57ebe0 354 {
jejuho 0:de3e4a57ebe0 355 _sendaddr (0x0);
jejuho 0:de3e4a57ebe0 356 }
jejuho 0:de3e4a57ebe0 357
jejuho 0:de3e4a57ebe0 358 _spi.write (0x0); // dont care byte
jejuho 0:de3e4a57ebe0 359
jejuho 0:de3e4a57ebe0 360 for(int i=0;i<512;i++)
jejuho 0:de3e4a57ebe0 361 {
jejuho 0:de3e4a57ebe0 362 data[i] = _spi.write (0x0);
jejuho 0:de3e4a57ebe0 363 }
jejuho 0:de3e4a57ebe0 364 _deselect();
jejuho 0:de3e4a57ebe0 365 return (0);
jejuho 0:de3e4a57ebe0 366 }
jejuho 0:de3e4a57ebe0 367 else
jejuho 0:de3e4a57ebe0 368 {
jejuho 0:de3e4a57ebe0 369 return (-1); // something isnt configured right
jejuho 0:de3e4a57ebe0 370 }
jejuho 0:de3e4a57ebe0 371 }
jejuho 0:de3e4a57ebe0 372
jejuho 0:de3e4a57ebe0 373 int AT45::FAT_write(char* data, int page)
jejuho 0:de3e4a57ebe0 374 {
jejuho 0:de3e4a57ebe0 375 // For 256 byte pages, we overwrite two pages
jejuho 0:de3e4a57ebe0 376 if((_pagesize == 256) || (_pagesize == 264))
jejuho 0:de3e4a57ebe0 377 {
jejuho 0:de3e4a57ebe0 378
jejuho 0:de3e4a57ebe0 379 // fill the first buffer with the first half of the block
jejuho 0:de3e4a57ebe0 380 // do this directly, for better performance
jejuho 0:de3e4a57ebe0 381 _select();
jejuho 0:de3e4a57ebe0 382 _spi.write(0x84); // writing to buffer #1
jejuho 0:de3e4a57ebe0 383 _sendaddr (0); // we are writing to the entire buffer
jejuho 0:de3e4a57ebe0 384
jejuho 0:de3e4a57ebe0 385 for(int i=0;i<256;i++) {
jejuho 0:de3e4a57ebe0 386 _spi.write (data[i]);
jejuho 0:de3e4a57ebe0 387 }
jejuho 0:de3e4a57ebe0 388 _deselect();
jejuho 0:de3e4a57ebe0 389
jejuho 0:de3e4a57ebe0 390 _flashwrite(1,(page*512));
jejuho 0:de3e4a57ebe0 391
jejuho 0:de3e4a57ebe0 392 // fill the buffer with the second half of the block
jejuho 0:de3e4a57ebe0 393 // do this directly, for better performance
jejuho 0:de3e4a57ebe0 394 _select();
jejuho 0:de3e4a57ebe0 395 _spi.write(0x84); // writing to buffer #1
jejuho 0:de3e4a57ebe0 396 _sendaddr (0); // we are writing to the entire buffer
jejuho 0:de3e4a57ebe0 397
jejuho 0:de3e4a57ebe0 398 for(int i=0;i<256;i++) {
jejuho 0:de3e4a57ebe0 399 _spi.write (data[256+i]);
jejuho 0:de3e4a57ebe0 400 }
jejuho 0:de3e4a57ebe0 401 _deselect();
jejuho 0:de3e4a57ebe0 402
jejuho 0:de3e4a57ebe0 403 _flashwrite(1,((page*512)+256));
jejuho 0:de3e4a57ebe0 404 }
jejuho 0:de3e4a57ebe0 405
jejuho 0:de3e4a57ebe0 406 // For 512 byte pages, we overwrite a single page
jejuho 0:de3e4a57ebe0 407 else if((_pagesize == 512) || (_pagesize == 528))
jejuho 0:de3e4a57ebe0 408 {
jejuho 0:de3e4a57ebe0 409
jejuho 0:de3e4a57ebe0 410 // fill the first buffer with the block data
jejuho 0:de3e4a57ebe0 411 // do this directly, for better performance
jejuho 0:de3e4a57ebe0 412 _select();
jejuho 0:de3e4a57ebe0 413 _spi.write(0x84); // writing to buffer #1
jejuho 0:de3e4a57ebe0 414 _sendaddr (0); // we are writing to the entire buffer
jejuho 0:de3e4a57ebe0 415
jejuho 0:de3e4a57ebe0 416 for(int i=0;i<512;i++) {
jejuho 0:de3e4a57ebe0 417 _spi.write (data[i]);
jejuho 0:de3e4a57ebe0 418 }
jejuho 0:de3e4a57ebe0 419 _deselect();
jejuho 0:de3e4a57ebe0 420
jejuho 0:de3e4a57ebe0 421 _busy(); // make sure the Flahs isnt busy
jejuho 0:de3e4a57ebe0 422
jejuho 0:de3e4a57ebe0 423 // issue command to write buffer 1 to the appropraite flash page
jejuho 0:de3e4a57ebe0 424 _select();
jejuho 0:de3e4a57ebe0 425 _spi.write (0x83);
jejuho 0:de3e4a57ebe0 426 _sendaddr (_getpaddr(page * 512));
jejuho 0:de3e4a57ebe0 427 _deselect();
jejuho 0:de3e4a57ebe0 428 }
jejuho 0:de3e4a57ebe0 429
jejuho 0:de3e4a57ebe0 430 // For 1024 byte pages, we do a read modify write
jejuho 0:de3e4a57ebe0 431 // must make sure we overwrite the right half of the page!
jejuho 0:de3e4a57ebe0 432 else if((_pagesize == 1024) || (_pagesize == 1056))
jejuho 0:de3e4a57ebe0 433 {
jejuho 0:de3e4a57ebe0 434
jejuho 0:de3e4a57ebe0 435 _busy(); // make sure the flash isnt busy
jejuho 0:de3e4a57ebe0 436
jejuho 0:de3e4a57ebe0 437 int address = _getpaddr(page*512);
jejuho 0:de3e4a57ebe0 438
jejuho 0:de3e4a57ebe0 439 // Read the page into sram
jejuho 0:de3e4a57ebe0 440 _flashread(1,address);
jejuho 0:de3e4a57ebe0 441
jejuho 0:de3e4a57ebe0 442 // wait for this operation to complete
jejuho 0:de3e4a57ebe0 443 _busy();
jejuho 0:de3e4a57ebe0 444
jejuho 0:de3e4a57ebe0 445 // Overwrite the appropriate half
jejuho 0:de3e4a57ebe0 446 // do this directly, for better performance
jejuho 0:de3e4a57ebe0 447 _select();
jejuho 0:de3e4a57ebe0 448 _spi.write(0x84); // writing to buffer #1
jejuho 0:de3e4a57ebe0 449
jejuho 0:de3e4a57ebe0 450 if(page%2) // this is an odd block number, overwrite second half of buffer
jejuho 0:de3e4a57ebe0 451 {
jejuho 0:de3e4a57ebe0 452 _sendaddr (0x200); // we are writing to the entire buffer
jejuho 0:de3e4a57ebe0 453 }
jejuho 0:de3e4a57ebe0 454 else // this is an even block, overwrite the first half
jejuho 0:de3e4a57ebe0 455 {
jejuho 0:de3e4a57ebe0 456 _sendaddr (0x0); // we are writing to the entire buffer
jejuho 0:de3e4a57ebe0 457 }
jejuho 0:de3e4a57ebe0 458
jejuho 0:de3e4a57ebe0 459 for(int i=0;i<512;i++)
jejuho 0:de3e4a57ebe0 460 {
jejuho 0:de3e4a57ebe0 461 _spi.write (data[i]);
jejuho 0:de3e4a57ebe0 462 }
jejuho 0:de3e4a57ebe0 463 _deselect();
jejuho 0:de3e4a57ebe0 464
jejuho 0:de3e4a57ebe0 465 // Write the page back
jejuho 0:de3e4a57ebe0 466 _busy();
jejuho 0:de3e4a57ebe0 467 _flashwrite(1,address);
jejuho 0:de3e4a57ebe0 468 }
jejuho 0:de3e4a57ebe0 469
jejuho 0:de3e4a57ebe0 470 // Something has gone wrong
jejuho 0:de3e4a57ebe0 471 else
jejuho 0:de3e4a57ebe0 472 {
jejuho 0:de3e4a57ebe0 473 return (-1);
jejuho 0:de3e4a57ebe0 474 }
jejuho 0:de3e4a57ebe0 475
jejuho 0:de3e4a57ebe0 476 return (0);
jejuho 0:de3e4a57ebe0 477 }
jejuho 0:de3e4a57ebe0 478
jejuho 0:de3e4a57ebe0 479 // Erase the entire chip
jejuho 0:de3e4a57ebe0 480 void AT45::chip_erase()
jejuho 0:de3e4a57ebe0 481 {
jejuho 0:de3e4a57ebe0 482 _busy(); // make sure flash isnt already in busy.
jejuho 0:de3e4a57ebe0 483
jejuho 0:de3e4a57ebe0 484 _select();
jejuho 0:de3e4a57ebe0 485 // 4 byte command sequence
jejuho 0:de3e4a57ebe0 486 _spi.write(0xc7);
jejuho 0:de3e4a57ebe0 487 _spi.write(0x94);
jejuho 0:de3e4a57ebe0 488 _spi.write(0x80);
jejuho 0:de3e4a57ebe0 489 _spi.write(0x9a);
jejuho 0:de3e4a57ebe0 490 _deselect();
jejuho 0:de3e4a57ebe0 491
jejuho 0:de3e4a57ebe0 492 _busy(); // Make erase a blocking function
jejuho 0:de3e4a57ebe0 493 }
jejuho 0:de3e4a57ebe0 494
jejuho 0:de3e4a57ebe0 495 // Erase one block
jejuho 0:de3e4a57ebe0 496 void AT45::block_erase(int block)
jejuho 0:de3e4a57ebe0 497 {
jejuho 0:de3e4a57ebe0 498 int address = -1;
jejuho 0:de3e4a57ebe0 499
jejuho 0:de3e4a57ebe0 500 // Calculate page addresses
jejuho 0:de3e4a57ebe0 501 if(block < _blocks || block == 0)
jejuho 0:de3e4a57ebe0 502 {
jejuho 0:de3e4a57ebe0 503 if(_pagesize == 256)
jejuho 0:de3e4a57ebe0 504 {
jejuho 0:de3e4a57ebe0 505 address = block * 2048;
jejuho 0:de3e4a57ebe0 506 }
jejuho 0:de3e4a57ebe0 507 else if(_pagesize == 264)
jejuho 0:de3e4a57ebe0 508 {
jejuho 0:de3e4a57ebe0 509 address = block * 4096;
jejuho 0:de3e4a57ebe0 510 }
jejuho 0:de3e4a57ebe0 511 else if(_pagesize == 512)
jejuho 0:de3e4a57ebe0 512 {
jejuho 0:de3e4a57ebe0 513 address = block * 4096;
jejuho 0:de3e4a57ebe0 514 }
jejuho 0:de3e4a57ebe0 515 else if(_pagesize == 528)
jejuho 0:de3e4a57ebe0 516 {
jejuho 0:de3e4a57ebe0 517 address = block * 8192;
jejuho 0:de3e4a57ebe0 518 }
jejuho 0:de3e4a57ebe0 519 else if(_pagesize == 1024)
jejuho 0:de3e4a57ebe0 520 {
jejuho 0:de3e4a57ebe0 521 address = block * 8192;
jejuho 0:de3e4a57ebe0 522 }
jejuho 0:de3e4a57ebe0 523 else if(_pagesize == 1056)
jejuho 0:de3e4a57ebe0 524 {
jejuho 0:de3e4a57ebe0 525 address = block * 16384;
jejuho 0:de3e4a57ebe0 526 }
jejuho 0:de3e4a57ebe0 527
jejuho 0:de3e4a57ebe0 528 _busy();
jejuho 0:de3e4a57ebe0 529 _select();
jejuho 0:de3e4a57ebe0 530 _spi.write(0x50);
jejuho 0:de3e4a57ebe0 531 _sendaddr (address);
jejuho 0:de3e4a57ebe0 532 _deselect();
jejuho 0:de3e4a57ebe0 533 _busy();
jejuho 0:de3e4a57ebe0 534 }
jejuho 0:de3e4a57ebe0 535 else
jejuho 0:de3e4a57ebe0 536 {
jejuho 0:de3e4a57ebe0 537 //do nothing
jejuho 0:de3e4a57ebe0 538 }
jejuho 0:de3e4a57ebe0 539 }
jejuho 0:de3e4a57ebe0 540
jejuho 0:de3e4a57ebe0 541 // Erase one page
jejuho 0:de3e4a57ebe0 542 void AT45::page_erase(int page)
jejuho 0:de3e4a57ebe0 543 {
jejuho 0:de3e4a57ebe0 544 int address = -1;
jejuho 0:de3e4a57ebe0 545
jejuho 0:de3e4a57ebe0 546 // Calculate page addresses
jejuho 0:de3e4a57ebe0 547 if(page < _pages || page == 0)
jejuho 0:de3e4a57ebe0 548 {
jejuho 0:de3e4a57ebe0 549 if(_pagesize == 256)
jejuho 0:de3e4a57ebe0 550 {
jejuho 0:de3e4a57ebe0 551 address = page * 256;
jejuho 0:de3e4a57ebe0 552 }
jejuho 0:de3e4a57ebe0 553 else if(_pagesize == 264)
jejuho 0:de3e4a57ebe0 554 {
jejuho 0:de3e4a57ebe0 555 address = page * 512;
jejuho 0:de3e4a57ebe0 556 }
jejuho 0:de3e4a57ebe0 557 else if(_pagesize == 512)
jejuho 0:de3e4a57ebe0 558 {
jejuho 0:de3e4a57ebe0 559 address = page * 512;
jejuho 0:de3e4a57ebe0 560 }
jejuho 0:de3e4a57ebe0 561 else if(_pagesize == 528)
jejuho 0:de3e4a57ebe0 562 {
jejuho 0:de3e4a57ebe0 563 address = page * 1024;
jejuho 0:de3e4a57ebe0 564 }
jejuho 0:de3e4a57ebe0 565 else if(_pagesize == 1024)
jejuho 0:de3e4a57ebe0 566 {
jejuho 0:de3e4a57ebe0 567 address = page * 1024;
jejuho 0:de3e4a57ebe0 568 }
jejuho 0:de3e4a57ebe0 569 else if(_pagesize == 1056)
jejuho 0:de3e4a57ebe0 570 {
jejuho 0:de3e4a57ebe0 571 address = page * 2048;
jejuho 0:de3e4a57ebe0 572 }
jejuho 0:de3e4a57ebe0 573
jejuho 0:de3e4a57ebe0 574 _busy();
jejuho 0:de3e4a57ebe0 575 _select();
jejuho 0:de3e4a57ebe0 576 _spi.write(0x81);
jejuho 0:de3e4a57ebe0 577 _sendaddr (address);
jejuho 0:de3e4a57ebe0 578 _deselect();
jejuho 0:de3e4a57ebe0 579 _busy();
jejuho 0:de3e4a57ebe0 580 }
jejuho 0:de3e4a57ebe0 581 else
jejuho 0:de3e4a57ebe0 582 {
jejuho 0:de3e4a57ebe0 583 //do nothing
jejuho 0:de3e4a57ebe0 584 }
jejuho 0:de3e4a57ebe0 585 }
jejuho 0:de3e4a57ebe0 586
jejuho 0:de3e4a57ebe0 587 // return the size of the part in bytes
jejuho 0:de3e4a57ebe0 588 int AT45::device_size()
jejuho 0:de3e4a57ebe0 589 {
jejuho 0:de3e4a57ebe0 590 return _devicesize;
jejuho 0:de3e4a57ebe0 591 }
jejuho 0:de3e4a57ebe0 592
jejuho 0:de3e4a57ebe0 593 // return the numbers of pages
jejuho 0:de3e4a57ebe0 594 int AT45::pages()
jejuho 0:de3e4a57ebe0 595 {
jejuho 0:de3e4a57ebe0 596 return _pages;
jejuho 0:de3e4a57ebe0 597 }
jejuho 0:de3e4a57ebe0 598
jejuho 0:de3e4a57ebe0 599 // return the page size of the part in bytes
jejuho 0:de3e4a57ebe0 600 int AT45::pagesize()
jejuho 0:de3e4a57ebe0 601 {
jejuho 0:de3e4a57ebe0 602 return _pagesize;
jejuho 0:de3e4a57ebe0 603 }
jejuho 0:de3e4a57ebe0 604
jejuho 0:de3e4a57ebe0 605 // A one-time programmable configuration
jejuho 0:de3e4a57ebe0 606 void AT45::set_pageszie_to_binary()
jejuho 0:de3e4a57ebe0 607 {
jejuho 0:de3e4a57ebe0 608 _busy(); // make sure flash isnt already in busy.
jejuho 0:de3e4a57ebe0 609
jejuho 0:de3e4a57ebe0 610 _select();
jejuho 0:de3e4a57ebe0 611 // 4 byte command sequence
jejuho 0:de3e4a57ebe0 612 _spi.write(0x3d);
jejuho 0:de3e4a57ebe0 613 _spi.write(0x2a);
jejuho 0:de3e4a57ebe0 614 _spi.write(0x80);
jejuho 0:de3e4a57ebe0 615 _spi.write(0xa6);
jejuho 0:de3e4a57ebe0 616 _deselect();
jejuho 0:de3e4a57ebe0 617
jejuho 0:de3e4a57ebe0 618 _busy(); // Make erase a blocking function
jejuho 0:de3e4a57ebe0 619 }
jejuho 0:de3e4a57ebe0 620
jejuho 0:de3e4a57ebe0 621 // Return the number of blocks in this device in accordance with the datasheet
jejuho 0:de3e4a57ebe0 622 int AT45::blocks()
jejuho 0:de3e4a57ebe0 623 {
jejuho 0:de3e4a57ebe0 624 return _blocks;
jejuho 0:de3e4a57ebe0 625 }
jejuho 0:de3e4a57ebe0 626
jejuho 0:de3e4a57ebe0 627 // Return the Id of the part
jejuho 0:de3e4a57ebe0 628 int AT45::id()
jejuho 0:de3e4a57ebe0 629 {
jejuho 0:de3e4a57ebe0 630 int id = 0;
jejuho 0:de3e4a57ebe0 631 _select();
jejuho 0:de3e4a57ebe0 632 _spi.write(0x9f);
jejuho 0:de3e4a57ebe0 633 id = (_spi.write(0x00) << 8);
jejuho 0:de3e4a57ebe0 634 id |= _spi.write(0x00);
jejuho 0:de3e4a57ebe0 635 _deselect();
jejuho 0:de3e4a57ebe0 636 return id;
jejuho 0:de3e4a57ebe0 637 }
jejuho 0:de3e4a57ebe0 638
jejuho 0:de3e4a57ebe0 639 // return the Status
jejuho 0:de3e4a57ebe0 640 int AT45::status()
jejuho 0:de3e4a57ebe0 641 {
jejuho 0:de3e4a57ebe0 642 int status = 0;
jejuho 0:de3e4a57ebe0 643 _select();
jejuho 0:de3e4a57ebe0 644 _spi.write(0xd7);
jejuho 0:de3e4a57ebe0 645 status = (_spi.write(0x00));
jejuho 0:de3e4a57ebe0 646 _deselect();
jejuho 0:de3e4a57ebe0 647 return status;
jejuho 0:de3e4a57ebe0 648 }
jejuho 0:de3e4a57ebe0 649
jejuho 0:de3e4a57ebe0 650 // Make sure the Flash isnt already doing something
jejuho 0:de3e4a57ebe0 651 void AT45::busy()
jejuho 0:de3e4a57ebe0 652 {
jejuho 0:de3e4a57ebe0 653 _busy();
jejuho 0:de3e4a57ebe0 654 }
jejuho 0:de3e4a57ebe0 655
jejuho 0:de3e4a57ebe0 656 void AT45::deep_power_down(bool _deep_down_onoff)
jejuho 0:de3e4a57ebe0 657 {
jejuho 0:de3e4a57ebe0 658 if(_deep_down_onoff == false) // Wake up from deep power down
jejuho 0:de3e4a57ebe0 659 {
jejuho 0:de3e4a57ebe0 660 _select();
jejuho 0:de3e4a57ebe0 661 _spi.write(0xab);
jejuho 0:de3e4a57ebe0 662 _deselect();
jejuho 0:de3e4a57ebe0 663 _deep_down = true;
jejuho 0:de3e4a57ebe0 664 // remenber to want 35uS before using the device.
jejuho 0:de3e4a57ebe0 665 }
jejuho 0:de3e4a57ebe0 666 else if(_deep_down_onoff == true) // Go to deep power down
jejuho 0:de3e4a57ebe0 667 {
jejuho 0:de3e4a57ebe0 668 _busy();
jejuho 0:de3e4a57ebe0 669 _select();
jejuho 0:de3e4a57ebe0 670 _spi.write(0xb9);
jejuho 0:de3e4a57ebe0 671 _deselect();
jejuho 0:de3e4a57ebe0 672 _deep_down = false;
jejuho 0:de3e4a57ebe0 673 }
jejuho 0:de3e4a57ebe0 674 else
jejuho 0:de3e4a57ebe0 675 {
jejuho 0:de3e4a57ebe0 676 //do nothing
jejuho 0:de3e4a57ebe0 677 }
jejuho 0:de3e4a57ebe0 678 }
jejuho 0:de3e4a57ebe0 679
jejuho 0:de3e4a57ebe0 680 void AT45::ultra_deep_power_down(bool _deep_down_onoff)
jejuho 0:de3e4a57ebe0 681 {
jejuho 0:de3e4a57ebe0 682 if(_deep_down_onoff == false) // Wake up from deep power down
jejuho 0:de3e4a57ebe0 683 {
jejuho 0:de3e4a57ebe0 684 _select();
jejuho 0:de3e4a57ebe0 685 //_spi.write(0xab);
jejuho 0:de3e4a57ebe0 686 //wait 20ns
jejuho 0:de3e4a57ebe0 687 nrf_delay_us(1);
jejuho 0:de3e4a57ebe0 688 _deselect();
jejuho 0:de3e4a57ebe0 689 _deep_down = true;
jejuho 0:de3e4a57ebe0 690 // remenber to want 35uS before using the device.
jejuho 0:de3e4a57ebe0 691 }
jejuho 0:de3e4a57ebe0 692 else if(_deep_down_onoff == true) // Go to deep power down
jejuho 0:de3e4a57ebe0 693 {
jejuho 0:de3e4a57ebe0 694 _busy();
jejuho 0:de3e4a57ebe0 695 _select();
jejuho 0:de3e4a57ebe0 696 _spi.write(0x79);
jejuho 0:de3e4a57ebe0 697 _deselect();
jejuho 0:de3e4a57ebe0 698 _deep_down = false;
jejuho 0:de3e4a57ebe0 699 }
jejuho 0:de3e4a57ebe0 700 else
jejuho 0:de3e4a57ebe0 701 {
jejuho 0:de3e4a57ebe0 702 //do nothing
jejuho 0:de3e4a57ebe0 703 }
jejuho 0:de3e4a57ebe0 704 }
jejuho 0:de3e4a57ebe0 705
jejuho 0:de3e4a57ebe0 706 bool AT45::is_it_awake()
jejuho 0:de3e4a57ebe0 707 {
jejuho 0:de3e4a57ebe0 708 return _deep_down;
jejuho 0:de3e4a57ebe0 709 }
jejuho 0:de3e4a57ebe0 710
jejuho 0:de3e4a57ebe0 711 //=============================================================================
jejuho 0:de3e4a57ebe0 712 // Private functions
jejuho 0:de3e4a57ebe0 713 //=============================================================================
jejuho 0:de3e4a57ebe0 714
jejuho 0:de3e4a57ebe0 715 void AT45::_initialize()
jejuho 0:de3e4a57ebe0 716 {
jejuho 0:de3e4a57ebe0 717 int _id = 0;
jejuho 0:de3e4a57ebe0 718 int _status = 0;
jejuho 0:de3e4a57ebe0 719
jejuho 0:de3e4a57ebe0 720 _id = id();
jejuho 0:de3e4a57ebe0 721 _id = id();
jejuho 0:de3e4a57ebe0 722 _status = status();
jejuho 0:de3e4a57ebe0 723
jejuho 0:de3e4a57ebe0 724 if ((_id & 0x1f) == 0x3) // 2Mbits
jejuho 0:de3e4a57ebe0 725 {
jejuho 0:de3e4a57ebe0 726 _devicesize = 262144; // Size in bytes
jejuho 0:de3e4a57ebe0 727 _pages = 1024; // Number of pages
jejuho 0:de3e4a57ebe0 728 _blocks = 128; // Number of blocks
jejuho 0:de3e4a57ebe0 729 if (_status & 0x1)
jejuho 0:de3e4a57ebe0 730 {
jejuho 0:de3e4a57ebe0 731 _pagesize = 256;
jejuho 0:de3e4a57ebe0 732 }
jejuho 0:de3e4a57ebe0 733 else
jejuho 0:de3e4a57ebe0 734 {
jejuho 0:de3e4a57ebe0 735 _pagesize = 264;
jejuho 0:de3e4a57ebe0 736 }
jejuho 0:de3e4a57ebe0 737 }
jejuho 0:de3e4a57ebe0 738 else if ( (_id & 0x1f) == 0x4) // 4Mbits
jejuho 0:de3e4a57ebe0 739 {
jejuho 0:de3e4a57ebe0 740 _devicesize = 524288;
jejuho 0:de3e4a57ebe0 741 _pages = 2048;
jejuho 0:de3e4a57ebe0 742 _blocks = 256;
jejuho 0:de3e4a57ebe0 743 if (_status & 0x1)
jejuho 0:de3e4a57ebe0 744 {
jejuho 0:de3e4a57ebe0 745 _pagesize = 256;
jejuho 0:de3e4a57ebe0 746 }
jejuho 0:de3e4a57ebe0 747 else
jejuho 0:de3e4a57ebe0 748 {
jejuho 0:de3e4a57ebe0 749 _pagesize = 264;
jejuho 0:de3e4a57ebe0 750 }
jejuho 0:de3e4a57ebe0 751 }
jejuho 0:de3e4a57ebe0 752 else if ( (_id & 0x1f) == 0x5) // 8Mbits
jejuho 0:de3e4a57ebe0 753 {
jejuho 0:de3e4a57ebe0 754 _devicesize = 1048576;
jejuho 0:de3e4a57ebe0 755 _pages = 4096;
jejuho 0:de3e4a57ebe0 756 _blocks = 512;
jejuho 0:de3e4a57ebe0 757 if (_status & 0x1)
jejuho 0:de3e4a57ebe0 758 {
jejuho 0:de3e4a57ebe0 759 _pagesize = 256;
jejuho 0:de3e4a57ebe0 760 }
jejuho 0:de3e4a57ebe0 761 else
jejuho 0:de3e4a57ebe0 762 {
jejuho 0:de3e4a57ebe0 763 _pagesize = 264;
jejuho 0:de3e4a57ebe0 764 }
jejuho 0:de3e4a57ebe0 765 }
jejuho 0:de3e4a57ebe0 766 else if ( (_id & 0x1f) == 0x6) // 16Mbits
jejuho 0:de3e4a57ebe0 767 {
jejuho 0:de3e4a57ebe0 768 _devicesize = 2097152;
jejuho 0:de3e4a57ebe0 769 _pages = 4096;
jejuho 0:de3e4a57ebe0 770 _blocks = 512;
jejuho 0:de3e4a57ebe0 771 if (_status & 0x1)
jejuho 0:de3e4a57ebe0 772 {
jejuho 0:de3e4a57ebe0 773 _pagesize = 512;
jejuho 0:de3e4a57ebe0 774 }
jejuho 0:de3e4a57ebe0 775 else
jejuho 0:de3e4a57ebe0 776 {
jejuho 0:de3e4a57ebe0 777 _pagesize = 528;
jejuho 0:de3e4a57ebe0 778 }
jejuho 0:de3e4a57ebe0 779 }
jejuho 0:de3e4a57ebe0 780 else if ( (_id & 0x1f) == 0x7) // 32Mbits
jejuho 0:de3e4a57ebe0 781 {
jejuho 0:de3e4a57ebe0 782 _devicesize = 4194304;
jejuho 0:de3e4a57ebe0 783 _pages = 8192;
jejuho 0:de3e4a57ebe0 784 _blocks = 1024;
jejuho 0:de3e4a57ebe0 785 if (_status & 0x1)
jejuho 0:de3e4a57ebe0 786 {
jejuho 0:de3e4a57ebe0 787 _pagesize = 512;
jejuho 0:de3e4a57ebe0 788 }
jejuho 0:de3e4a57ebe0 789 else
jejuho 0:de3e4a57ebe0 790 {
jejuho 0:de3e4a57ebe0 791 _pagesize = 528;
jejuho 0:de3e4a57ebe0 792 }
jejuho 0:de3e4a57ebe0 793 }
jejuho 0:de3e4a57ebe0 794 else if ( (_id & 0x1f) == 0x8) // 64Mbits
jejuho 0:de3e4a57ebe0 795 {
jejuho 0:de3e4a57ebe0 796 _devicesize = 8388608;
jejuho 0:de3e4a57ebe0 797 _pages = 8192;
jejuho 0:de3e4a57ebe0 798 _blocks = 1024;
jejuho 0:de3e4a57ebe0 799 if (_status & 0x1)
jejuho 0:de3e4a57ebe0 800 {
jejuho 0:de3e4a57ebe0 801 _pagesize = 1024;
jejuho 0:de3e4a57ebe0 802 }
jejuho 0:de3e4a57ebe0 803 else
jejuho 0:de3e4a57ebe0 804 {
jejuho 0:de3e4a57ebe0 805 _pagesize = 1056;
jejuho 0:de3e4a57ebe0 806 }
jejuho 0:de3e4a57ebe0 807 }
jejuho 0:de3e4a57ebe0 808 else
jejuho 0:de3e4a57ebe0 809 {
jejuho 0:de3e4a57ebe0 810 _devicesize = -1;
jejuho 0:de3e4a57ebe0 811 _pages = -1;
jejuho 0:de3e4a57ebe0 812 _pagesize = -1;
jejuho 0:de3e4a57ebe0 813 _blocks = -1;
jejuho 0:de3e4a57ebe0 814 }
jejuho 0:de3e4a57ebe0 815 }
jejuho 0:de3e4a57ebe0 816
jejuho 0:de3e4a57ebe0 817 void AT45::_select()
jejuho 0:de3e4a57ebe0 818 {
jejuho 0:de3e4a57ebe0 819 _ncs = 0;
jejuho 0:de3e4a57ebe0 820 }
jejuho 0:de3e4a57ebe0 821
jejuho 0:de3e4a57ebe0 822 void AT45::_deselect()
jejuho 0:de3e4a57ebe0 823 {
jejuho 0:de3e4a57ebe0 824 _ncs = 1;
jejuho 0:de3e4a57ebe0 825 }
jejuho 0:de3e4a57ebe0 826
jejuho 0:de3e4a57ebe0 827 void AT45::_busy() {
jejuho 0:de3e4a57ebe0 828 volatile int iambusy = 1;
jejuho 0:de3e4a57ebe0 829 while (iambusy) {
jejuho 0:de3e4a57ebe0 830 // if bit 7 is set, we can proceed
jejuho 0:de3e4a57ebe0 831 if ( status() & 0x80 ) {
jejuho 0:de3e4a57ebe0 832 iambusy = 0;}
jejuho 0:de3e4a57ebe0 833 }
jejuho 0:de3e4a57ebe0 834 }
jejuho 0:de3e4a57ebe0 835
jejuho 0:de3e4a57ebe0 836 // Write to an SRAM buffer
jejuho 0:de3e4a57ebe0 837 // Note : We create buffer and page addresses in _sram and _flash
jejuho 0:de3e4a57ebe0 838 void AT45::_sramwrite(int buffer, int address, int data)
jejuho 0:de3e4a57ebe0 839 {
jejuho 0:de3e4a57ebe0 840
jejuho 0:de3e4a57ebe0 841 int cmd = 0;
jejuho 0:de3e4a57ebe0 842 int baddr = 0;
jejuho 0:de3e4a57ebe0 843
jejuho 0:de3e4a57ebe0 844 baddr = _getbaddr(address);
jejuho 0:de3e4a57ebe0 845
jejuho 0:de3e4a57ebe0 846 _busy();
jejuho 0:de3e4a57ebe0 847
jejuho 0:de3e4a57ebe0 848 _select();
jejuho 0:de3e4a57ebe0 849
jejuho 0:de3e4a57ebe0 850 if (buffer == 1)
jejuho 0:de3e4a57ebe0 851 {cmd = 0x84;}
jejuho 0:de3e4a57ebe0 852 else
jejuho 0:de3e4a57ebe0 853 {cmd = 0x87;}
jejuho 0:de3e4a57ebe0 854
jejuho 0:de3e4a57ebe0 855 _spi.write(cmd);
jejuho 0:de3e4a57ebe0 856 _sendaddr (baddr);
jejuho 0:de3e4a57ebe0 857 _spi.write (data);
jejuho 0:de3e4a57ebe0 858
jejuho 0:de3e4a57ebe0 859 _deselect();
jejuho 0:de3e4a57ebe0 860 }
jejuho 0:de3e4a57ebe0 861
jejuho 0:de3e4a57ebe0 862 // Read from an SRAM buffer
jejuho 0:de3e4a57ebe0 863 // Note : We create buffer and page addresses in _sram and _flash
jejuho 0:de3e4a57ebe0 864 int AT45::_sramread(int buffer, int address)
jejuho 0:de3e4a57ebe0 865 {
jejuho 0:de3e4a57ebe0 866
jejuho 0:de3e4a57ebe0 867 int cmd = 0;
jejuho 0:de3e4a57ebe0 868 int baddr = 0;
jejuho 0:de3e4a57ebe0 869 int bufdata = 0;
jejuho 0:de3e4a57ebe0 870
jejuho 0:de3e4a57ebe0 871 baddr = _getbaddr(address);
jejuho 0:de3e4a57ebe0 872
jejuho 0:de3e4a57ebe0 873 _select();
jejuho 0:de3e4a57ebe0 874
jejuho 0:de3e4a57ebe0 875 if(buffer == 1)
jejuho 0:de3e4a57ebe0 876 {cmd = 0xd4;}
jejuho 0:de3e4a57ebe0 877 else
jejuho 0:de3e4a57ebe0 878 {cmd = 0xd6;}
jejuho 0:de3e4a57ebe0 879
jejuho 0:de3e4a57ebe0 880 _spi.write(cmd);
jejuho 0:de3e4a57ebe0 881 _sendaddr (baddr);
jejuho 0:de3e4a57ebe0 882 _spi.write (0x0); // dont care byte
jejuho 0:de3e4a57ebe0 883 bufdata = _spi.write (0x0);
jejuho 0:de3e4a57ebe0 884
jejuho 0:de3e4a57ebe0 885 _deselect();
jejuho 0:de3e4a57ebe0 886
jejuho 0:de3e4a57ebe0 887 return (bufdata);
jejuho 0:de3e4a57ebe0 888 }
jejuho 0:de3e4a57ebe0 889
jejuho 0:de3e4a57ebe0 890 // Write and SRAM buffer to main memory
jejuho 0:de3e4a57ebe0 891 void AT45::_flashwrite (int buffer, int address)
jejuho 0:de3e4a57ebe0 892 {
jejuho 0:de3e4a57ebe0 893
jejuho 0:de3e4a57ebe0 894 int cmd = 0;
jejuho 0:de3e4a57ebe0 895 int paddr = _getpaddr(address);
jejuho 0:de3e4a57ebe0 896
jejuho 0:de3e4a57ebe0 897 _busy(); // Check flash is not busy
jejuho 0:de3e4a57ebe0 898
jejuho 0:de3e4a57ebe0 899 _select();
jejuho 0:de3e4a57ebe0 900
jejuho 0:de3e4a57ebe0 901 if (buffer == 1)
jejuho 0:de3e4a57ebe0 902 {cmd = 0x83;}
jejuho 0:de3e4a57ebe0 903 else
jejuho 0:de3e4a57ebe0 904 {cmd = 0x86;}
jejuho 0:de3e4a57ebe0 905
jejuho 0:de3e4a57ebe0 906 _spi.write (cmd);
jejuho 0:de3e4a57ebe0 907 _sendaddr (paddr);
jejuho 0:de3e4a57ebe0 908 _deselect();
jejuho 0:de3e4a57ebe0 909
jejuho 0:de3e4a57ebe0 910 _busy(); // Check flash is not busy
jejuho 0:de3e4a57ebe0 911 }
jejuho 0:de3e4a57ebe0 912
jejuho 0:de3e4a57ebe0 913 // Read from Flash memory into SRAM buffer
jejuho 0:de3e4a57ebe0 914 void AT45::_flashread (int buffer, int address)
jejuho 0:de3e4a57ebe0 915 {
jejuho 0:de3e4a57ebe0 916
jejuho 0:de3e4a57ebe0 917 int cmd = 0;
jejuho 0:de3e4a57ebe0 918 int paddr = _getpaddr(address); // calculate page address
jejuho 0:de3e4a57ebe0 919
jejuho 0:de3e4a57ebe0 920 _busy(); // Check flash is not busy
jejuho 0:de3e4a57ebe0 921 _select();
jejuho 0:de3e4a57ebe0 922
jejuho 0:de3e4a57ebe0 923 if (buffer == 1)
jejuho 0:de3e4a57ebe0 924 {cmd = 0x53;}
jejuho 0:de3e4a57ebe0 925 else
jejuho 0:de3e4a57ebe0 926 {cmd = 0x55;}
jejuho 0:de3e4a57ebe0 927
jejuho 0:de3e4a57ebe0 928 _spi.write (cmd);
jejuho 0:de3e4a57ebe0 929 _sendaddr (paddr);
jejuho 0:de3e4a57ebe0 930 _deselect();
jejuho 0:de3e4a57ebe0 931 }
jejuho 0:de3e4a57ebe0 932
jejuho 0:de3e4a57ebe0 933 // Read directly from main memory
jejuho 0:de3e4a57ebe0 934 int AT45::_memread (int address)
jejuho 0:de3e4a57ebe0 935 {
jejuho 0:de3e4a57ebe0 936
jejuho 0:de3e4a57ebe0 937 int data = 0;
jejuho 0:de3e4a57ebe0 938 int addr;
jejuho 0:de3e4a57ebe0 939
jejuho 0:de3e4a57ebe0 940 addr = _getpaddr(address) | _getbaddr(address);
jejuho 0:de3e4a57ebe0 941
jejuho 0:de3e4a57ebe0 942 _busy();
jejuho 0:de3e4a57ebe0 943
jejuho 0:de3e4a57ebe0 944 _select();
jejuho 0:de3e4a57ebe0 945
jejuho 0:de3e4a57ebe0 946 _spi.write (0xd2); // Direct read command
jejuho 0:de3e4a57ebe0 947 _sendaddr (addr);
jejuho 0:de3e4a57ebe0 948
jejuho 0:de3e4a57ebe0 949 // 4 dont care bytes
jejuho 0:de3e4a57ebe0 950 _spi.write (0x00);
jejuho 0:de3e4a57ebe0 951 _spi.write (0x00);
jejuho 0:de3e4a57ebe0 952 _spi.write (0x00);
jejuho 0:de3e4a57ebe0 953 _spi.write (0x00);
jejuho 0:de3e4a57ebe0 954
jejuho 0:de3e4a57ebe0 955 // this one clocks the data
jejuho 0:de3e4a57ebe0 956 data = _spi.write (0x00);
jejuho 0:de3e4a57ebe0 957 _deselect();
jejuho 0:de3e4a57ebe0 958
jejuho 0:de3e4a57ebe0 959 _busy();
jejuho 0:de3e4a57ebe0 960
jejuho 0:de3e4a57ebe0 961 return data;
jejuho 0:de3e4a57ebe0 962 }
jejuho 0:de3e4a57ebe0 963
jejuho 0:de3e4a57ebe0 964 // Work out the page address
jejuho 0:de3e4a57ebe0 965 // If we have a 2^N page size, it is just the top N bits
jejuho 0:de3e4a57ebe0 966 // If we have non-2^N, we use the shifted address
jejuho 0:de3e4a57ebe0 967 int AT45::_getpaddr(int address)
jejuho 0:de3e4a57ebe0 968 {
jejuho 0:de3e4a57ebe0 969
jejuho 0:de3e4a57ebe0 970 int paddr;
jejuho 0:de3e4a57ebe0 971
jejuho 0:de3e4a57ebe0 972 if (_pagesize == 256) {
jejuho 0:de3e4a57ebe0 973 paddr = address & 0xffffff00;}
jejuho 0:de3e4a57ebe0 974 else if (_pagesize == 264) {
jejuho 0:de3e4a57ebe0 975 paddr = (address << 1) & 0xfffffe00;}
jejuho 0:de3e4a57ebe0 976 else if (_pagesize == 512) {
jejuho 0:de3e4a57ebe0 977 paddr = address & 0xfffffe00;}
jejuho 0:de3e4a57ebe0 978 else if (_pagesize == 528 ) {
jejuho 0:de3e4a57ebe0 979 paddr = (address << 1) & 0xfffffc00;}
jejuho 0:de3e4a57ebe0 980 else if (_pagesize == 1024) {
jejuho 0:de3e4a57ebe0 981 paddr = address & 0xfffffc00;}
jejuho 0:de3e4a57ebe0 982 else if (_pagesize == 1056 ) {
jejuho 0:de3e4a57ebe0 983 paddr = (address << 1) & 0xfffff800;}
jejuho 0:de3e4a57ebe0 984 else {
jejuho 0:de3e4a57ebe0 985 paddr = -1;}
jejuho 0:de3e4a57ebe0 986
jejuho 0:de3e4a57ebe0 987 return (paddr);
jejuho 0:de3e4a57ebe0 988 }
jejuho 0:de3e4a57ebe0 989
jejuho 0:de3e4a57ebe0 990 // Clean the buffer address. This is the 8/9/10 LSBs
jejuho 0:de3e4a57ebe0 991 int AT45::_getbaddr(int address)
jejuho 0:de3e4a57ebe0 992 {
jejuho 0:de3e4a57ebe0 993
jejuho 0:de3e4a57ebe0 994 int baddr;
jejuho 0:de3e4a57ebe0 995
jejuho 0:de3e4a57ebe0 996 if ((_pagesize == 256) || (_pagesize == 264 )) {
jejuho 0:de3e4a57ebe0 997 baddr = address & 0xff;}
jejuho 0:de3e4a57ebe0 998 else if ((_pagesize == 512) || (_pagesize == 528 )) {
jejuho 0:de3e4a57ebe0 999 baddr = address & 0x1ff;}
jejuho 0:de3e4a57ebe0 1000 else if ((_pagesize == 1024) || (_pagesize == 1056 )) {
jejuho 0:de3e4a57ebe0 1001 baddr = address & 0x3ff;}
jejuho 0:de3e4a57ebe0 1002 else {
jejuho 0:de3e4a57ebe0 1003 baddr = -1;}
jejuho 0:de3e4a57ebe0 1004
jejuho 0:de3e4a57ebe0 1005 return (baddr);
jejuho 0:de3e4a57ebe0 1006 }
jejuho 0:de3e4a57ebe0 1007
jejuho 0:de3e4a57ebe0 1008 // Sends the three lest significant bytes of the supplied address
jejuho 0:de3e4a57ebe0 1009 void AT45::_sendaddr (int address)
jejuho 0:de3e4a57ebe0 1010 {
jejuho 0:de3e4a57ebe0 1011 _spi.write(address >> 16);
jejuho 0:de3e4a57ebe0 1012 _spi.write(address >> 8);
jejuho 0:de3e4a57ebe0 1013 _spi.write(address);
jejuho 0:de3e4a57ebe0 1014 }