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

Dependents:   11u35_usbLocalFilesystem

Fork of W25X40BV by Johnny Yam

Committer:
k4zuki
Date:
Sun Feb 28 15:22:40 2016 +0000
Revision:
4:b422cdc9d751
Parent:
3:6e3c0b23dc6e
Child:
5:4f7e8756d1c4
use SWSPI library; typedef; add page and block(4K/32K) erase

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();
jyam 1:cd41b8e3fdad 59 wait(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();
jyam 1:cd41b8e3fdad 71 wait(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();
jyam 1:cd41b8e3fdad 85 writeDisable();
jyam 1:cd41b8e3fdad 86 wait(WAIT_TIME);
jyam 1:cd41b8e3fdad 87 }
jyam 1:cd41b8e3fdad 88
jyam 1:cd41b8e3fdad 89 //ERASING
k4zuki 4:b422cdc9d751 90 void W25X40BV::pageErase(uint8_t page){
k4zuki 4:b422cdc9d751 91 writeEnable();
k4zuki 4:b422cdc9d751 92 chipEnable();
k4zuki 4:b422cdc9d751 93 this->write(C_ERASE_INST);
k4zuki 4:b422cdc9d751 94 this->write(DUMMY_ADDR);
k4zuki 4:b422cdc9d751 95 this->write((int)page);
k4zuki 4:b422cdc9d751 96 this->write(DUMMY_ADDR);
k4zuki 4:b422cdc9d751 97 chipDisable();
k4zuki 4:b422cdc9d751 98 writeDisable();
k4zuki 4:b422cdc9d751 99 wait(WAIT_TIME);
k4zuki 4:b422cdc9d751 100 }
k4zuki 4:b422cdc9d751 101
k4zuki 4:b422cdc9d751 102 void W25X40BV::block4Erase(uint16_t block){
k4zuki 4:b422cdc9d751 103 uint8_t msb = (uint8_t)(block >> 4);
k4zuki 4:b422cdc9d751 104 block = (block << 4) & 0xF0;
k4zuki 4:b422cdc9d751 105 writeEnable();
k4zuki 4:b422cdc9d751 106 chipEnable();
k4zuki 4:b422cdc9d751 107 this->write(B4K_ERASE_INST);
k4zuki 4:b422cdc9d751 108 this->write((int)msb);
k4zuki 4:b422cdc9d751 109 this->write((int)block);
k4zuki 4:b422cdc9d751 110 this->write(DUMMY_ADDR);
k4zuki 4:b422cdc9d751 111 chipDisable();
k4zuki 4:b422cdc9d751 112 writeDisable();
k4zuki 4:b422cdc9d751 113 wait(WAIT_TIME);
k4zuki 4:b422cdc9d751 114 }
k4zuki 4:b422cdc9d751 115
k4zuki 4:b422cdc9d751 116 void W25X40BV::block32Erase(uint8_t block){
k4zuki 4:b422cdc9d751 117 block = (block << 3) & 0x18;
k4zuki 4:b422cdc9d751 118 writeEnable();
k4zuki 4:b422cdc9d751 119 chipEnable();
k4zuki 4:b422cdc9d751 120 this->write(B32K_ERASE_INST);
k4zuki 4:b422cdc9d751 121 this->write((int)block);
k4zuki 4:b422cdc9d751 122 this->write(DUMMY_ADDR);
k4zuki 4:b422cdc9d751 123 this->write(DUMMY_ADDR);
k4zuki 4:b422cdc9d751 124 chipDisable();
k4zuki 4:b422cdc9d751 125 writeDisable();
k4zuki 4:b422cdc9d751 126 wait(WAIT_TIME);
k4zuki 4:b422cdc9d751 127 }
k4zuki 4:b422cdc9d751 128
jyam 1:cd41b8e3fdad 129 void W25X40BV::chipErase() {
jyam 1:cd41b8e3fdad 130 writeEnable();
jyam 1:cd41b8e3fdad 131 chipEnable();
jyam 3:6e3c0b23dc6e 132 this->write(C_ERASE_INST);
jyam 1:cd41b8e3fdad 133 chipDisable();
jyam 1:cd41b8e3fdad 134 writeDisable();
jyam 1:cd41b8e3fdad 135 wait(WAIT_TIME);
jyam 1:cd41b8e3fdad 136 }
jyam 1:cd41b8e3fdad 137
jyam 1:cd41b8e3fdad 138
jyam 1:cd41b8e3fdad 139 //ENABLE/DISABLE (private functions)
jyam 1:cd41b8e3fdad 140 void W25X40BV::writeEnable() {
jyam 1:cd41b8e3fdad 141 chipEnable();
jyam 3:6e3c0b23dc6e 142 this->write(WE_INST);
jyam 1:cd41b8e3fdad 143 chipDisable();
jyam 1:cd41b8e3fdad 144 }
jyam 1:cd41b8e3fdad 145 void W25X40BV::writeDisable() {
jyam 1:cd41b8e3fdad 146 chipEnable();
jyam 3:6e3c0b23dc6e 147 this->write(WD_INST);
jyam 1:cd41b8e3fdad 148 chipDisable();
jyam 1:cd41b8e3fdad 149 }
jyam 1:cd41b8e3fdad 150 void W25X40BV::chipEnable() {
jyam 1:cd41b8e3fdad 151 _cs = 0;
jyam 1:cd41b8e3fdad 152 }
jyam 1:cd41b8e3fdad 153 void W25X40BV::chipDisable() {
jyam 1:cd41b8e3fdad 154 _cs = 1;
k4zuki 4:b422cdc9d751 155 }