Simple read/write API for the W25X40BV SPI Flash IC wiki: http://mbed.org/cookbook/W25X40BV

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?

UserRevisionLine numberNew 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 }