[ FORK ] SPI flash memory control library forked from jyam/W25X40BV

Dependents:   11u35_usbLocalFilesystem

Fork of W25X40BV by Johnny Yam

Committer:
k4zuki
Date:
Fri Aug 12 06:35:57 2016 +0000
Revision:
8:f14f239ae400
Parent:
7:0811e70f6fc7
change WAIT_TIME

Who changed what in which revision?

UserRevisionLine numberNew contents of line
k4zuki 4:b422cdc9d751 1 /** W25X40BV.cpp
k4zuki 4:b422cdc9d751 2 */
k4zuki 4:b422cdc9d751 3 #include "W25X40BV.h"
k4zuki 4:b422cdc9d751 4 #include "SWSPI.h"
jyam 1:cd41b8e3fdad 5
k4zuki 4:b422cdc9d751 6 //! CONSTRUCTOR
k4zuki 4:b422cdc9d751 7 W25X40BV::W25X40BV(PinName mosi, PinName miso, PinName sclk, PinName cs) : SWSPI(mosi, miso, sclk), _cs(cs) {
jyam 3:6e3c0b23dc6e 8 this->format(SPI_NBIT, SPI_MODE);
jyam 3:6e3c0b23dc6e 9 this->frequency(SPI_FREQ);
jyam 1:cd41b8e3fdad 10 chipDisable();
jyam 1:cd41b8e3fdad 11 }
jyam 1:cd41b8e3fdad 12
jyam 1:cd41b8e3fdad 13
k4zuki 4:b422cdc9d751 14 //! READING
k4zuki 4:b422cdc9d751 15 uint32_t W25X40BV::readByte(uint32_t addr) {
jyam 1:cd41b8e3fdad 16 chipEnable();
jyam 3:6e3c0b23dc6e 17 this->write(R_INST);
jyam 3:6e3c0b23dc6e 18 this->write((addr & ADDR_BMASK2) >> ADDR_BSHIFT2);
jyam 3:6e3c0b23dc6e 19 this->write((addr & ADDR_BMASK1) >> ADDR_BSHIFT1);
jyam 3:6e3c0b23dc6e 20 this->write((addr & ADDR_BMASK0) >> ADDR_BSHIFT0);
k4zuki 4:b422cdc9d751 21 uint32_t response = this->write(DUMMY_ADDR);
jyam 1:cd41b8e3fdad 22 chipDisable();
jyam 1:cd41b8e3fdad 23 return response;
jyam 1:cd41b8e3fdad 24 }
k4zuki 4:b422cdc9d751 25 uint32_t W25X40BV::readByte(uint32_t a2, uint32_t a1, uint32_t a0) {
jyam 1:cd41b8e3fdad 26 chipEnable();
jyam 3:6e3c0b23dc6e 27 this->write(R_INST);
jyam 3:6e3c0b23dc6e 28 this->write(a2);
jyam 3:6e3c0b23dc6e 29 this->write(a1);
jyam 3:6e3c0b23dc6e 30 this->write(a0);
k4zuki 4:b422cdc9d751 31 uint32_t response = this->write(DUMMY_ADDR);
jyam 1:cd41b8e3fdad 32 chipDisable();
jyam 1:cd41b8e3fdad 33 return response;
jyam 1:cd41b8e3fdad 34 }
k4zuki 4:b422cdc9d751 35 void W25X40BV::readStream(uint32_t addr, uint8_t* buf, uint32_t count) {
jyam 1:cd41b8e3fdad 36 if (count < 1)
jyam 1:cd41b8e3fdad 37 return;
jyam 1:cd41b8e3fdad 38 chipEnable();
jyam 3:6e3c0b23dc6e 39 this->write(R_INST);
jyam 3:6e3c0b23dc6e 40 this->write((addr & ADDR_BMASK2) >> ADDR_BSHIFT2);
jyam 3:6e3c0b23dc6e 41 this->write((addr & ADDR_BMASK1) >> ADDR_BSHIFT1);
jyam 3:6e3c0b23dc6e 42 this->write((addr & ADDR_BMASK0) >> ADDR_BSHIFT0);
k4zuki 4:b422cdc9d751 43 for (uint32_t i = 0; i < count; i++)
jyam 3:6e3c0b23dc6e 44 buf[i] = this->write(DUMMY_ADDR);
jyam 1:cd41b8e3fdad 45 chipDisable();
jyam 1:cd41b8e3fdad 46 }
jyam 1:cd41b8e3fdad 47
jyam 1:cd41b8e3fdad 48 // WRITING
k4zuki 4:b422cdc9d751 49 void W25X40BV::writeByte(uint32_t addr, uint32_t data) {
jyam 1:cd41b8e3fdad 50 writeEnable();
jyam 1:cd41b8e3fdad 51 chipEnable();
jyam 3:6e3c0b23dc6e 52 this->write(W_INST);
jyam 3:6e3c0b23dc6e 53 this->write((addr & ADDR_BMASK2) >> ADDR_BSHIFT2);
jyam 3:6e3c0b23dc6e 54 this->write((addr & ADDR_BMASK1) >> ADDR_BSHIFT1);
jyam 3:6e3c0b23dc6e 55 this->write((addr & ADDR_BMASK0) >> ADDR_BSHIFT0);
jyam 3:6e3c0b23dc6e 56 this->write(data);
jyam 1:cd41b8e3fdad 57 chipDisable();
jyam 1:cd41b8e3fdad 58 writeDisable();
k4zuki 5:4f7e8756d1c4 59 wait_us(10*WAIT_TIME);
jyam 1:cd41b8e3fdad 60 }
k4zuki 4:b422cdc9d751 61 void W25X40BV::writeByte(uint32_t a2, uint32_t a1, uint32_t a0, uint32_t data) {
jyam 1:cd41b8e3fdad 62 writeEnable();
jyam 1:cd41b8e3fdad 63 chipEnable();
jyam 3:6e3c0b23dc6e 64 this->write(W_INST);
jyam 3:6e3c0b23dc6e 65 this->write(a2);
jyam 3:6e3c0b23dc6e 66 this->write(a1);
jyam 3:6e3c0b23dc6e 67 this->write(a0);
jyam 3:6e3c0b23dc6e 68 this->write(data);
jyam 1:cd41b8e3fdad 69 chipDisable();
jyam 1:cd41b8e3fdad 70 writeDisable();
k4zuki 5:4f7e8756d1c4 71 wait_us(10*WAIT_TIME);
jyam 1:cd41b8e3fdad 72 }
k4zuki 4:b422cdc9d751 73 void W25X40BV::writeStream(uint32_t addr, uint8_t* buf, uint32_t count) {
jyam 1:cd41b8e3fdad 74 if (count < 1)
jyam 1:cd41b8e3fdad 75 return;
jyam 1:cd41b8e3fdad 76 writeEnable();
jyam 1:cd41b8e3fdad 77 chipEnable();
jyam 3:6e3c0b23dc6e 78 this->write(W_INST);
jyam 3:6e3c0b23dc6e 79 this->write((addr & ADDR_BMASK2) >> ADDR_BSHIFT2);
jyam 3:6e3c0b23dc6e 80 this->write((addr & ADDR_BMASK1) >> ADDR_BSHIFT1);
jyam 3:6e3c0b23dc6e 81 this->write((addr & ADDR_BMASK0) >> ADDR_BSHIFT0);
k4zuki 4:b422cdc9d751 82 for (uint32_t i = 0; i < count; i++)
jyam 3:6e3c0b23dc6e 83 this->write(buf[i]);
jyam 1:cd41b8e3fdad 84 chipDisable();
k4zuki 7:0811e70f6fc7 85 wait_ms(10*WAIT_TIME);
jyam 1:cd41b8e3fdad 86 writeDisable();
jyam 1:cd41b8e3fdad 87 }
jyam 1:cd41b8e3fdad 88
jyam 1:cd41b8e3fdad 89 //ERASING
k4zuki 6:11e271d4fbc5 90 void W25X40BV::pageErase(uint16_t page){
k4zuki 6:11e271d4fbc5 91 int msb = page>>8;
k4zuki 4:b422cdc9d751 92 writeEnable();
k4zuki 4:b422cdc9d751 93 chipEnable();
k4zuki 6:11e271d4fbc5 94 this->write(P_ERASE_INST);
k4zuki 6:11e271d4fbc5 95 this->write(msb);
k4zuki 4:b422cdc9d751 96 this->write((int)page);
k4zuki 4:b422cdc9d751 97 this->write(DUMMY_ADDR);
k4zuki 4:b422cdc9d751 98 chipDisable();
k4zuki 4:b422cdc9d751 99 writeDisable();
k4zuki 5:4f7e8756d1c4 100 wait_ms(50*WAIT_TIME);
k4zuki 4:b422cdc9d751 101 }
k4zuki 4:b422cdc9d751 102
k4zuki 4:b422cdc9d751 103 void W25X40BV::block4Erase(uint16_t block){
k4zuki 4:b422cdc9d751 104 uint8_t msb = (uint8_t)(block >> 4);
k4zuki 4:b422cdc9d751 105 block = (block << 4) & 0xF0;
k4zuki 4:b422cdc9d751 106 writeEnable();
k4zuki 4:b422cdc9d751 107 chipEnable();
k4zuki 4:b422cdc9d751 108 this->write(B4K_ERASE_INST);
k4zuki 4:b422cdc9d751 109 this->write((int)msb);
k4zuki 4:b422cdc9d751 110 this->write((int)block);
k4zuki 4:b422cdc9d751 111 this->write(DUMMY_ADDR);
k4zuki 4:b422cdc9d751 112 chipDisable();
k4zuki 4:b422cdc9d751 113 writeDisable();
k4zuki 5:4f7e8756d1c4 114 wait_ms(100*WAIT_TIME);
k4zuki 4:b422cdc9d751 115 }
k4zuki 4:b422cdc9d751 116
k4zuki 4:b422cdc9d751 117 void W25X40BV::block32Erase(uint8_t block){
k4zuki 4:b422cdc9d751 118 block = (block << 3) & 0x18;
k4zuki 4:b422cdc9d751 119 writeEnable();
k4zuki 4:b422cdc9d751 120 chipEnable();
k4zuki 4:b422cdc9d751 121 this->write(B32K_ERASE_INST);
k4zuki 4:b422cdc9d751 122 this->write((int)block);
k4zuki 4:b422cdc9d751 123 this->write(DUMMY_ADDR);
k4zuki 4:b422cdc9d751 124 this->write(DUMMY_ADDR);
k4zuki 4:b422cdc9d751 125 chipDisable();
k4zuki 4:b422cdc9d751 126 writeDisable();
k4zuki 4:b422cdc9d751 127 wait(WAIT_TIME);
k4zuki 4:b422cdc9d751 128 }
k4zuki 4:b422cdc9d751 129
jyam 1:cd41b8e3fdad 130 void W25X40BV::chipErase() {
jyam 1:cd41b8e3fdad 131 writeEnable();
jyam 1:cd41b8e3fdad 132 chipEnable();
jyam 3:6e3c0b23dc6e 133 this->write(C_ERASE_INST);
jyam 1:cd41b8e3fdad 134 chipDisable();
jyam 1:cd41b8e3fdad 135 writeDisable();
k4zuki 5:4f7e8756d1c4 136 wait(3*WAIT_TIME);
jyam 1:cd41b8e3fdad 137 }
jyam 1:cd41b8e3fdad 138
jyam 1:cd41b8e3fdad 139
jyam 1:cd41b8e3fdad 140 //ENABLE/DISABLE (private functions)
jyam 1:cd41b8e3fdad 141 void W25X40BV::writeEnable() {
jyam 1:cd41b8e3fdad 142 chipEnable();
jyam 3:6e3c0b23dc6e 143 this->write(WE_INST);
jyam 1:cd41b8e3fdad 144 chipDisable();
jyam 1:cd41b8e3fdad 145 }
jyam 1:cd41b8e3fdad 146 void W25X40BV::writeDisable() {
jyam 1:cd41b8e3fdad 147 chipEnable();
jyam 3:6e3c0b23dc6e 148 this->write(WD_INST);
jyam 1:cd41b8e3fdad 149 chipDisable();
jyam 1:cd41b8e3fdad 150 }
jyam 1:cd41b8e3fdad 151 void W25X40BV::chipEnable() {
k4zuki 7:0811e70f6fc7 152 _cs.output();
jyam 1:cd41b8e3fdad 153 _cs = 0;
jyam 1:cd41b8e3fdad 154 }
jyam 1:cd41b8e3fdad 155 void W25X40BV::chipDisable() {
jyam 1:cd41b8e3fdad 156 _cs = 1;
k4zuki 7:0811e70f6fc7 157 _cs.input();
k4zuki 7:0811e70f6fc7 158 _cs.mode(PullNone);
k4zuki 4:b422cdc9d751 159 }