Winbond W25Q80BV SPI library

Dependents:   data_log

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?

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