Serial flash memory, binary access
Dependents: S25FL216K_USBFileSystem SPItest S25FL216K_USBFileSystem S25FL216K_FATFileSystem
S25FL216K.cpp@1:2bcefc9e64f8, 2013-07-31 (annotated)
- 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?
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 | 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 | } |