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.

Dependencies:   SPIDebug

Committer:
davervw
Date:
Thu Apr 12 14:16:37 2012 +0000
Revision:
2:33d8a5ea4a80
Parent:
1:bf7d00887342
Cosmetic change. Changing "eeprom" to "flash" for accuracy.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
davervw 0:332d4b991d16 1 ///////////////////////////////////////////////////////////////////////////////
davervw 2:33d8a5ea4a80 2 // SST25VF064C.cpp - Flash 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 };