Simple read/write API for the W25X40BV SPI Flash IC wiki: http://mbed.org/cookbook/W25X40BV
W25X40BV.cpp@0:9de212faf980, 2012-03-19 (annotated)
- Committer:
- jyam
- Date:
- Mon Mar 19 10:20:37 2012 +0000
- Revision:
- 0:9de212faf980
- Child:
- 1:cd41b8e3fdad
initial publish
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jyam | 0:9de212faf980 | 1 | // W25X40BV.cpp |
jyam | 0:9de212faf980 | 2 | |
jyam | 0:9de212faf980 | 3 | #include"W25X40BV.h" |
jyam | 0:9de212faf980 | 4 | |
jyam | 0:9de212faf980 | 5 | // CONSTRUCTOR |
jyam | 0:9de212faf980 | 6 | W25X40BV::W25X40BV(PinName mosi, PinName miso, PinName sclk, PinName cs) : _spi(mosi, miso, sclk), _cs(cs) { |
jyam | 0:9de212faf980 | 7 | _spi.format(SPI_NBIT, SPI_MODE); |
jyam | 0:9de212faf980 | 8 | _spi.frequency(SPI_FREQ); |
jyam | 0:9de212faf980 | 9 | chipDisable(); |
jyam | 0:9de212faf980 | 10 | } |
jyam | 0:9de212faf980 | 11 | |
jyam | 0:9de212faf980 | 12 | |
jyam | 0:9de212faf980 | 13 | // READING |
jyam | 0:9de212faf980 | 14 | int W25X40BV::read(int addr) { |
jyam | 0:9de212faf980 | 15 | chipEnable(); |
jyam | 0:9de212faf980 | 16 | _spi.write(R_INST); |
jyam | 0:9de212faf980 | 17 | _spi.write((addr & ADDR_BMASK2) >> ADDR_BSHIFT2); |
jyam | 0:9de212faf980 | 18 | _spi.write((addr & ADDR_BMASK1) >> ADDR_BSHIFT1); |
jyam | 0:9de212faf980 | 19 | _spi.write((addr & ADDR_BMASK0) >> ADDR_BSHIFT0); |
jyam | 0:9de212faf980 | 20 | int response = _spi.write(DUMMY_ADDR); |
jyam | 0:9de212faf980 | 21 | chipDisable(); |
jyam | 0:9de212faf980 | 22 | return response; |
jyam | 0:9de212faf980 | 23 | } |
jyam | 0:9de212faf980 | 24 | int W25X40BV::read(int a2, int a1, int a0) { |
jyam | 0:9de212faf980 | 25 | chipEnable(); |
jyam | 0:9de212faf980 | 26 | _spi.write(R_INST); |
jyam | 0:9de212faf980 | 27 | _spi.write(a2); |
jyam | 0:9de212faf980 | 28 | _spi.write(a1); |
jyam | 0:9de212faf980 | 29 | _spi.write(a0); |
jyam | 0:9de212faf980 | 30 | int response = _spi.write(DUMMY_ADDR); |
jyam | 0:9de212faf980 | 31 | chipDisable(); |
jyam | 0:9de212faf980 | 32 | return response; |
jyam | 0:9de212faf980 | 33 | } |
jyam | 0:9de212faf980 | 34 | |
jyam | 0:9de212faf980 | 35 | |
jyam | 0:9de212faf980 | 36 | // WRITING |
jyam | 0:9de212faf980 | 37 | void W25X40BV::write(int addr, int data) { |
jyam | 0:9de212faf980 | 38 | writeEnable(); |
jyam | 0:9de212faf980 | 39 | chipEnable(); |
jyam | 0:9de212faf980 | 40 | _spi.write(W_INST); |
jyam | 0:9de212faf980 | 41 | _spi.write((addr & ADDR_BMASK2) >> ADDR_BSHIFT2); |
jyam | 0:9de212faf980 | 42 | _spi.write((addr & ADDR_BMASK1) >> ADDR_BSHIFT1); |
jyam | 0:9de212faf980 | 43 | _spi.write((addr & ADDR_BMASK0) >> ADDR_BSHIFT0); |
jyam | 0:9de212faf980 | 44 | _spi.write(data); |
jyam | 0:9de212faf980 | 45 | chipDisable(); |
jyam | 0:9de212faf980 | 46 | writeDisable(); |
jyam | 0:9de212faf980 | 47 | wait(WAIT_TIME); |
jyam | 0:9de212faf980 | 48 | } |
jyam | 0:9de212faf980 | 49 | void W25X40BV::write(int a2, int a1, int a0, int data) { |
jyam | 0:9de212faf980 | 50 | writeEnable(); |
jyam | 0:9de212faf980 | 51 | chipEnable(); |
jyam | 0:9de212faf980 | 52 | _spi.write(W_INST); |
jyam | 0:9de212faf980 | 53 | _spi.write(a2); |
jyam | 0:9de212faf980 | 54 | _spi.write(a1); |
jyam | 0:9de212faf980 | 55 | _spi.write(a0); |
jyam | 0:9de212faf980 | 56 | _spi.write(data); |
jyam | 0:9de212faf980 | 57 | chipDisable(); |
jyam | 0:9de212faf980 | 58 | writeDisable(); |
jyam | 0:9de212faf980 | 59 | wait(WAIT_TIME); |
jyam | 0:9de212faf980 | 60 | } |
jyam | 0:9de212faf980 | 61 | |
jyam | 0:9de212faf980 | 62 | |
jyam | 0:9de212faf980 | 63 | //ERASING |
jyam | 0:9de212faf980 | 64 | void W25X40BV::chipErase() { |
jyam | 0:9de212faf980 | 65 | writeEnable(); |
jyam | 0:9de212faf980 | 66 | chipEnable(); |
jyam | 0:9de212faf980 | 67 | _spi.write(C_ERASE_INST); |
jyam | 0:9de212faf980 | 68 | chipDisable(); |
jyam | 0:9de212faf980 | 69 | writeDisable(); |
jyam | 0:9de212faf980 | 70 | wait(WAIT_TIME); |
jyam | 0:9de212faf980 | 71 | } |
jyam | 0:9de212faf980 | 72 | |
jyam | 0:9de212faf980 | 73 | |
jyam | 0:9de212faf980 | 74 | //ENABLE/DISABLE (private functions) |
jyam | 0:9de212faf980 | 75 | void W25X40BV::writeEnable() { |
jyam | 0:9de212faf980 | 76 | chipEnable(); |
jyam | 0:9de212faf980 | 77 | _spi.write(WE_INST); |
jyam | 0:9de212faf980 | 78 | chipDisable(); |
jyam | 0:9de212faf980 | 79 | } |
jyam | 0:9de212faf980 | 80 | void W25X40BV::writeDisable() { |
jyam | 0:9de212faf980 | 81 | chipEnable(); |
jyam | 0:9de212faf980 | 82 | _spi.write(WD_INST); |
jyam | 0:9de212faf980 | 83 | chipDisable(); |
jyam | 0:9de212faf980 | 84 | } |
jyam | 0:9de212faf980 | 85 | void W25X40BV::chipEnable() { |
jyam | 0:9de212faf980 | 86 | _cs = 0; |
jyam | 0:9de212faf980 | 87 | } |
jyam | 0:9de212faf980 | 88 | void W25X40BV::chipDisable() { |
jyam | 0:9de212faf980 | 89 | _cs = 1; |
jyam | 0:9de212faf980 | 90 | } |