Winbond W25Q80BV SPI library
W25Q80BV.cpp@3:efef6d4c6918, 2014-01-31 (annotated)
- Committer:
- perezalvarezhi
- Date:
- Fri Jan 31 00:24:52 2014 +0000
- Revision:
- 3:efef6d4c6918
- Parent:
- 2:e8dc659cf54e
publishing new library and deleting old falash library;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
perezalvarezhi | 0:6f374c3ed666 | 1 | // W25Q80BV.cpp |
perezalvarezhi | 0:6f374c3ed666 | 2 | //Changes by Ciprijal |
perezalvarezhi | 0:6f374c3ed666 | 3 | #include"W25Q80BV.h" |
perezalvarezhi | 0:6f374c3ed666 | 4 | |
perezalvarezhi | 0:6f374c3ed666 | 5 | // Pinout: PTD2,PTD3, PTD1, PTC7 |
perezalvarezhi | 0:6f374c3ed666 | 6 | // CONSTRUCTOR |
perezalvarezhi | 0:6f374c3ed666 | 7 | W25Q80BV::W25Q80BV(PinName mosi, PinName miso, PinName sclk, PinName cs):_cs(cs),_mosi(mosi),_miso(miso),_sclk(sclk){ |
perezalvarezhi | 0:6f374c3ed666 | 8 | |
perezalvarezhi | 0:6f374c3ed666 | 9 | } |
perezalvarezhi | 0:6f374c3ed666 | 10 | //Get ID |
perezalvarezhi | 0:6f374c3ed666 | 11 | int W25Q80BV::getMID( ){ |
perezalvarezhi | 0:6f374c3ed666 | 12 | int ID = 0; |
perezalvarezhi | 0:6f374c3ed666 | 13 | chipEnable(); |
perezalvarezhi | 2:e8dc659cf54e | 14 | this->writeSPI(DEV_ID ); |
perezalvarezhi | 0:6f374c3ed666 | 15 | this->writeSPI(DUMMY_ADDR); |
perezalvarezhi | 0:6f374c3ed666 | 16 | this->writeSPI(DUMMY_ADDR); |
perezalvarezhi | 0:6f374c3ed666 | 17 | this->writeSPI(DUMMY_ADDR); |
perezalvarezhi | 0:6f374c3ed666 | 18 | this->writeSPI(DUMMY_ADDR); |
perezalvarezhi | 0:6f374c3ed666 | 19 | ID = this->writeSPI(DUMMY_ADDR); |
perezalvarezhi | 0:6f374c3ed666 | 20 | chipDisable(); |
perezalvarezhi | 0:6f374c3ed666 | 21 | return ID; |
perezalvarezhi | 0:6f374c3ed666 | 22 | } |
perezalvarezhi | 0:6f374c3ed666 | 23 | |
perezalvarezhi | 0:6f374c3ed666 | 24 | |
perezalvarezhi | 0:6f374c3ed666 | 25 | // READING |
perezalvarezhi | 0:6f374c3ed666 | 26 | int W25Q80BV::readByte(int addr) { |
perezalvarezhi | 0:6f374c3ed666 | 27 | chipEnable(); |
perezalvarezhi | 2:e8dc659cf54e | 28 | this->writeSPI(READ_DATA); |
perezalvarezhi | 0:6f374c3ed666 | 29 | this->writeSPI((addr & ADDR_BMASK2) >> ADDR_BSHIFT2); |
perezalvarezhi | 0:6f374c3ed666 | 30 | this->writeSPI((addr & ADDR_BMASK1) >> ADDR_BSHIFT1); |
perezalvarezhi | 0:6f374c3ed666 | 31 | this->writeSPI((addr & ADDR_BMASK0) >> ADDR_BSHIFT0); |
perezalvarezhi | 0:6f374c3ed666 | 32 | int response = this->writeSPI(DUMMY_ADDR); |
perezalvarezhi | 0:6f374c3ed666 | 33 | chipDisable(); |
perezalvarezhi | 0:6f374c3ed666 | 34 | return response; |
perezalvarezhi | 0:6f374c3ed666 | 35 | } |
perezalvarezhi | 0:6f374c3ed666 | 36 | int W25Q80BV::readByte(int a2, int a1, int a0) { |
perezalvarezhi | 0:6f374c3ed666 | 37 | chipEnable(); |
perezalvarezhi | 2:e8dc659cf54e | 38 | this->writeSPI(READ_DATA); |
perezalvarezhi | 0:6f374c3ed666 | 39 | this->writeSPI(a2); |
perezalvarezhi | 0:6f374c3ed666 | 40 | this->writeSPI(a1); |
perezalvarezhi | 0:6f374c3ed666 | 41 | this->writeSPI(a0); |
perezalvarezhi | 0:6f374c3ed666 | 42 | int response = this->writeSPI(DUMMY_ADDR); |
perezalvarezhi | 0:6f374c3ed666 | 43 | chipDisable(); |
perezalvarezhi | 0:6f374c3ed666 | 44 | return response; |
perezalvarezhi | 0:6f374c3ed666 | 45 | } |
perezalvarezhi | 0:6f374c3ed666 | 46 | void W25Q80BV::readStream(int addr, char* buf, int count) { |
perezalvarezhi | 0:6f374c3ed666 | 47 | if (count < 1) |
perezalvarezhi | 0:6f374c3ed666 | 48 | return; |
perezalvarezhi | 0:6f374c3ed666 | 49 | chipEnable(); |
perezalvarezhi | 2:e8dc659cf54e | 50 | this->writeSPI(READ_DATA); |
perezalvarezhi | 0:6f374c3ed666 | 51 | this->writeSPI((addr & ADDR_BMASK2) >> ADDR_BSHIFT2); |
perezalvarezhi | 0:6f374c3ed666 | 52 | this->writeSPI((addr & ADDR_BMASK1) >> ADDR_BSHIFT1); |
perezalvarezhi | 0:6f374c3ed666 | 53 | this->writeSPI((addr & ADDR_BMASK0) >> ADDR_BSHIFT0); |
perezalvarezhi | 0:6f374c3ed666 | 54 | for (int i = 0; i < count; i++) |
perezalvarezhi | 0:6f374c3ed666 | 55 | buf[i] = this->writeSPI(DUMMY_ADDR); |
perezalvarezhi | 0:6f374c3ed666 | 56 | chipDisable(); |
perezalvarezhi | 0:6f374c3ed666 | 57 | } |
perezalvarezhi | 0:6f374c3ed666 | 58 | |
perezalvarezhi | 0:6f374c3ed666 | 59 | // WRITING |
perezalvarezhi | 0:6f374c3ed666 | 60 | void W25Q80BV::writeByte(int addr, int data) { |
perezalvarezhi | 0:6f374c3ed666 | 61 | writeEnable(); |
perezalvarezhi | 0:6f374c3ed666 | 62 | chipEnable(); |
perezalvarezhi | 2:e8dc659cf54e | 63 | this->writeSPI(WRITE_DATA); |
perezalvarezhi | 0:6f374c3ed666 | 64 | this->writeSPI((addr & ADDR_BMASK2) >> ADDR_BSHIFT2); |
perezalvarezhi | 0:6f374c3ed666 | 65 | this->writeSPI((addr & ADDR_BMASK1) >> ADDR_BSHIFT1); |
perezalvarezhi | 0:6f374c3ed666 | 66 | this->writeSPI((addr & ADDR_BMASK0) >> ADDR_BSHIFT0); |
perezalvarezhi | 0:6f374c3ed666 | 67 | this->writeSPI(data); |
perezalvarezhi | 0:6f374c3ed666 | 68 | chipDisable(); |
perezalvarezhi | 0:6f374c3ed666 | 69 | writeDisable(); |
perezalvarezhi | 2:e8dc659cf54e | 70 | wait(WAIT_TIME);//NO ESTOY SEGURO SI ASI HAY QUE ESPERAR |
perezalvarezhi | 0:6f374c3ed666 | 71 | } |
perezalvarezhi | 0:6f374c3ed666 | 72 | void W25Q80BV::writeByte(int a2, int a1, int a0, int data) { |
perezalvarezhi | 0:6f374c3ed666 | 73 | writeEnable(); |
perezalvarezhi | 0:6f374c3ed666 | 74 | chipEnable(); |
perezalvarezhi | 2:e8dc659cf54e | 75 | this->writeSPI(WRITE_DATA); |
perezalvarezhi | 0:6f374c3ed666 | 76 | this->writeSPI(a2); |
perezalvarezhi | 0:6f374c3ed666 | 77 | this->writeSPI(a1); |
perezalvarezhi | 0:6f374c3ed666 | 78 | this->writeSPI(a0); |
perezalvarezhi | 0:6f374c3ed666 | 79 | this->writeSPI(data); |
perezalvarezhi | 0:6f374c3ed666 | 80 | chipDisable(); |
perezalvarezhi | 0:6f374c3ed666 | 81 | writeDisable(); |
perezalvarezhi | 0:6f374c3ed666 | 82 | wait(WAIT_TIME); |
perezalvarezhi | 0:6f374c3ed666 | 83 | } |
perezalvarezhi | 0:6f374c3ed666 | 84 | void W25Q80BV::writeStream(int addr, char* buf, int count) { |
perezalvarezhi | 0:6f374c3ed666 | 85 | if (count < 1) |
perezalvarezhi | 0:6f374c3ed666 | 86 | return; |
perezalvarezhi | 0:6f374c3ed666 | 87 | writeEnable(); |
perezalvarezhi | 0:6f374c3ed666 | 88 | chipEnable(); |
perezalvarezhi | 2:e8dc659cf54e | 89 | this->writeSPI(WRITE_DATA); |
perezalvarezhi | 0:6f374c3ed666 | 90 | this->writeSPI((addr & ADDR_BMASK2) >> ADDR_BSHIFT2); |
perezalvarezhi | 0:6f374c3ed666 | 91 | this->writeSPI((addr & ADDR_BMASK1) >> ADDR_BSHIFT1); |
perezalvarezhi | 0:6f374c3ed666 | 92 | this->writeSPI((addr & ADDR_BMASK0) >> ADDR_BSHIFT0); |
perezalvarezhi | 0:6f374c3ed666 | 93 | for (int i = 0; i < count; i++) |
perezalvarezhi | 0:6f374c3ed666 | 94 | this->writeSPI(buf[i]); |
perezalvarezhi | 0:6f374c3ed666 | 95 | chipDisable(); |
perezalvarezhi | 0:6f374c3ed666 | 96 | writeDisable(); |
perezalvarezhi | 0:6f374c3ed666 | 97 | wait(WAIT_TIME); |
perezalvarezhi | 0:6f374c3ed666 | 98 | } |
perezalvarezhi | 0:6f374c3ed666 | 99 | |
perezalvarezhi | 0:6f374c3ed666 | 100 | //ERASING |
perezalvarezhi | 0:6f374c3ed666 | 101 | void W25Q80BV::chipErase() { |
perezalvarezhi | 0:6f374c3ed666 | 102 | writeEnable(); |
perezalvarezhi | 0:6f374c3ed666 | 103 | chipEnable(); |
perezalvarezhi | 2:e8dc659cf54e | 104 | this->writeSPI(CHIP_ERASE); |
perezalvarezhi | 0:6f374c3ed666 | 105 | chipDisable(); |
perezalvarezhi | 0:6f374c3ed666 | 106 | writeDisable(); |
perezalvarezhi | 0:6f374c3ed666 | 107 | wait(WAIT_TIME); |
perezalvarezhi | 0:6f374c3ed666 | 108 | } |
perezalvarezhi | 0:6f374c3ed666 | 109 | |
perezalvarezhi | 0:6f374c3ed666 | 110 | |
perezalvarezhi | 1:72b556f51896 | 111 | //Private Functions |
perezalvarezhi | 0:6f374c3ed666 | 112 | void W25Q80BV::writeEnable() { |
perezalvarezhi | 0:6f374c3ed666 | 113 | chipEnable(); |
perezalvarezhi | 2:e8dc659cf54e | 114 | this->writeSPI(WRITE_ENABLE); |
perezalvarezhi | 0:6f374c3ed666 | 115 | chipDisable(); |
perezalvarezhi | 0:6f374c3ed666 | 116 | } |
perezalvarezhi | 0:6f374c3ed666 | 117 | void W25Q80BV::writeDisable() { |
perezalvarezhi | 0:6f374c3ed666 | 118 | chipEnable(); |
perezalvarezhi | 2:e8dc659cf54e | 119 | this->writeSPI(WRITE_DISABLE); |
perezalvarezhi | 0:6f374c3ed666 | 120 | chipDisable(); |
perezalvarezhi | 0:6f374c3ed666 | 121 | } |
perezalvarezhi | 0:6f374c3ed666 | 122 | void W25Q80BV::chipEnable() { |
perezalvarezhi | 0:6f374c3ed666 | 123 | _cs = 0; |
perezalvarezhi | 0:6f374c3ed666 | 124 | } |
perezalvarezhi | 0:6f374c3ed666 | 125 | void W25Q80BV::chipDisable() { |
perezalvarezhi | 0:6f374c3ed666 | 126 | _cs = 1; |
perezalvarezhi | 0:6f374c3ed666 | 127 | } |
perezalvarezhi | 0:6f374c3ed666 | 128 | //Sends and receives 1 byte of SPI data MSB endianness |
perezalvarezhi | 1:72b556f51896 | 129 | int W25Q80BV::writeSPI(int data){ |
perezalvarezhi | 0:6f374c3ed666 | 130 | int aux =0,aux2=0,i=0,read=0; |
perezalvarezhi | 0:6f374c3ed666 | 131 | //aux=data; |
perezalvarezhi | 0:6f374c3ed666 | 132 | for(i=0;i<8;i++){ |
perezalvarezhi | 2:e8dc659cf54e | 133 | //output |
perezalvarezhi | 0:6f374c3ed666 | 134 | _sclk = 0; |
perezalvarezhi | 0:6f374c3ed666 | 135 | aux = data&0x80; |
perezalvarezhi | 1:72b556f51896 | 136 | aux >>= 7; |
perezalvarezhi | 0:6f374c3ed666 | 137 | _mosi = aux; |
perezalvarezhi | 1:72b556f51896 | 138 | data <<= 1; |
perezalvarezhi | 2:e8dc659cf54e | 139 | |
perezalvarezhi | 0:6f374c3ed666 | 140 | //input |
perezalvarezhi | 2:e8dc659cf54e | 141 | _sclk = 1; |
perezalvarezhi | 2:e8dc659cf54e | 142 | //maybe wait? test it first |
perezalvarezhi | 2:e8dc659cf54e | 143 | read <<= 1; |
perezalvarezhi | 0:6f374c3ed666 | 144 | aux2 = _miso; |
perezalvarezhi | 1:72b556f51896 | 145 | read |= aux2; |
perezalvarezhi | 0:6f374c3ed666 | 146 | } |
perezalvarezhi | 2:e8dc659cf54e | 147 | _sclk = 0; |
perezalvarezhi | 0:6f374c3ed666 | 148 | return read; |
perezalvarezhi | 0:6f374c3ed666 | 149 | } |