-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathwinbondflash.h
More file actions
112 lines (88 loc) · 2.61 KB
/
winbondflash.h
File metadata and controls
112 lines (88 loc) · 2.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/*
Winbond spi flash memory chip operating library for Arduino
by WarMonkey (luoshumymail@gmail.com)
for more information, please visit bbs.kechuang.org
latest version available on http://code.google.com/p/winbondflash
*/
#ifndef _WINBONDFLASH_H__
#define _WINBONDFLASH_H__
#include <inttypes.h>
#include <SPI.h>
#define FLASH_PAGE_SIZE 256ul
//W25Q64 = 256_bytes_per_page * 16_pages_per_sector * 16_sectors_per_block * 128_blocks_per_chip
//= 256b*16*16*128 = 8Mbyte = 64MBits
#define _W25Q80 winbondFlashClass::W25Q80
#define _W25Q16 winbondFlashClass::W25Q16
#define _W25Q32 winbondFlashClass::W25Q32
#define _W25Q64 winbondFlashClass::W25Q64
#define _W25Q128 winbondFlashClass::W25Q128
class winbondFlashClass {
public:
enum partNumberType {
custom = -1,
autoDetect = 0,
W25Q80 = 1,
W25Q16 = 2,
W25Q32 = 4,
W25Q64 = 8,
W25Q128 = 16
};
bool begin(partNumberType _partno = autoDetect);
void end();
long bytes();
uint16_t pages();
uint16_t sectors();
uint16_t blocks();
uint16_t read(uint32_t addr,uint8_t *buf,uint16_t n=256);
void setWriteEnable(bool cmd = true);
inline void WE(bool cmd = true) {setWriteEnable(cmd);}
//WE() every time before write or erase
void writePage(uint32_t addr_start,uint8_t *buf);//addr is 8bit-aligned, 0x00ffff00
//write a page, sizeof(buf) is 256 bytes
void eraseSector(uint32_t addr);//addr is 12bit-aligned, 0x00fff000
//erase a sector ( 4096bytes ), return false if error
void erase32kBlock(uint32_t addr);//addr is 15bit-aligned, 0x00ff8000
//erase a 32k block ( 32768b )
void erase64kBlock(uint32_t addr);//addr is 16bit-aligned, 0x00ff0000
//erase a 64k block ( 65536b )
void eraseAll();
//chip erase, return true if successfully started, busy()==false -> erase complete
void eraseSuspend();
void eraseResume();
bool busy();
uint8_t readManufacturer();
uint16_t readPartID();
uint64_t readUniqueID();
uint16_t readSR();
private:
partNumberType partno;
bool checkPartNo(partNumberType _partno);
protected:
virtual void select() = 0;
virtual uint8_t transfer(uint8_t x) = 0;
virtual void transfer_addr(uint32_t addr);
virtual void deselect() = 0;
};
class winbondFlashSPI: public winbondFlashClass {
private:
uint8_t nss;
SPIClass spi;
inline void select() {
digitalWrite(nss,LOW);
}
inline void deselect() {
digitalWrite(nss,HIGH);
}
inline uint8_t transfer(uint8_t x) {
return spi.transfer(x);
}
void transfer_addr(uint32_t addr) {
spi.transfer(addr >> 16);
spi.transfer(addr >> 8);
spi.transfer(addr);
}
public:
bool begin(partNumberType _partno = autoDetect, SPIClass &_spi = SPI, uint8_t _nss = SS);
void end();
};
#endif