Winbond W25Q32 SPI library. Tested on Winbond W74M32 embedded on Hani-IoT. Based on https://os.mbed.com/users/perezalvarezhi/code/W25Q80BV/

Committer:
Pawel Zarembski
Date:
Wed Jan 08 11:13:52 2020 +0100
Revision:
0:cc8118fdcc22
Child:
1:d3928deefb53
initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Pawel Zarembski 0:cc8118fdcc22 1 #include"W25Q32.h"
Pawel Zarembski 0:cc8118fdcc22 2
Pawel Zarembski 0:cc8118fdcc22 3 W25Q32::W25Q32(PinName mosi, PinName miso, PinName sclk, PinName cs) : _cs(cs),_mosi(mosi),_miso(miso),_sclk(sclk){
Pawel Zarembski 0:cc8118fdcc22 4
Pawel Zarembski 0:cc8118fdcc22 5 }
Pawel Zarembski 0:cc8118fdcc22 6
Pawel Zarembski 0:cc8118fdcc22 7 int W25Q80BV::getMID()
Pawel Zarembski 0:cc8118fdcc22 8 {
Pawel Zarembski 0:cc8118fdcc22 9 int ID = 0;
Pawel Zarembski 0:cc8118fdcc22 10 chipEnable();
Pawel Zarembski 0:cc8118fdcc22 11 this->writeSPI(DEV_ID);
Pawel Zarembski 0:cc8118fdcc22 12 this->writeSPI(DUMMY_ADDR);
Pawel Zarembski 0:cc8118fdcc22 13 this->writeSPI(DUMMY_ADDR);
Pawel Zarembski 0:cc8118fdcc22 14 this->writeSPI(DUMMY_ADDR);
Pawel Zarembski 0:cc8118fdcc22 15 this->writeSPI(DUMMY_ADDR);
Pawel Zarembski 0:cc8118fdcc22 16 ID = this->writeSPI(DUMMY_ADDR);
Pawel Zarembski 0:cc8118fdcc22 17 chipDisable();
Pawel Zarembski 0:cc8118fdcc22 18 return ID;
Pawel Zarembski 0:cc8118fdcc22 19 }
Pawel Zarembski 0:cc8118fdcc22 20
Pawel Zarembski 0:cc8118fdcc22 21 int W25Q80BV::readByte(int addr)
Pawel Zarembski 0:cc8118fdcc22 22 {
Pawel Zarembski 0:cc8118fdcc22 23 chipEnable();
Pawel Zarembski 0:cc8118fdcc22 24 this->writeSPI(READ_DATA);
Pawel Zarembski 0:cc8118fdcc22 25 this->writeSPI((addr & ADDR_BMASK2) >> ADDR_BSHIFT2);
Pawel Zarembski 0:cc8118fdcc22 26 this->writeSPI((addr & ADDR_BMASK1) >> ADDR_BSHIFT1);
Pawel Zarembski 0:cc8118fdcc22 27 this->writeSPI((addr & ADDR_BMASK0) >> ADDR_BSHIFT0);
Pawel Zarembski 0:cc8118fdcc22 28 int response = this->writeSPI(DUMMY_ADDR);
Pawel Zarembski 0:cc8118fdcc22 29 chipDisable();
Pawel Zarembski 0:cc8118fdcc22 30 return response;
Pawel Zarembski 0:cc8118fdcc22 31 }
Pawel Zarembski 0:cc8118fdcc22 32
Pawel Zarembski 0:cc8118fdcc22 33 int W25Q80BV::readByte(int a2, int a1, int a0)
Pawel Zarembski 0:cc8118fdcc22 34 {
Pawel Zarembski 0:cc8118fdcc22 35 chipEnable();
Pawel Zarembski 0:cc8118fdcc22 36 this->writeSPI(READ_DATA);
Pawel Zarembski 0:cc8118fdcc22 37 this->writeSPI(a2);
Pawel Zarembski 0:cc8118fdcc22 38 this->writeSPI(a1);
Pawel Zarembski 0:cc8118fdcc22 39 this->writeSPI(a0);
Pawel Zarembski 0:cc8118fdcc22 40 int response = this->writeSPI(DUMMY_ADDR);
Pawel Zarembski 0:cc8118fdcc22 41 chipDisable();
Pawel Zarembski 0:cc8118fdcc22 42 return response;
Pawel Zarembski 0:cc8118fdcc22 43 }
Pawel Zarembski 0:cc8118fdcc22 44 void W25Q80BV::readStream(int addr, char* buf, int count)
Pawel Zarembski 0:cc8118fdcc22 45 {
Pawel Zarembski 0:cc8118fdcc22 46 if (count < 1) {
Pawel Zarembski 0:cc8118fdcc22 47 return;
Pawel Zarembski 0:cc8118fdcc22 48 }
Pawel Zarembski 0:cc8118fdcc22 49
Pawel Zarembski 0:cc8118fdcc22 50 chipEnable();
Pawel Zarembski 0:cc8118fdcc22 51 this->writeSPI(READ_DATA);
Pawel Zarembski 0:cc8118fdcc22 52 this->writeSPI((addr & ADDR_BMASK2) >> ADDR_BSHIFT2);
Pawel Zarembski 0:cc8118fdcc22 53 this->writeSPI((addr & ADDR_BMASK1) >> ADDR_BSHIFT1);
Pawel Zarembski 0:cc8118fdcc22 54 this->writeSPI((addr & ADDR_BMASK0) >> ADDR_BSHIFT0);
Pawel Zarembski 0:cc8118fdcc22 55
Pawel Zarembski 0:cc8118fdcc22 56 for (int i = 0; i < count; i++) {
Pawel Zarembski 0:cc8118fdcc22 57 buf[i] = this->writeSPI(DUMMY_ADDR);
Pawel Zarembski 0:cc8118fdcc22 58 }
Pawel Zarembski 0:cc8118fdcc22 59
Pawel Zarembski 0:cc8118fdcc22 60 chipDisable();
Pawel Zarembski 0:cc8118fdcc22 61 }
Pawel Zarembski 0:cc8118fdcc22 62
Pawel Zarembski 0:cc8118fdcc22 63 void W25Q80BV::writeByte(int addr, int data)
Pawel Zarembski 0:cc8118fdcc22 64 {
Pawel Zarembski 0:cc8118fdcc22 65 writeEnable();
Pawel Zarembski 0:cc8118fdcc22 66 chipEnable();
Pawel Zarembski 0:cc8118fdcc22 67 this->writeSPI(WRITE_DATA);
Pawel Zarembski 0:cc8118fdcc22 68 this->writeSPI((addr & ADDR_BMASK2) >> ADDR_BSHIFT2);
Pawel Zarembski 0:cc8118fdcc22 69 this->writeSPI((addr & ADDR_BMASK1) >> ADDR_BSHIFT1);
Pawel Zarembski 0:cc8118fdcc22 70 this->writeSPI((addr & ADDR_BMASK0) >> ADDR_BSHIFT0);
Pawel Zarembski 0:cc8118fdcc22 71 this->writeSPI(data);
Pawel Zarembski 0:cc8118fdcc22 72 chipDisable();
Pawel Zarembski 0:cc8118fdcc22 73 writeDisable();
Pawel Zarembski 0:cc8118fdcc22 74 thread_sleep_for(WAIT_TIME);
Pawel Zarembski 0:cc8118fdcc22 75 }
Pawel Zarembski 0:cc8118fdcc22 76
Pawel Zarembski 0:cc8118fdcc22 77 void W25Q80BV::writeByte(int a2, int a1, int a0, int data)
Pawel Zarembski 0:cc8118fdcc22 78 {
Pawel Zarembski 0:cc8118fdcc22 79 writeEnable();
Pawel Zarembski 0:cc8118fdcc22 80 chipEnable();
Pawel Zarembski 0:cc8118fdcc22 81 this->writeSPI(WRITE_DATA);
Pawel Zarembski 0:cc8118fdcc22 82 this->writeSPI(a2);
Pawel Zarembski 0:cc8118fdcc22 83 this->writeSPI(a1);
Pawel Zarembski 0:cc8118fdcc22 84 this->writeSPI(a0);
Pawel Zarembski 0:cc8118fdcc22 85 this->writeSPI(data);
Pawel Zarembski 0:cc8118fdcc22 86 chipDisable();
Pawel Zarembski 0:cc8118fdcc22 87 writeDisable();
Pawel Zarembski 0:cc8118fdcc22 88 thread_sleep_for(WAIT_TIME);
Pawel Zarembski 0:cc8118fdcc22 89 }
Pawel Zarembski 0:cc8118fdcc22 90
Pawel Zarembski 0:cc8118fdcc22 91 void W25Q80BV::writeStream(int addr, char* buf, int count) {
Pawel Zarembski 0:cc8118fdcc22 92 if (count < 1) {
Pawel Zarembski 0:cc8118fdcc22 93 return;
Pawel Zarembski 0:cc8118fdcc22 94 }
Pawel Zarembski 0:cc8118fdcc22 95
Pawel Zarembski 0:cc8118fdcc22 96 writeEnable();
Pawel Zarembski 0:cc8118fdcc22 97 chipEnable();
Pawel Zarembski 0:cc8118fdcc22 98 this->writeSPI(WRITE_DATA);
Pawel Zarembski 0:cc8118fdcc22 99 this->writeSPI((addr & ADDR_BMASK2) >> ADDR_BSHIFT2);
Pawel Zarembski 0:cc8118fdcc22 100 this->writeSPI((addr & ADDR_BMASK1) >> ADDR_BSHIFT1);
Pawel Zarembski 0:cc8118fdcc22 101 this->writeSPI((addr & ADDR_BMASK0) >> ADDR_BSHIFT0);
Pawel Zarembski 0:cc8118fdcc22 102
Pawel Zarembski 0:cc8118fdcc22 103 for (int i = 0; i < count; i++) {
Pawel Zarembski 0:cc8118fdcc22 104 this->writeSPI(buf[i]);
Pawel Zarembski 0:cc8118fdcc22 105 }
Pawel Zarembski 0:cc8118fdcc22 106
Pawel Zarembski 0:cc8118fdcc22 107 chipDisable();
Pawel Zarembski 0:cc8118fdcc22 108 writeDisable();
Pawel Zarembski 0:cc8118fdcc22 109 thread_sleep_for(WAIT_TIME);
Pawel Zarembski 0:cc8118fdcc22 110 }
Pawel Zarembski 0:cc8118fdcc22 111
Pawel Zarembski 0:cc8118fdcc22 112 void W25Q80BV::chipErase()
Pawel Zarembski 0:cc8118fdcc22 113 {
Pawel Zarembski 0:cc8118fdcc22 114 writeEnable();
Pawel Zarembski 0:cc8118fdcc22 115 chipEnable();
Pawel Zarembski 0:cc8118fdcc22 116 this->writeSPI(CHIP_ERASE);
Pawel Zarembski 0:cc8118fdcc22 117 chipDisable();
Pawel Zarembski 0:cc8118fdcc22 118 writeDisable();
Pawel Zarembski 0:cc8118fdcc22 119 thread_sleep_for(WAIT_TIME);
Pawel Zarembski 0:cc8118fdcc22 120 }
Pawel Zarembski 0:cc8118fdcc22 121
Pawel Zarembski 0:cc8118fdcc22 122 void W25Q80BV::writeEnable()
Pawel Zarembski 0:cc8118fdcc22 123 {
Pawel Zarembski 0:cc8118fdcc22 124 chipEnable();
Pawel Zarembski 0:cc8118fdcc22 125 this->writeSPI(WRITE_ENABLE);
Pawel Zarembski 0:cc8118fdcc22 126 chipDisable();
Pawel Zarembski 0:cc8118fdcc22 127 }
Pawel Zarembski 0:cc8118fdcc22 128
Pawel Zarembski 0:cc8118fdcc22 129 void W25Q80BV::writeDisable()
Pawel Zarembski 0:cc8118fdcc22 130 {
Pawel Zarembski 0:cc8118fdcc22 131 chipEnable();
Pawel Zarembski 0:cc8118fdcc22 132 this->writeSPI(WRITE_DISABLE);
Pawel Zarembski 0:cc8118fdcc22 133 chipDisable();
Pawel Zarembski 0:cc8118fdcc22 134 }
Pawel Zarembski 0:cc8118fdcc22 135
Pawel Zarembski 0:cc8118fdcc22 136 void W25Q80BV::chipEnable()
Pawel Zarembski 0:cc8118fdcc22 137 {
Pawel Zarembski 0:cc8118fdcc22 138 _cs = 0;
Pawel Zarembski 0:cc8118fdcc22 139 }
Pawel Zarembski 0:cc8118fdcc22 140
Pawel Zarembski 0:cc8118fdcc22 141 void W25Q80BV::chipDisable()
Pawel Zarembski 0:cc8118fdcc22 142 {
Pawel Zarembski 0:cc8118fdcc22 143 _cs = 1;
Pawel Zarembski 0:cc8118fdcc22 144 }
Pawel Zarembski 0:cc8118fdcc22 145
Pawel Zarembski 0:cc8118fdcc22 146 // Sends and receives 1 byte of SPI data MSB endianness
Pawel Zarembski 0:cc8118fdcc22 147 int W25Q80BV::writeSPI(int data){
Pawel Zarembski 0:cc8118fdcc22 148 int i;
Pawel Zarembski 0:cc8118fdcc22 149 int aux = 0;
Pawel Zarembski 0:cc8118fdcc22 150 int aux2 = 0;
Pawel Zarembski 0:cc8118fdcc22 151 int read = 0;
Pawel Zarembski 0:cc8118fdcc22 152
Pawel Zarembski 0:cc8118fdcc22 153 for (i = 0; i<8; i++) {
Pawel Zarembski 0:cc8118fdcc22 154 _sclk = 0;
Pawel Zarembski 0:cc8118fdcc22 155 aux = data&0x80;
Pawel Zarembski 0:cc8118fdcc22 156 aux >>= 7;
Pawel Zarembski 0:cc8118fdcc22 157 _mosi = aux;
Pawel Zarembski 0:cc8118fdcc22 158 data <<= 1;
Pawel Zarembski 0:cc8118fdcc22 159
Pawel Zarembski 0:cc8118fdcc22 160 // input
Pawel Zarembski 0:cc8118fdcc22 161 _sclk = 1;
Pawel Zarembski 0:cc8118fdcc22 162
Pawel Zarembski 0:cc8118fdcc22 163 read <<= 1;
Pawel Zarembski 0:cc8118fdcc22 164 aux2 = _miso;
Pawel Zarembski 0:cc8118fdcc22 165 read |= aux2;
Pawel Zarembski 0:cc8118fdcc22 166 }
Pawel Zarembski 0:cc8118fdcc22 167
Pawel Zarembski 0:cc8118fdcc22 168 _sclk = 0;
Pawel Zarembski 0:cc8118fdcc22 169 return read;
Pawel Zarembski 0:cc8118fdcc22 170 }