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

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?

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