The "enable write status" command has to be sent before "write status" command to unlock memory area.

Dependencies:   mbed

Fork of SST25VF by Pierre Emmibed

Committer:
timucinanuslu
Date:
Sun Dec 28 23:48:29 2014 +0000
Revision:
1:533050c756e0
Parent:
0:1633dfa4b768
send "enable write status" before "write status" sending

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();
timucinanuslu 1:533050c756e0 48 _spi.write(EWSR);
timucinanuslu 1:533050c756e0 49 deselect();
timucinanuslu 1:533050c756e0 50
timucinanuslu 1:533050c756e0 51 select();
emmibed 0:1633dfa4b768 52 _spi.write(WRITE_STATUS);
emmibed 0:1633dfa4b768 53 _spi.write(0);
emmibed 0:1633dfa4b768 54 deselect();
emmibed 0:1633dfa4b768 55 waitShort();
emmibed 0:1633dfa4b768 56 }
emmibed 0:1633dfa4b768 57
emmibed 0:1633dfa4b768 58 void SST25VF::writeStatus(char status) {
emmibed 0:1633dfa4b768 59 select();
emmibed 0:1633dfa4b768 60 _spi.write(WRITE_STATUS);
emmibed 0:1633dfa4b768 61 _spi.write(status);
emmibed 0:1633dfa4b768 62 deselect();
emmibed 0:1633dfa4b768 63 waitShort();
emmibed 0:1633dfa4b768 64 }
emmibed 0:1633dfa4b768 65
emmibed 0:1633dfa4b768 66 char SST25VF::readStatus() {
emmibed 0:1633dfa4b768 67 select();
emmibed 0:1633dfa4b768 68 _spi.write(READ_STATUS);
emmibed 0:1633dfa4b768 69 char result = (char) _spi.write(0);
emmibed 0:1633dfa4b768 70 deselect();
emmibed 0:1633dfa4b768 71 return result;
emmibed 0:1633dfa4b768 72 }
emmibed 0:1633dfa4b768 73
emmibed 0:1633dfa4b768 74 void SST25VF::prepareCommand(char command, long int address) {
emmibed 0:1633dfa4b768 75 select();
emmibed 0:1633dfa4b768 76 _spi.write(command);
emmibed 0:1633dfa4b768 77 _spi.write((address & 0xFFFFFF) >> 16);
emmibed 0:1633dfa4b768 78 _spi.write((address & 0xFFFF)>> 8);
emmibed 0:1633dfa4b768 79 _spi.write(address & 0xFF);
emmibed 0:1633dfa4b768 80 }
emmibed 0:1633dfa4b768 81
emmibed 0:1633dfa4b768 82 // write or read a single byte
emmibed 0:1633dfa4b768 83
emmibed 0:1633dfa4b768 84 void SST25VF::write(long int address, char byte) {
emmibed 0:1633dfa4b768 85 wren();
emmibed 0:1633dfa4b768 86 prepareCommand(WRITE, address);
emmibed 0:1633dfa4b768 87 _spi.write(byte);
emmibed 0:1633dfa4b768 88 deselect();
emmibed 0:1633dfa4b768 89 waitShort();
emmibed 0:1633dfa4b768 90 }
emmibed 0:1633dfa4b768 91
emmibed 0:1633dfa4b768 92 char SST25VF::read(long int address) {
emmibed 0:1633dfa4b768 93 prepareCommand(READ, address);
emmibed 0:1633dfa4b768 94 int result = _spi.write(0);
emmibed 0:1633dfa4b768 95 deselect();
emmibed 0:1633dfa4b768 96 return (char) result;
emmibed 0:1633dfa4b768 97 }
emmibed 0:1633dfa4b768 98
emmibed 0:1633dfa4b768 99 // continuous write and read
emmibed 0:1633dfa4b768 100
emmibed 0:1633dfa4b768 101 void SST25VF::write(long int address, char * buffer, int count) {
emmibed 0:1633dfa4b768 102 wren();
emmibed 0:1633dfa4b768 103 // write frist two bytes
emmibed 0:1633dfa4b768 104 for (int i = 0; i < count-1; i=i+2) {
emmibed 0:1633dfa4b768 105 if (i==0) {
emmibed 0:1633dfa4b768 106 prepareCommand(AAIWRITE, address);
emmibed 0:1633dfa4b768 107 } else {
emmibed 0:1633dfa4b768 108 select();
emmibed 0:1633dfa4b768 109 _spi.write(AAIWRITE);
emmibed 0:1633dfa4b768 110 }
emmibed 0:1633dfa4b768 111 _spi.write(buffer[i]);
emmibed 0:1633dfa4b768 112 _spi.write(buffer[i+1]);
emmibed 0:1633dfa4b768 113 deselect();
emmibed 0:1633dfa4b768 114 waitShort();
emmibed 0:1633dfa4b768 115 }
emmibed 0:1633dfa4b768 116 if ((count % 2) == 1) { // odd number of bytes
emmibed 0:1633dfa4b768 117 select();
emmibed 0:1633dfa4b768 118 _spi.write(AAIWRITE);
emmibed 0:1633dfa4b768 119 _spi.write(buffer[count-1]);
emmibed 0:1633dfa4b768 120 _spi.write(0); // odd number of bytes, so write dummy byte to flash
emmibed 0:1633dfa4b768 121 deselect();
emmibed 0:1633dfa4b768 122 waitShort();
emmibed 0:1633dfa4b768 123 }
emmibed 0:1633dfa4b768 124 wrdi();
emmibed 0:1633dfa4b768 125 waitShort();
emmibed 0:1633dfa4b768 126 }
emmibed 0:1633dfa4b768 127
emmibed 0:1633dfa4b768 128 void SST25VF::read(long int address, char * buffer, int count) {
emmibed 0:1633dfa4b768 129 prepareCommand(READ, address);
emmibed 0:1633dfa4b768 130 // _spi.write(0); // dummy cycle, only necessary if READ is replaced by HSREAD
emmibed 0:1633dfa4b768 131 for (int i = 0; i < count; i++) {
emmibed 0:1633dfa4b768 132 buffer[i] = _spi.write(0);
emmibed 0:1633dfa4b768 133 }
emmibed 0:1633dfa4b768 134 deselect();
emmibed 0:1633dfa4b768 135 }