Serial flash memory, binary access
Dependents: S25FL216K_USBFileSystem SPItest S25FL216K_USBFileSystem S25FL216K_FATFileSystem
S25FL216K.cpp@0:3cb41d985302, 2013-07-20 (annotated)
- 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?
User | Revision | Line number | New 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 | } |