Simple read/write API for the W25X40BV SPI Flash IC wiki: http://mbed.org/cookbook/W25X40BV
W25X40BV.cpp@3:6e3c0b23dc6e, 2012-03-26 (annotated)
- Committer:
- jyam
- Date:
- Mon Mar 26 04:30:32 2012 +0000
- Revision:
- 3:6e3c0b23dc6e
- Parent:
- 1:cd41b8e3fdad
now a derived class of SPI from \"mbedh.h\" (can access SPI\s public member functions; more flexible);
modified W25X40BV API read() to readStream() and write() to writeStream() to avoid overwriting SPI\s write() function (and it is now a more descriptive function name)
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jyam | 1:cd41b8e3fdad | 1 | // W25X40BV.cpp |
jyam | 1:cd41b8e3fdad | 2 | |
jyam | 1:cd41b8e3fdad | 3 | #include"W25X40BV.h" |
jyam | 1:cd41b8e3fdad | 4 | |
jyam | 1:cd41b8e3fdad | 5 | // CONSTRUCTOR |
jyam | 3:6e3c0b23dc6e | 6 | W25X40BV::W25X40BV(PinName mosi, PinName miso, PinName sclk, PinName cs) : SPI(mosi, miso, sclk), _cs(cs) { |
jyam | 3:6e3c0b23dc6e | 7 | this->format(SPI_NBIT, SPI_MODE); |
jyam | 3:6e3c0b23dc6e | 8 | this->frequency(SPI_FREQ); |
jyam | 1:cd41b8e3fdad | 9 | chipDisable(); |
jyam | 1:cd41b8e3fdad | 10 | } |
jyam | 1:cd41b8e3fdad | 11 | |
jyam | 1:cd41b8e3fdad | 12 | |
jyam | 1:cd41b8e3fdad | 13 | // READING |
jyam | 1:cd41b8e3fdad | 14 | int W25X40BV::readByte(int addr) { |
jyam | 1:cd41b8e3fdad | 15 | chipEnable(); |
jyam | 3:6e3c0b23dc6e | 16 | this->write(R_INST); |
jyam | 3:6e3c0b23dc6e | 17 | this->write((addr & ADDR_BMASK2) >> ADDR_BSHIFT2); |
jyam | 3:6e3c0b23dc6e | 18 | this->write((addr & ADDR_BMASK1) >> ADDR_BSHIFT1); |
jyam | 3:6e3c0b23dc6e | 19 | this->write((addr & ADDR_BMASK0) >> ADDR_BSHIFT0); |
jyam | 3:6e3c0b23dc6e | 20 | int response = this->write(DUMMY_ADDR); |
jyam | 1:cd41b8e3fdad | 21 | chipDisable(); |
jyam | 1:cd41b8e3fdad | 22 | return response; |
jyam | 1:cd41b8e3fdad | 23 | } |
jyam | 1:cd41b8e3fdad | 24 | int W25X40BV::readByte(int a2, int a1, int a0) { |
jyam | 1:cd41b8e3fdad | 25 | chipEnable(); |
jyam | 3:6e3c0b23dc6e | 26 | this->write(R_INST); |
jyam | 3:6e3c0b23dc6e | 27 | this->write(a2); |
jyam | 3:6e3c0b23dc6e | 28 | this->write(a1); |
jyam | 3:6e3c0b23dc6e | 29 | this->write(a0); |
jyam | 3:6e3c0b23dc6e | 30 | int response = this->write(DUMMY_ADDR); |
jyam | 1:cd41b8e3fdad | 31 | chipDisable(); |
jyam | 1:cd41b8e3fdad | 32 | return response; |
jyam | 1:cd41b8e3fdad | 33 | } |
jyam | 3:6e3c0b23dc6e | 34 | void W25X40BV::readStream(int addr, char* buf, int count) { |
jyam | 1:cd41b8e3fdad | 35 | if (count < 1) |
jyam | 1:cd41b8e3fdad | 36 | return; |
jyam | 1:cd41b8e3fdad | 37 | chipEnable(); |
jyam | 3:6e3c0b23dc6e | 38 | this->write(R_INST); |
jyam | 3:6e3c0b23dc6e | 39 | this->write((addr & ADDR_BMASK2) >> ADDR_BSHIFT2); |
jyam | 3:6e3c0b23dc6e | 40 | this->write((addr & ADDR_BMASK1) >> ADDR_BSHIFT1); |
jyam | 3:6e3c0b23dc6e | 41 | this->write((addr & ADDR_BMASK0) >> ADDR_BSHIFT0); |
jyam | 1:cd41b8e3fdad | 42 | for (int i = 0; i < count; i++) |
jyam | 3:6e3c0b23dc6e | 43 | buf[i] = this->write(DUMMY_ADDR); |
jyam | 1:cd41b8e3fdad | 44 | chipDisable(); |
jyam | 1:cd41b8e3fdad | 45 | } |
jyam | 1:cd41b8e3fdad | 46 | |
jyam | 1:cd41b8e3fdad | 47 | // WRITING |
jyam | 1:cd41b8e3fdad | 48 | void W25X40BV::writeByte(int addr, int data) { |
jyam | 1:cd41b8e3fdad | 49 | writeEnable(); |
jyam | 1:cd41b8e3fdad | 50 | chipEnable(); |
jyam | 3:6e3c0b23dc6e | 51 | this->write(W_INST); |
jyam | 3:6e3c0b23dc6e | 52 | this->write((addr & ADDR_BMASK2) >> ADDR_BSHIFT2); |
jyam | 3:6e3c0b23dc6e | 53 | this->write((addr & ADDR_BMASK1) >> ADDR_BSHIFT1); |
jyam | 3:6e3c0b23dc6e | 54 | this->write((addr & ADDR_BMASK0) >> ADDR_BSHIFT0); |
jyam | 3:6e3c0b23dc6e | 55 | this->write(data); |
jyam | 1:cd41b8e3fdad | 56 | chipDisable(); |
jyam | 1:cd41b8e3fdad | 57 | writeDisable(); |
jyam | 1:cd41b8e3fdad | 58 | wait(WAIT_TIME); |
jyam | 1:cd41b8e3fdad | 59 | } |
jyam | 1:cd41b8e3fdad | 60 | void W25X40BV::writeByte(int a2, int a1, int a0, int data) { |
jyam | 1:cd41b8e3fdad | 61 | writeEnable(); |
jyam | 1:cd41b8e3fdad | 62 | chipEnable(); |
jyam | 3:6e3c0b23dc6e | 63 | this->write(W_INST); |
jyam | 3:6e3c0b23dc6e | 64 | this->write(a2); |
jyam | 3:6e3c0b23dc6e | 65 | this->write(a1); |
jyam | 3:6e3c0b23dc6e | 66 | this->write(a0); |
jyam | 3:6e3c0b23dc6e | 67 | this->write(data); |
jyam | 1:cd41b8e3fdad | 68 | chipDisable(); |
jyam | 1:cd41b8e3fdad | 69 | writeDisable(); |
jyam | 1:cd41b8e3fdad | 70 | wait(WAIT_TIME); |
jyam | 1:cd41b8e3fdad | 71 | } |
jyam | 3:6e3c0b23dc6e | 72 | void W25X40BV::writeStream(int addr, char* buf, int count) { |
jyam | 1:cd41b8e3fdad | 73 | if (count < 1) |
jyam | 1:cd41b8e3fdad | 74 | return; |
jyam | 1:cd41b8e3fdad | 75 | writeEnable(); |
jyam | 1:cd41b8e3fdad | 76 | chipEnable(); |
jyam | 3:6e3c0b23dc6e | 77 | this->write(W_INST); |
jyam | 3:6e3c0b23dc6e | 78 | this->write((addr & ADDR_BMASK2) >> ADDR_BSHIFT2); |
jyam | 3:6e3c0b23dc6e | 79 | this->write((addr & ADDR_BMASK1) >> ADDR_BSHIFT1); |
jyam | 3:6e3c0b23dc6e | 80 | this->write((addr & ADDR_BMASK0) >> ADDR_BSHIFT0); |
jyam | 1:cd41b8e3fdad | 81 | for (int i = 0; i < count; i++) |
jyam | 3:6e3c0b23dc6e | 82 | this->write(buf[i]); |
jyam | 1:cd41b8e3fdad | 83 | chipDisable(); |
jyam | 1:cd41b8e3fdad | 84 | writeDisable(); |
jyam | 1:cd41b8e3fdad | 85 | wait(WAIT_TIME); |
jyam | 1:cd41b8e3fdad | 86 | } |
jyam | 1:cd41b8e3fdad | 87 | |
jyam | 1:cd41b8e3fdad | 88 | //ERASING |
jyam | 1:cd41b8e3fdad | 89 | void W25X40BV::chipErase() { |
jyam | 1:cd41b8e3fdad | 90 | writeEnable(); |
jyam | 1:cd41b8e3fdad | 91 | chipEnable(); |
jyam | 3:6e3c0b23dc6e | 92 | this->write(C_ERASE_INST); |
jyam | 1:cd41b8e3fdad | 93 | chipDisable(); |
jyam | 1:cd41b8e3fdad | 94 | writeDisable(); |
jyam | 1:cd41b8e3fdad | 95 | wait(WAIT_TIME); |
jyam | 1:cd41b8e3fdad | 96 | } |
jyam | 1:cd41b8e3fdad | 97 | |
jyam | 1:cd41b8e3fdad | 98 | |
jyam | 1:cd41b8e3fdad | 99 | //ENABLE/DISABLE (private functions) |
jyam | 1:cd41b8e3fdad | 100 | void W25X40BV::writeEnable() { |
jyam | 1:cd41b8e3fdad | 101 | chipEnable(); |
jyam | 3:6e3c0b23dc6e | 102 | this->write(WE_INST); |
jyam | 1:cd41b8e3fdad | 103 | chipDisable(); |
jyam | 1:cd41b8e3fdad | 104 | } |
jyam | 1:cd41b8e3fdad | 105 | void W25X40BV::writeDisable() { |
jyam | 1:cd41b8e3fdad | 106 | chipEnable(); |
jyam | 3:6e3c0b23dc6e | 107 | this->write(WD_INST); |
jyam | 1:cd41b8e3fdad | 108 | chipDisable(); |
jyam | 1:cd41b8e3fdad | 109 | } |
jyam | 1:cd41b8e3fdad | 110 | void W25X40BV::chipEnable() { |
jyam | 1:cd41b8e3fdad | 111 | _cs = 0; |
jyam | 1:cd41b8e3fdad | 112 | } |
jyam | 1:cd41b8e3fdad | 113 | void W25X40BV::chipDisable() { |
jyam | 1:cd41b8e3fdad | 114 | _cs = 1; |
jyam | 0:9de212faf980 | 115 | } |