[ FORK ] SPI flash memory control library forked from jyam/W25X40BV
Dependents: 11u35_usbLocalFilesystem
Fork of W25X40BV by
W25X40BV.cpp@8:f14f239ae400, 2016-08-12 (annotated)
- 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?
User | Revision | Line number | New 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 | } |