Serial flash memory, binary access

Dependents:   S25FL216K_USBFileSystem SPItest S25FL216K_USBFileSystem S25FL216K_FATFileSystem

Committer:
Sissors
Date:
Wed Jul 31 19:17:11 2013 +0000
Revision:
1:2bcefc9e64f8
Parent:
0:3cb41d985302
v1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Sissors 0:3cb41d985302 1 #include "S25FL216K.h"
Sissors 0:3cb41d985302 2
Sissors 0:3cb41d985302 3 S25FL216K::S25FL216K(PinName mosi, PinName miso, PinName sclk, PinName cs):_spi(mosi, miso, sclk), _cs(cs) {
Sissors 0:3cb41d985302 4 _spi.format(8,3);
Sissors 0:3cb41d985302 5 _cs=1;
Sissors 0:3cb41d985302 6 }
Sissors 0:3cb41d985302 7
Sissors 0:3cb41d985302 8 bool S25FL216K::testConnection( void ) {
Sissors 0:3cb41d985302 9 _cs=0;
Sissors 0:3cb41d985302 10 _spi.write(S25FL216K_JEDEC);
Sissors 0:3cb41d985302 11 wait_us(10);
Sissors 0:3cb41d985302 12
Sissors 0:3cb41d985302 13 char manID = _spi.write(0x00);
Sissors 0:3cb41d985302 14 char memType = _spi.write(0x00);
Sissors 0:3cb41d985302 15 char memCap = _spi.write(0x00);
Sissors 0:3cb41d985302 16
Sissors 0:3cb41d985302 17 _cs=1;
Sissors 0:3cb41d985302 18
Sissors 0:3cb41d985302 19 //We only check memType/Cap:
Sissors 0:3cb41d985302 20
Sissors 0:3cb41d985302 21 if ((memType == 0x40) && (memCap == 0x15))
Sissors 0:3cb41d985302 22 return true;
Sissors 0:3cb41d985302 23 else
Sissors 0:3cb41d985302 24 return false;
Sissors 0:3cb41d985302 25 }
Sissors 0:3cb41d985302 26
Sissors 0:3cb41d985302 27 void S25FL216K::read(int address, char *buffer, int length) {
Sissors 0:3cb41d985302 28 _cs=0;
Sissors 0:3cb41d985302 29 _spi.write(S25FL216K_READ);
Sissors 0:3cb41d985302 30 _spi.write(address>>16);
Sissors 0:3cb41d985302 31 _spi.write(address>>8);
Sissors 0:3cb41d985302 32 _spi.write(address);
Sissors 0:3cb41d985302 33 for (int i = 0; i<length; i++)
Sissors 0:3cb41d985302 34 buffer[i]=_spi.write(0x00);
Sissors 0:3cb41d985302 35
Sissors 0:3cb41d985302 36 _cs=1;
Sissors 0:3cb41d985302 37 }
Sissors 0:3cb41d985302 38
Sissors 0:3cb41d985302 39 void S25FL216K::write(int address, char *buffer, int length, bool block) {
Sissors 0:3cb41d985302 40 setWriteEnable();
Sissors 0:3cb41d985302 41 _cs=0;
Sissors 0:3cb41d985302 42 _spi.write(S25FL216K_WRITE);
Sissors 0:3cb41d985302 43 _spi.write(address>>16);
Sissors 0:3cb41d985302 44 _spi.write(address>>8);
Sissors 0:3cb41d985302 45 _spi.write(address);
Sissors 0:3cb41d985302 46
Sissors 0:3cb41d985302 47 for (int i = 0; i<length; i++)
Sissors 0:3cb41d985302 48 _spi.write(buffer[i]);
Sissors 0:3cb41d985302 49
Sissors 0:3cb41d985302 50 _cs=1;
Sissors 0:3cb41d985302 51
Sissors 0:3cb41d985302 52 if (block)
Sissors 0:3cb41d985302 53 while(isBusy());
Sissors 0:3cb41d985302 54 }
Sissors 0:3cb41d985302 55
Sissors 0:3cb41d985302 56 void S25FL216K::eraseSector(int address, bool block) {
Sissors 0:3cb41d985302 57 setWriteEnable();
Sissors 0:3cb41d985302 58 _cs=0;
Sissors 0:3cb41d985302 59 _spi.write(S25FL216K_SECTOR_ERASE);
Sissors 0:3cb41d985302 60 _spi.write(address>>16);
Sissors 0:3cb41d985302 61 _spi.write(address>>8);
Sissors 0:3cb41d985302 62 _spi.write(address);
Sissors 0:3cb41d985302 63
Sissors 0:3cb41d985302 64 _cs=1;
Sissors 0:3cb41d985302 65
Sissors 0:3cb41d985302 66 if (block)
Sissors 0:3cb41d985302 67 while(isBusy());
Sissors 0:3cb41d985302 68 }
Sissors 0:3cb41d985302 69
Sissors 0:3cb41d985302 70 void S25FL216K::eraseBlock(int address, bool block) {
Sissors 0:3cb41d985302 71 setWriteEnable();
Sissors 0:3cb41d985302 72 _cs=0;
Sissors 0:3cb41d985302 73 _spi.write(S25FL216K_BLOCK_ERASE);
Sissors 0:3cb41d985302 74 _spi.write(address>>16);
Sissors 0:3cb41d985302 75 _spi.write(address>>8);
Sissors 0:3cb41d985302 76 _spi.write(address);
Sissors 0:3cb41d985302 77
Sissors 0:3cb41d985302 78 _cs=1;
Sissors 0:3cb41d985302 79
Sissors 0:3cb41d985302 80 if (block)
Sissors 0:3cb41d985302 81 while(isBusy());
Sissors 0:3cb41d985302 82 }
Sissors 0:3cb41d985302 83
Sissors 0:3cb41d985302 84 void S25FL216K::eraseChip(bool block) {
Sissors 0:3cb41d985302 85 setWriteEnable();
Sissors 0:3cb41d985302 86 _cs=0;
Sissors 0:3cb41d985302 87 _spi.write(S25FL216K_CHIP_ERASE);
Sissors 0:3cb41d985302 88
Sissors 0:3cb41d985302 89 _cs=1;
Sissors 0:3cb41d985302 90
Sissors 0:3cb41d985302 91 if (block)
Sissors 0:3cb41d985302 92 while(isBusy());
Sissors 0:3cb41d985302 93 }
Sissors 0:3cb41d985302 94
Sissors 0:3cb41d985302 95 void S25FL216K::setWriteEnable( void ) {
Sissors 0:3cb41d985302 96 _cs=0;
Sissors 0:3cb41d985302 97 _spi.write(S25FL216K_WREN);
Sissors 0:3cb41d985302 98 _cs=1;
Sissors 0:3cb41d985302 99 }
Sissors 0:3cb41d985302 100
Sissors 0:3cb41d985302 101 char S25FL216K::getStatus( void ) {
Sissors 0:3cb41d985302 102 _cs=0;
Sissors 0:3cb41d985302 103 _spi.write(S25FL216K_RDSR);
Sissors 0:3cb41d985302 104
Sissors 0:3cb41d985302 105 char retval = _spi.write(0);
Sissors 0:3cb41d985302 106 _cs=1;
Sissors 0:3cb41d985302 107 return retval;
Sissors 0:3cb41d985302 108 }
Sissors 0:3cb41d985302 109
Sissors 0:3cb41d985302 110 bool S25FL216K::isBusy( void ) {
Sissors 0:3cb41d985302 111 char retval = getStatus();
Sissors 0:3cb41d985302 112 retval = retval & 0x01;
Sissors 0:3cb41d985302 113 return retval;
Sissors 0:3cb41d985302 114 }