Serial flash memory, binary access

Dependents:   S25FL216K_USBFileSystem SPItest S25FL216K_USBFileSystem S25FL216K_FATFileSystem

Committer:
Sissors
Date:
Sat Jul 20 12:03:38 2013 +0000
Revision:
0:3cb41d985302
Child:
1:2bcefc9e64f8
Basic functionality

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
Sissors 0:3cb41d985302 34 for (int i = 0; i<length; i++)
Sissors 0:3cb41d985302 35 buffer[i]=_spi.write(0x00);
Sissors 0:3cb41d985302 36
Sissors 0:3cb41d985302 37 _cs=1;
Sissors 0:3cb41d985302 38 }
Sissors 0:3cb41d985302 39
Sissors 0:3cb41d985302 40 void S25FL216K::write(int address, char *buffer, int length, bool block) {
Sissors 0:3cb41d985302 41 setWriteEnable();
Sissors 0:3cb41d985302 42 _cs=0;
Sissors 0:3cb41d985302 43 _spi.write(S25FL216K_WRITE);
Sissors 0:3cb41d985302 44 _spi.write(address>>16);
Sissors 0:3cb41d985302 45 _spi.write(address>>8);
Sissors 0:3cb41d985302 46 _spi.write(address);
Sissors 0:3cb41d985302 47
Sissors 0:3cb41d985302 48 for (int i = 0; i<length; i++)
Sissors 0:3cb41d985302 49 _spi.write(buffer[i]);
Sissors 0:3cb41d985302 50
Sissors 0:3cb41d985302 51 _cs=1;
Sissors 0:3cb41d985302 52
Sissors 0:3cb41d985302 53 if (block)
Sissors 0:3cb41d985302 54 while(isBusy());
Sissors 0:3cb41d985302 55 }
Sissors 0:3cb41d985302 56
Sissors 0:3cb41d985302 57 void S25FL216K::eraseSector(int address, bool block) {
Sissors 0:3cb41d985302 58 setWriteEnable();
Sissors 0:3cb41d985302 59 _cs=0;
Sissors 0:3cb41d985302 60 _spi.write(S25FL216K_SECTOR_ERASE);
Sissors 0:3cb41d985302 61 _spi.write(address>>16);
Sissors 0:3cb41d985302 62 _spi.write(address>>8);
Sissors 0:3cb41d985302 63 _spi.write(address);
Sissors 0:3cb41d985302 64
Sissors 0:3cb41d985302 65 _cs=1;
Sissors 0:3cb41d985302 66
Sissors 0:3cb41d985302 67 if (block)
Sissors 0:3cb41d985302 68 while(isBusy());
Sissors 0:3cb41d985302 69 }
Sissors 0:3cb41d985302 70
Sissors 0:3cb41d985302 71 void S25FL216K::eraseBlock(int address, bool block) {
Sissors 0:3cb41d985302 72 setWriteEnable();
Sissors 0:3cb41d985302 73 _cs=0;
Sissors 0:3cb41d985302 74 _spi.write(S25FL216K_BLOCK_ERASE);
Sissors 0:3cb41d985302 75 _spi.write(address>>16);
Sissors 0:3cb41d985302 76 _spi.write(address>>8);
Sissors 0:3cb41d985302 77 _spi.write(address);
Sissors 0:3cb41d985302 78
Sissors 0:3cb41d985302 79 _cs=1;
Sissors 0:3cb41d985302 80
Sissors 0:3cb41d985302 81 if (block)
Sissors 0:3cb41d985302 82 while(isBusy());
Sissors 0:3cb41d985302 83 }
Sissors 0:3cb41d985302 84
Sissors 0:3cb41d985302 85 void S25FL216K::eraseChip(bool block) {
Sissors 0:3cb41d985302 86 setWriteEnable();
Sissors 0:3cb41d985302 87 _cs=0;
Sissors 0:3cb41d985302 88 _spi.write(S25FL216K_CHIP_ERASE);
Sissors 0:3cb41d985302 89
Sissors 0:3cb41d985302 90 _cs=1;
Sissors 0:3cb41d985302 91
Sissors 0:3cb41d985302 92 if (block)
Sissors 0:3cb41d985302 93 while(isBusy());
Sissors 0:3cb41d985302 94 }
Sissors 0:3cb41d985302 95
Sissors 0:3cb41d985302 96 void S25FL216K::setWriteEnable( void ) {
Sissors 0:3cb41d985302 97 _cs=0;
Sissors 0:3cb41d985302 98 _spi.write(S25FL216K_WREN);
Sissors 0:3cb41d985302 99 _cs=1;
Sissors 0:3cb41d985302 100 }
Sissors 0:3cb41d985302 101
Sissors 0:3cb41d985302 102 char S25FL216K::getStatus( void ) {
Sissors 0:3cb41d985302 103 _cs=0;
Sissors 0:3cb41d985302 104 _spi.write(S25FL216K_RDSR);
Sissors 0:3cb41d985302 105
Sissors 0:3cb41d985302 106 char retval = _spi.write(0);
Sissors 0:3cb41d985302 107 _cs=1;
Sissors 0:3cb41d985302 108 return retval;
Sissors 0:3cb41d985302 109 }
Sissors 0:3cb41d985302 110
Sissors 0:3cb41d985302 111 bool S25FL216K::isBusy( void ) {
Sissors 0:3cb41d985302 112 char retval = getStatus();
Sissors 0:3cb41d985302 113 retval = retval & 0x01;
Sissors 0:3cb41d985302 114 return retval;
Sissors 0:3cb41d985302 115 }