Driver for SST 64Mbit flash (8Mbyte) model 25VF064C including higher level methods for rewrite and buffered read/write to help optimize I/O. Can also work with other 25 series flash and eeprom devices, requiring minor revisions for their capabilities.
SST25VF064C.h@1:bf7d00887342, 2012-04-10 (annotated)
- Committer:
- davervw
- Date:
- Tue Apr 10 07:34:10 2012 +0000
- Revision:
- 1:bf7d00887342
- Parent:
- 0:332d4b991d16
- Child:
- 2:33d8a5ea4a80
moved sector_buffer from public interface to private
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
davervw | 0:332d4b991d16 | 1 | /////////////////////////////////////////////////////////////////////////////// |
davervw | 0:332d4b991d16 | 2 | // SST25VF064C.cpp - EEPROM driver |
davervw | 0:332d4b991d16 | 3 | // |
davervw | 0:332d4b991d16 | 4 | // COPYRIGHT (c) 2012 by David Van Wagner |
davervw | 0:332d4b991d16 | 5 | // |
davervw | 0:332d4b991d16 | 6 | // dave@vanwagner.org |
davervw | 0:332d4b991d16 | 7 | // http://techwithdave.blogspot.com |
davervw | 0:332d4b991d16 | 8 | // |
davervw | 0:332d4b991d16 | 9 | // License: Creative Commons Attribution-ShareAlike 3.0 Unported License |
davervw | 0:332d4b991d16 | 10 | // http://creativecommons.org/licenses/by-sa/3.0/ |
davervw | 0:332d4b991d16 | 11 | /////////////////////////////////////////////////////////////////////////////// |
davervw | 0:332d4b991d16 | 12 | |
davervw | 0:332d4b991d16 | 13 | #include <mbed.h> |
davervw | 0:332d4b991d16 | 14 | #ifdef SPIDEBUG |
davervw | 0:332d4b991d16 | 15 | #include "SPIDebug.h" |
davervw | 0:332d4b991d16 | 16 | extern bool debug; |
davervw | 0:332d4b991d16 | 17 | #endif |
davervw | 0:332d4b991d16 | 18 | |
davervw | 0:332d4b991d16 | 19 | class SST25VF064C |
davervw | 0:332d4b991d16 | 20 | { |
davervw | 0:332d4b991d16 | 21 | public: |
davervw | 0:332d4b991d16 | 22 | typedef char int8; |
davervw | 0:332d4b991d16 | 23 | typedef short int16; |
davervw | 0:332d4b991d16 | 24 | typedef long int32; |
davervw | 0:332d4b991d16 | 25 | typedef long long int64; |
davervw | 0:332d4b991d16 | 26 | |
davervw | 0:332d4b991d16 | 27 | typedef unsigned char uint8; |
davervw | 0:332d4b991d16 | 28 | typedef unsigned short uint16; |
davervw | 0:332d4b991d16 | 29 | typedef unsigned long uint32; |
davervw | 0:332d4b991d16 | 30 | typedef unsigned long long uint64; |
davervw | 0:332d4b991d16 | 31 | |
davervw | 0:332d4b991d16 | 32 | static const int SID_LEN = 32; |
davervw | 0:332d4b991d16 | 33 | static const int SECTOR_LEN = 4096; |
davervw | 0:332d4b991d16 | 34 | static const int PAGE_LEN = 256; |
davervw | 0:332d4b991d16 | 35 | static const int MAX_ADDR = 0x7FFFFF; |
davervw | 0:332d4b991d16 | 36 | |
davervw | 0:332d4b991d16 | 37 | private: |
davervw | 0:332d4b991d16 | 38 | #ifdef SPIDEBUG |
davervw | 0:332d4b991d16 | 39 | SPIDebug* spi; |
davervw | 0:332d4b991d16 | 40 | CSDebug* cs; |
davervw | 0:332d4b991d16 | 41 | #else |
davervw | 0:332d4b991d16 | 42 | SPI* spi; |
davervw | 0:332d4b991d16 | 43 | DigitalOut* cs; |
davervw | 0:332d4b991d16 | 44 | #endif |
davervw | 0:332d4b991d16 | 45 | int frequency; |
davervw | 0:332d4b991d16 | 46 | |
davervw | 0:332d4b991d16 | 47 | static uint8 SID_buffer[SID_LEN]; |
davervw | 1:bf7d00887342 | 48 | static uint8 sector_buffer[SECTOR_LEN]; |
davervw | 0:332d4b991d16 | 49 | static int32 buffered_addr; |
davervw | 0:332d4b991d16 | 50 | static bool buffered_erased; |
davervw | 0:332d4b991d16 | 51 | |
davervw | 0:332d4b991d16 | 52 | public: |
davervw | 0:332d4b991d16 | 53 | SST25VF064C(PinName mosi, PinName miso, PinName sclk, PinName cs, int frequency=10000000); |
davervw | 0:332d4b991d16 | 54 | ~SST25VF064C(); |
davervw | 0:332d4b991d16 | 55 | |
davervw | 0:332d4b991d16 | 56 | uint16 Id(); |
davervw | 0:332d4b991d16 | 57 | uint32 JEDECId(); |
davervw | 0:332d4b991d16 | 58 | uint8* SID(); // Security ID (128 bits = 16 bytes) |
davervw | 0:332d4b991d16 | 59 | |
davervw | 0:332d4b991d16 | 60 | // Read Status Register |
davervw | 0:332d4b991d16 | 61 | // bit 0 BUSY 1=Write in progress |
davervw | 0:332d4b991d16 | 62 | // bit 1 WEL 1=Write Enabled |
davervw | 0:332d4b991d16 | 63 | // bit 2 BP0 block write protection |
davervw | 0:332d4b991d16 | 64 | // bit 3 BP1 block write protection |
davervw | 0:332d4b991d16 | 65 | // bit 4 BP2 block write protection |
davervw | 0:332d4b991d16 | 66 | // bit 5 BP3 block write protection |
davervw | 0:332d4b991d16 | 67 | // bit 6 SEC 1=Security ID space locked |
davervw | 0:332d4b991d16 | 68 | // bit 7 BPL 1=BP0..BP3 are read-only, 0=r/w |
davervw | 0:332d4b991d16 | 69 | uint8 RDSR(); |
davervw | 0:332d4b991d16 | 70 | void EWSR(); // Enable Write Status Register |
davervw | 0:332d4b991d16 | 71 | void WRSR(uint8 status); // Write Status Register |
davervw | 0:332d4b991d16 | 72 | |
davervw | 0:332d4b991d16 | 73 | void WREN(); // Write Enable |
davervw | 0:332d4b991d16 | 74 | void WRDI(); // Write Disable |
davervw | 0:332d4b991d16 | 75 | bool BUSY(); // Write in Progress |
davervw | 0:332d4b991d16 | 76 | bool WEL(); // Write Enabled |
davervw | 0:332d4b991d16 | 77 | uint8 BP(); // Block Protection |
davervw | 0:332d4b991d16 | 78 | bool SEC(); // Security ID Locked |
davervw | 0:332d4b991d16 | 79 | bool BPL(); // Block Protection Locked |
davervw | 0:332d4b991d16 | 80 | void wait_while_busy(); |
davervw | 0:332d4b991d16 | 81 | |
davervw | 0:332d4b991d16 | 82 | uint8 read(int32 addr); |
davervw | 0:332d4b991d16 | 83 | bool read(int32 addr, uint8* dst, int32 len); |
davervw | 0:332d4b991d16 | 84 | void hsread(int32 addr, uint8* dst, int32 len, int frequency); |
davervw | 0:332d4b991d16 | 85 | |
davervw | 0:332d4b991d16 | 86 | void sector_erase_4k(int32 addr); |
davervw | 0:332d4b991d16 | 87 | void block_erase_32k(int32 addr); |
davervw | 0:332d4b991d16 | 88 | void block_erase_64k(int32 addr); |
davervw | 0:332d4b991d16 | 89 | void chip_erase(); |
davervw | 0:332d4b991d16 | 90 | |
davervw | 0:332d4b991d16 | 91 | bool page_program(int32 addr, uint8* write_buffer, short len); |
davervw | 0:332d4b991d16 | 92 | bool write(int32 addr, uint8* write_buffer, int32 len); |
davervw | 0:332d4b991d16 | 93 | bool rewrite(int32 addr, uint8* write_buffer, int32 len); |
davervw | 0:332d4b991d16 | 94 | |
davervw | 0:332d4b991d16 | 95 | bool buffered_write(uint8 data); |
davervw | 0:332d4b991d16 | 96 | bool buffered_write(uint8* src, int len); |
davervw | 0:332d4b991d16 | 97 | uint8 buffered_read(); |
davervw | 0:332d4b991d16 | 98 | bool buffered_read(uint8* dest, int len); |
davervw | 0:332d4b991d16 | 99 | void buffered_seek(int32 addr); |
davervw | 0:332d4b991d16 | 100 | void buffered_sync(); |
davervw | 0:332d4b991d16 | 101 | }; |