Winbond W25Q80BV SPI library

Dependents:   data_log

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?

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