Simple read/write API for the W25X40BV SPI Flash IC wiki: http://mbed.org/cookbook/W25X40BV
W25X40BV.cpp@1:cd41b8e3fdad, 2012-03-19 (annotated)
- Committer:
- jyam
- Date:
- Mon Mar 19 14:55:24 2012 +0000
- Revision:
- 1:cd41b8e3fdad
- Parent:
- 0:9de212faf980
- Child:
- 3:6e3c0b23dc6e
added sequential read and write
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 | 1:cd41b8e3fdad | 6 | W25X40BV::W25X40BV(PinName mosi, PinName miso, PinName sclk, PinName cs) : _spi(mosi, miso, sclk), _cs(cs) { |
jyam | 1:cd41b8e3fdad | 7 | _spi.format(SPI_NBIT, SPI_MODE); |
jyam | 1:cd41b8e3fdad | 8 | _spi.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 | 1:cd41b8e3fdad | 16 | _spi.write(R_INST); |
jyam | 1:cd41b8e3fdad | 17 | _spi.write((addr & ADDR_BMASK2) >> ADDR_BSHIFT2); |
jyam | 1:cd41b8e3fdad | 18 | _spi.write((addr & ADDR_BMASK1) >> ADDR_BSHIFT1); |
jyam | 1:cd41b8e3fdad | 19 | _spi.write((addr & ADDR_BMASK0) >> ADDR_BSHIFT0); |
jyam | 1:cd41b8e3fdad | 20 | int response = _spi.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 | 1:cd41b8e3fdad | 26 | _spi.write(R_INST); |
jyam | 1:cd41b8e3fdad | 27 | _spi.write(a2); |
jyam | 1:cd41b8e3fdad | 28 | _spi.write(a1); |
jyam | 1:cd41b8e3fdad | 29 | _spi.write(a0); |
jyam | 1:cd41b8e3fdad | 30 | int response = _spi.write(DUMMY_ADDR); |
jyam | 1:cd41b8e3fdad | 31 | chipDisable(); |
jyam | 1:cd41b8e3fdad | 32 | return response; |
jyam | 1:cd41b8e3fdad | 33 | } |
jyam | 1:cd41b8e3fdad | 34 | void W25X40BV::read(int addr, char* buf, int count) { |
jyam | 1:cd41b8e3fdad | 35 | if (count < 1) |
jyam | 1:cd41b8e3fdad | 36 | return; |
jyam | 1:cd41b8e3fdad | 37 | chipEnable(); |
jyam | 1:cd41b8e3fdad | 38 | _spi.write(R_INST); |
jyam | 1:cd41b8e3fdad | 39 | _spi.write((addr & ADDR_BMASK2) >> ADDR_BSHIFT2); |
jyam | 1:cd41b8e3fdad | 40 | _spi.write((addr & ADDR_BMASK1) >> ADDR_BSHIFT1); |
jyam | 1:cd41b8e3fdad | 41 | _spi.write((addr & ADDR_BMASK0) >> ADDR_BSHIFT0); |
jyam | 1:cd41b8e3fdad | 42 | for (int i = 0; i < count; i++) |
jyam | 1:cd41b8e3fdad | 43 | buf[i] = _spi.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 | 1:cd41b8e3fdad | 51 | _spi.write(W_INST); |
jyam | 1:cd41b8e3fdad | 52 | _spi.write((addr & ADDR_BMASK2) >> ADDR_BSHIFT2); |
jyam | 1:cd41b8e3fdad | 53 | _spi.write((addr & ADDR_BMASK1) >> ADDR_BSHIFT1); |
jyam | 1:cd41b8e3fdad | 54 | _spi.write((addr & ADDR_BMASK0) >> ADDR_BSHIFT0); |
jyam | 1:cd41b8e3fdad | 55 | _spi.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 | 1:cd41b8e3fdad | 63 | _spi.write(W_INST); |
jyam | 1:cd41b8e3fdad | 64 | _spi.write(a2); |
jyam | 1:cd41b8e3fdad | 65 | _spi.write(a1); |
jyam | 1:cd41b8e3fdad | 66 | _spi.write(a0); |
jyam | 1:cd41b8e3fdad | 67 | _spi.write(data); |
jyam | 1:cd41b8e3fdad | 68 | chipDisable(); |
jyam | 1:cd41b8e3fdad | 69 | writeDisable(); |
jyam | 1:cd41b8e3fdad | 70 | wait(WAIT_TIME); |
jyam | 1:cd41b8e3fdad | 71 | } |
jyam | 1:cd41b8e3fdad | 72 | void W25X40BV::write(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 | 1:cd41b8e3fdad | 77 | _spi.write(W_INST); |
jyam | 1:cd41b8e3fdad | 78 | _spi.write((addr & ADDR_BMASK2) >> ADDR_BSHIFT2); |
jyam | 1:cd41b8e3fdad | 79 | _spi.write((addr & ADDR_BMASK1) >> ADDR_BSHIFT1); |
jyam | 1:cd41b8e3fdad | 80 | _spi.write((addr & ADDR_BMASK0) >> ADDR_BSHIFT0); |
jyam | 1:cd41b8e3fdad | 81 | for (int i = 0; i < count; i++) |
jyam | 1:cd41b8e3fdad | 82 | _spi.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 | 1:cd41b8e3fdad | 92 | _spi.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 | 1:cd41b8e3fdad | 102 | _spi.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 | 1:cd41b8e3fdad | 107 | _spi.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 | } |