Library for the SST25VF016B serial flash from Microchip (16Mbit Serial Flash).

Dependencies:   mbed

Committer:
emmibed
Date:
Sun Jan 15 13:51:16 2012 +0000
Revision:
0:1633dfa4b768

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
emmibed 0:1633dfa4b768 1 /* SST25VF - drive the Microchip SST25VF Serial Flash using SPI
emmibed 0:1633dfa4b768 2 */
emmibed 0:1633dfa4b768 3
emmibed 0:1633dfa4b768 4 #include "mbed.h"
emmibed 0:1633dfa4b768 5 #include "SST25VF.h"
emmibed 0:1633dfa4b768 6
emmibed 0:1633dfa4b768 7 SST25VF::SST25VF(SPI& spi, PinName ncs) : _spi(spi), _ncs(ncs) {
emmibed 0:1633dfa4b768 8
emmibed 0:1633dfa4b768 9 _spi.format(8,0);
emmibed 0:1633dfa4b768 10 _spi.frequency(SPI_FREQ);
emmibed 0:1633dfa4b768 11 deselect();
emmibed 0:1633dfa4b768 12 unlock();
emmibed 0:1633dfa4b768 13 chipErase();
emmibed 0:1633dfa4b768 14
emmibed 0:1633dfa4b768 15 }
emmibed 0:1633dfa4b768 16
emmibed 0:1633dfa4b768 17 void SST25VF::select() {
emmibed 0:1633dfa4b768 18 _ncs = 0;
emmibed 0:1633dfa4b768 19 }
emmibed 0:1633dfa4b768 20
emmibed 0:1633dfa4b768 21 void SST25VF::deselect() {
emmibed 0:1633dfa4b768 22 _ncs = 1;
emmibed 0:1633dfa4b768 23 }
emmibed 0:1633dfa4b768 24
emmibed 0:1633dfa4b768 25 void SST25VF::wren() {
emmibed 0:1633dfa4b768 26 select();
emmibed 0:1633dfa4b768 27 _spi.write(WREN);
emmibed 0:1633dfa4b768 28 deselect();
emmibed 0:1633dfa4b768 29 waitShort();
emmibed 0:1633dfa4b768 30 }
emmibed 0:1633dfa4b768 31
emmibed 0:1633dfa4b768 32 void SST25VF::wrdi() {
emmibed 0:1633dfa4b768 33 select();
emmibed 0:1633dfa4b768 34 _spi.write(WRDI);
emmibed 0:1633dfa4b768 35 deselect();
emmibed 0:1633dfa4b768 36 }
emmibed 0:1633dfa4b768 37
emmibed 0:1633dfa4b768 38 void SST25VF::chipErase() {
emmibed 0:1633dfa4b768 39 wren();
emmibed 0:1633dfa4b768 40 select();
emmibed 0:1633dfa4b768 41 _spi.write(CHIP_ERASE);
emmibed 0:1633dfa4b768 42 deselect();
emmibed 0:1633dfa4b768 43 waitErase();
emmibed 0:1633dfa4b768 44 }
emmibed 0:1633dfa4b768 45
emmibed 0:1633dfa4b768 46 void SST25VF::unlock() {
emmibed 0:1633dfa4b768 47 select();
emmibed 0:1633dfa4b768 48 _spi.write(WRITE_STATUS);
emmibed 0:1633dfa4b768 49 _spi.write(0);
emmibed 0:1633dfa4b768 50 deselect();
emmibed 0:1633dfa4b768 51 waitShort();
emmibed 0:1633dfa4b768 52 }
emmibed 0:1633dfa4b768 53
emmibed 0:1633dfa4b768 54 void SST25VF::writeStatus(char status) {
emmibed 0:1633dfa4b768 55 select();
emmibed 0:1633dfa4b768 56 _spi.write(WRITE_STATUS);
emmibed 0:1633dfa4b768 57 _spi.write(status);
emmibed 0:1633dfa4b768 58 deselect();
emmibed 0:1633dfa4b768 59 waitShort();
emmibed 0:1633dfa4b768 60 }
emmibed 0:1633dfa4b768 61
emmibed 0:1633dfa4b768 62 char SST25VF::readStatus() {
emmibed 0:1633dfa4b768 63 select();
emmibed 0:1633dfa4b768 64 _spi.write(READ_STATUS);
emmibed 0:1633dfa4b768 65 char result = (char) _spi.write(0);
emmibed 0:1633dfa4b768 66 deselect();
emmibed 0:1633dfa4b768 67 return result;
emmibed 0:1633dfa4b768 68 }
emmibed 0:1633dfa4b768 69
emmibed 0:1633dfa4b768 70 void SST25VF::prepareCommand(char command, long int address) {
emmibed 0:1633dfa4b768 71 select();
emmibed 0:1633dfa4b768 72 _spi.write(command);
emmibed 0:1633dfa4b768 73 _spi.write((address & 0xFFFFFF) >> 16);
emmibed 0:1633dfa4b768 74 _spi.write((address & 0xFFFF)>> 8);
emmibed 0:1633dfa4b768 75 _spi.write(address & 0xFF);
emmibed 0:1633dfa4b768 76 }
emmibed 0:1633dfa4b768 77
emmibed 0:1633dfa4b768 78 // write or read a single byte
emmibed 0:1633dfa4b768 79
emmibed 0:1633dfa4b768 80 void SST25VF::write(long int address, char byte) {
emmibed 0:1633dfa4b768 81 wren();
emmibed 0:1633dfa4b768 82 prepareCommand(WRITE, address);
emmibed 0:1633dfa4b768 83 _spi.write(byte);
emmibed 0:1633dfa4b768 84 deselect();
emmibed 0:1633dfa4b768 85 waitShort();
emmibed 0:1633dfa4b768 86 }
emmibed 0:1633dfa4b768 87
emmibed 0:1633dfa4b768 88 char SST25VF::read(long int address) {
emmibed 0:1633dfa4b768 89 prepareCommand(READ, address);
emmibed 0:1633dfa4b768 90 int result = _spi.write(0);
emmibed 0:1633dfa4b768 91 deselect();
emmibed 0:1633dfa4b768 92 return (char) result;
emmibed 0:1633dfa4b768 93 }
emmibed 0:1633dfa4b768 94
emmibed 0:1633dfa4b768 95 // continuous write and read
emmibed 0:1633dfa4b768 96
emmibed 0:1633dfa4b768 97 void SST25VF::write(long int address, char * buffer, int count) {
emmibed 0:1633dfa4b768 98 wren();
emmibed 0:1633dfa4b768 99 // write frist two bytes
emmibed 0:1633dfa4b768 100 for (int i = 0; i < count-1; i=i+2) {
emmibed 0:1633dfa4b768 101 if (i==0) {
emmibed 0:1633dfa4b768 102 prepareCommand(AAIWRITE, address);
emmibed 0:1633dfa4b768 103 } else {
emmibed 0:1633dfa4b768 104 select();
emmibed 0:1633dfa4b768 105 _spi.write(AAIWRITE);
emmibed 0:1633dfa4b768 106 }
emmibed 0:1633dfa4b768 107 _spi.write(buffer[i]);
emmibed 0:1633dfa4b768 108 _spi.write(buffer[i+1]);
emmibed 0:1633dfa4b768 109 deselect();
emmibed 0:1633dfa4b768 110 waitShort();
emmibed 0:1633dfa4b768 111 }
emmibed 0:1633dfa4b768 112 if ((count % 2) == 1) { // odd number of bytes
emmibed 0:1633dfa4b768 113 select();
emmibed 0:1633dfa4b768 114 _spi.write(AAIWRITE);
emmibed 0:1633dfa4b768 115 _spi.write(buffer[count-1]);
emmibed 0:1633dfa4b768 116 _spi.write(0); // odd number of bytes, so write dummy byte to flash
emmibed 0:1633dfa4b768 117 deselect();
emmibed 0:1633dfa4b768 118 waitShort();
emmibed 0:1633dfa4b768 119 }
emmibed 0:1633dfa4b768 120 wrdi();
emmibed 0:1633dfa4b768 121 waitShort();
emmibed 0:1633dfa4b768 122 }
emmibed 0:1633dfa4b768 123
emmibed 0:1633dfa4b768 124 void SST25VF::read(long int address, char * buffer, int count) {
emmibed 0:1633dfa4b768 125 prepareCommand(READ, address);
emmibed 0:1633dfa4b768 126 // _spi.write(0); // dummy cycle, only necessary if READ is replaced by HSREAD
emmibed 0:1633dfa4b768 127 for (int i = 0; i < count; i++) {
emmibed 0:1633dfa4b768 128 buffer[i] = _spi.write(0);
emmibed 0:1633dfa4b768 129 }
emmibed 0:1633dfa4b768 130 deselect();
emmibed 0:1633dfa4b768 131 }