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