Release 1.01

Committer:
foxbrianr
Date:
Thu Sep 12 11:27:59 2019 +0000
Revision:
1:86f6ebbe4fd1
Child:
2:1d5204d29bc5
beta1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
foxbrianr 1:86f6ebbe4fd1 1 /*
foxbrianr 1:86f6ebbe4fd1 2 * SPI_MX25R Series SPI-Flash Memory
foxbrianr 1:86f6ebbe4fd1 3 * Macronix Low Power Serial NOR Flash
foxbrianr 1:86f6ebbe4fd1 4 * (x2, and x4 I/O modes not implemented)
foxbrianr 1:86f6ebbe4fd1 5 */
foxbrianr 1:86f6ebbe4fd1 6
foxbrianr 1:86f6ebbe4fd1 7 #include "SPI_MX25R.h"
foxbrianr 1:86f6ebbe4fd1 8
foxbrianr 1:86f6ebbe4fd1 9
foxbrianr 1:86f6ebbe4fd1 10 SPI_MX25R::SPI_MX25R(PinName mosi, PinName miso, PinName sclk, PinName cs) :
foxbrianr 1:86f6ebbe4fd1 11 m_spi(mosi, miso, sclk), m_cs(cs) { }
foxbrianr 1:86f6ebbe4fd1 12
foxbrianr 1:86f6ebbe4fd1 13 SPI_MX25R::~SPI_MX25R() { }
foxbrianr 1:86f6ebbe4fd1 14
foxbrianr 1:86f6ebbe4fd1 15 void SPI_MX25R::writeEnable(void)
foxbrianr 1:86f6ebbe4fd1 16 {
foxbrianr 1:86f6ebbe4fd1 17 m_cs = CS_LOW ;
foxbrianr 1:86f6ebbe4fd1 18 m_spi.write(CMD_WREN) ;
foxbrianr 1:86f6ebbe4fd1 19 m_cs = CS_HIGH ;
foxbrianr 1:86f6ebbe4fd1 20 }
foxbrianr 1:86f6ebbe4fd1 21
foxbrianr 1:86f6ebbe4fd1 22 void SPI_MX25R::writeDisable(void)
foxbrianr 1:86f6ebbe4fd1 23 {
foxbrianr 1:86f6ebbe4fd1 24 m_cs = CS_LOW ;
foxbrianr 1:86f6ebbe4fd1 25 m_spi.write(CMD_WRDI) ;
foxbrianr 1:86f6ebbe4fd1 26 m_cs = CS_HIGH ;
foxbrianr 1:86f6ebbe4fd1 27 }
foxbrianr 1:86f6ebbe4fd1 28
foxbrianr 1:86f6ebbe4fd1 29 void SPI_MX25R::resetEnable(void)
foxbrianr 1:86f6ebbe4fd1 30 {
foxbrianr 1:86f6ebbe4fd1 31 m_cs = CS_LOW ;
foxbrianr 1:86f6ebbe4fd1 32 m_spi.write(CMD_RSTEN) ;
foxbrianr 1:86f6ebbe4fd1 33 m_cs = CS_HIGH ;
foxbrianr 1:86f6ebbe4fd1 34 }
foxbrianr 1:86f6ebbe4fd1 35
foxbrianr 1:86f6ebbe4fd1 36 void SPI_MX25R::reset(void)
foxbrianr 1:86f6ebbe4fd1 37 {
foxbrianr 1:86f6ebbe4fd1 38 m_cs = CS_LOW ;
foxbrianr 1:86f6ebbe4fd1 39 m_spi.write(CMD_RST) ;
foxbrianr 1:86f6ebbe4fd1 40 m_cs = CS_HIGH ;
foxbrianr 1:86f6ebbe4fd1 41 }
foxbrianr 1:86f6ebbe4fd1 42
foxbrianr 1:86f6ebbe4fd1 43 void SPI_MX25R::pgmersSuspend(void)
foxbrianr 1:86f6ebbe4fd1 44 {
foxbrianr 1:86f6ebbe4fd1 45 m_cs = CS_LOW ;
foxbrianr 1:86f6ebbe4fd1 46 m_spi.write(CMD_PESUS) ;
foxbrianr 1:86f6ebbe4fd1 47 m_cs = CS_HIGH ;
foxbrianr 1:86f6ebbe4fd1 48 }
foxbrianr 1:86f6ebbe4fd1 49
foxbrianr 1:86f6ebbe4fd1 50 void SPI_MX25R::pgmersResume(void)
foxbrianr 1:86f6ebbe4fd1 51 {
foxbrianr 1:86f6ebbe4fd1 52 m_cs = CS_LOW ;
foxbrianr 1:86f6ebbe4fd1 53 m_spi.write(CMD_PERES) ;
foxbrianr 1:86f6ebbe4fd1 54 m_cs = CS_HIGH ;
foxbrianr 1:86f6ebbe4fd1 55 }
foxbrianr 1:86f6ebbe4fd1 56
foxbrianr 1:86f6ebbe4fd1 57 void SPI_MX25R::deepPowerdown(void)
foxbrianr 1:86f6ebbe4fd1 58 {
foxbrianr 1:86f6ebbe4fd1 59 m_cs = CS_LOW ;
foxbrianr 1:86f6ebbe4fd1 60 m_spi.write(CMD_DP) ;
foxbrianr 1:86f6ebbe4fd1 61 m_cs = CS_HIGH ;
foxbrianr 1:86f6ebbe4fd1 62 }
foxbrianr 1:86f6ebbe4fd1 63
foxbrianr 1:86f6ebbe4fd1 64 void SPI_MX25R::setBurstlength(void)
foxbrianr 1:86f6ebbe4fd1 65 {
foxbrianr 1:86f6ebbe4fd1 66 m_cs = CS_LOW ;
foxbrianr 1:86f6ebbe4fd1 67 m_spi.write(CMD_SBL) ;
foxbrianr 1:86f6ebbe4fd1 68 m_cs = CS_HIGH ;
foxbrianr 1:86f6ebbe4fd1 69 }
foxbrianr 1:86f6ebbe4fd1 70
foxbrianr 1:86f6ebbe4fd1 71 void SPI_MX25R::releaseReadenhaced(void)
foxbrianr 1:86f6ebbe4fd1 72 {
foxbrianr 1:86f6ebbe4fd1 73 m_cs = CS_LOW ;
foxbrianr 1:86f6ebbe4fd1 74 m_spi.write(CMD_RRE) ;
foxbrianr 1:86f6ebbe4fd1 75 m_cs = CS_HIGH ;
foxbrianr 1:86f6ebbe4fd1 76 }
foxbrianr 1:86f6ebbe4fd1 77
foxbrianr 1:86f6ebbe4fd1 78 void SPI_MX25R::noOperation(void)
foxbrianr 1:86f6ebbe4fd1 79 {
foxbrianr 1:86f6ebbe4fd1 80 m_cs = CS_LOW ;
foxbrianr 1:86f6ebbe4fd1 81 m_spi.write(CMD_NOP) ;
foxbrianr 1:86f6ebbe4fd1 82 m_cs = CS_HIGH ;
foxbrianr 1:86f6ebbe4fd1 83 }
foxbrianr 1:86f6ebbe4fd1 84
foxbrianr 1:86f6ebbe4fd1 85 void SPI_MX25R::enterSecureOTP(void)
foxbrianr 1:86f6ebbe4fd1 86 {
foxbrianr 1:86f6ebbe4fd1 87 m_cs = CS_LOW ;
foxbrianr 1:86f6ebbe4fd1 88 m_spi.write(CMD_ENSO) ;
foxbrianr 1:86f6ebbe4fd1 89 m_cs = CS_HIGH ;
foxbrianr 1:86f6ebbe4fd1 90 }
foxbrianr 1:86f6ebbe4fd1 91
foxbrianr 1:86f6ebbe4fd1 92 void SPI_MX25R::exitSecureOTP(void)
foxbrianr 1:86f6ebbe4fd1 93 {
foxbrianr 1:86f6ebbe4fd1 94 m_cs = CS_LOW ;
foxbrianr 1:86f6ebbe4fd1 95 m_spi.write(CMD_EXSO) ;
foxbrianr 1:86f6ebbe4fd1 96 m_cs = CS_HIGH ;
foxbrianr 1:86f6ebbe4fd1 97 }
foxbrianr 1:86f6ebbe4fd1 98
foxbrianr 1:86f6ebbe4fd1 99 uint8_t SPI_MX25R::readStatus(void)
foxbrianr 1:86f6ebbe4fd1 100 {
foxbrianr 1:86f6ebbe4fd1 101 uint8_t data ;
foxbrianr 1:86f6ebbe4fd1 102 m_cs = CS_LOW ;
foxbrianr 1:86f6ebbe4fd1 103 m_spi.write(CMD_RDSR) ;
foxbrianr 1:86f6ebbe4fd1 104 data = m_spi.write(DUMMY) ; // dummy
foxbrianr 1:86f6ebbe4fd1 105 m_cs = CS_HIGH ;
foxbrianr 1:86f6ebbe4fd1 106 return( data ) ;
foxbrianr 1:86f6ebbe4fd1 107 }
foxbrianr 1:86f6ebbe4fd1 108
foxbrianr 1:86f6ebbe4fd1 109 uint32_t SPI_MX25R::readConfig(void)
foxbrianr 1:86f6ebbe4fd1 110 {
foxbrianr 1:86f6ebbe4fd1 111 uint8_t data;
foxbrianr 1:86f6ebbe4fd1 112 uint32_t config32 = 0 ;
foxbrianr 1:86f6ebbe4fd1 113 m_cs = CS_LOW ;
foxbrianr 1:86f6ebbe4fd1 114 m_spi.write(CMD_RDCR) ; // send 15h
foxbrianr 1:86f6ebbe4fd1 115 data= m_spi.write(DUMMY) ; // dumy to get 1st Byte out
foxbrianr 1:86f6ebbe4fd1 116 config32 = config32 | data ; // put in 32b reg
foxbrianr 1:86f6ebbe4fd1 117 data= m_spi.write(DUMMY) ; // dummy to get 2nd Byte out
foxbrianr 1:86f6ebbe4fd1 118 config32 = (config32 << 8) | data ; // shift and put in reg
foxbrianr 1:86f6ebbe4fd1 119 m_cs = CS_HIGH ;
foxbrianr 1:86f6ebbe4fd1 120 return( config32 ) ;
foxbrianr 1:86f6ebbe4fd1 121 }
foxbrianr 1:86f6ebbe4fd1 122
foxbrianr 1:86f6ebbe4fd1 123 uint8_t SPI_MX25R::readSecurity(void)
foxbrianr 1:86f6ebbe4fd1 124 {
foxbrianr 1:86f6ebbe4fd1 125 uint8_t data ;
foxbrianr 1:86f6ebbe4fd1 126 m_cs = CS_LOW ;
foxbrianr 1:86f6ebbe4fd1 127 m_spi.write(CMD_RDSCUR) ; // send 2Bh
foxbrianr 1:86f6ebbe4fd1 128 data = m_spi.write(DUMMY) ; // dummy
foxbrianr 1:86f6ebbe4fd1 129 m_cs = CS_HIGH ;
foxbrianr 1:86f6ebbe4fd1 130 return( data ) ;
foxbrianr 1:86f6ebbe4fd1 131 }
foxbrianr 1:86f6ebbe4fd1 132
foxbrianr 1:86f6ebbe4fd1 133 uint32_t SPI_MX25R::readID(void)
foxbrianr 1:86f6ebbe4fd1 134 {
foxbrianr 1:86f6ebbe4fd1 135 uint8_t data;
foxbrianr 1:86f6ebbe4fd1 136 uint32_t data32 = 0 ;
foxbrianr 1:86f6ebbe4fd1 137 m_cs = CS_LOW ;
foxbrianr 1:86f6ebbe4fd1 138 m_spi.write(CMD_RDID) ; // send 9Fh
foxbrianr 1:86f6ebbe4fd1 139 data= m_spi.write(DUMMY) ; // dumy to get 1st Byte out
foxbrianr 1:86f6ebbe4fd1 140 data32 = data32 | data ; // put in 32b reg
foxbrianr 1:86f6ebbe4fd1 141 data= m_spi.write(DUMMY) ; // dummy to get 2nd Byte out
foxbrianr 1:86f6ebbe4fd1 142 data32 = (data32 << 8) | data ; // shift and put in reg
foxbrianr 1:86f6ebbe4fd1 143 data= m_spi.write(DUMMY) ; // dummy to get 3rd Byte out
foxbrianr 1:86f6ebbe4fd1 144 data32 = (data32 << 8) | data ; // shift again and put in reg
foxbrianr 1:86f6ebbe4fd1 145 m_cs = CS_HIGH ;
foxbrianr 1:86f6ebbe4fd1 146 return( data32 ) ;
foxbrianr 1:86f6ebbe4fd1 147 }
foxbrianr 1:86f6ebbe4fd1 148
foxbrianr 1:86f6ebbe4fd1 149 uint32_t SPI_MX25R::readREMS(void)
foxbrianr 1:86f6ebbe4fd1 150 {
foxbrianr 1:86f6ebbe4fd1 151 uint8_t data;
foxbrianr 1:86f6ebbe4fd1 152 uint32_t data32 = 0 ;
foxbrianr 1:86f6ebbe4fd1 153 m_cs = CS_LOW ;
foxbrianr 1:86f6ebbe4fd1 154 m_spi.write(CMD_REMS) ; // send 90h
foxbrianr 1:86f6ebbe4fd1 155 m_spi.write(DUMMY) ; // send DUMMY1
foxbrianr 1:86f6ebbe4fd1 156 m_spi.write(DUMMY) ; // send DUMMY2
foxbrianr 1:86f6ebbe4fd1 157 m_spi.write(0) ; // send address=0x00 to get Manu ID 1st.
foxbrianr 1:86f6ebbe4fd1 158 data= m_spi.write(DUMMY) ; // dumy to get Manufacturer ID= C2h out
foxbrianr 1:86f6ebbe4fd1 159 data32 = data32 | data ; // put in 32b reg
foxbrianr 1:86f6ebbe4fd1 160 data= m_spi.write(DUMMY) ; // dummy to get 2nd Byte = Device ID out
foxbrianr 1:86f6ebbe4fd1 161 data32 = (data32 << 8) | data ; // shift and put in reg
foxbrianr 1:86f6ebbe4fd1 162 m_cs = CS_HIGH ;
foxbrianr 1:86f6ebbe4fd1 163 return( data32 ) ;
foxbrianr 1:86f6ebbe4fd1 164 }
foxbrianr 1:86f6ebbe4fd1 165
foxbrianr 1:86f6ebbe4fd1 166 uint8_t SPI_MX25R::readRES(void)
foxbrianr 1:86f6ebbe4fd1 167 {
foxbrianr 1:86f6ebbe4fd1 168 uint8_t data;
foxbrianr 1:86f6ebbe4fd1 169 m_cs = CS_LOW ;
foxbrianr 1:86f6ebbe4fd1 170 m_spi.write(CMD_RES) ; // send ABh
foxbrianr 1:86f6ebbe4fd1 171 m_spi.write(DUMMY) ; // send DUMMY1
foxbrianr 1:86f6ebbe4fd1 172 m_spi.write(DUMMY) ; // send DUMMY2
foxbrianr 1:86f6ebbe4fd1 173 m_spi.write(DUMMY) ; // send DUMMY3
foxbrianr 1:86f6ebbe4fd1 174 data= m_spi.write(DUMMY) ; // dumy to get Electronic Sig. out
foxbrianr 1:86f6ebbe4fd1 175 m_cs = CS_HIGH ;
foxbrianr 1:86f6ebbe4fd1 176 return( data ) ;
foxbrianr 1:86f6ebbe4fd1 177 }
foxbrianr 1:86f6ebbe4fd1 178
foxbrianr 1:86f6ebbe4fd1 179 void SPI_MX25R::programPage(int addr, uint8_t *data, int numData)
foxbrianr 1:86f6ebbe4fd1 180 {
foxbrianr 1:86f6ebbe4fd1 181 int i ;
foxbrianr 1:86f6ebbe4fd1 182 m_cs = CS_LOW ;
foxbrianr 1:86f6ebbe4fd1 183 m_spi.write(CMD_PP) ; // Program Page 02h
foxbrianr 1:86f6ebbe4fd1 184 m_spi.write((addr >> 16)&0xFF) ; // adr 23:16
foxbrianr 1:86f6ebbe4fd1 185 m_spi.write((addr >> 8)&0xFF) ; // adr 15:8
foxbrianr 1:86f6ebbe4fd1 186 m_spi.write(addr & 0xFF) ; // adr 7:0
foxbrianr 1:86f6ebbe4fd1 187 for (i = 0 ; i < numData ; i++ ) { // data = 00, 01, 02, .. to FEh, FFh = all 256 Bytes in 1 page.
foxbrianr 1:86f6ebbe4fd1 188 m_spi.write(data[i]) ;
foxbrianr 1:86f6ebbe4fd1 189 }
foxbrianr 1:86f6ebbe4fd1 190 m_cs = CS_HIGH ;
foxbrianr 1:86f6ebbe4fd1 191 // poll in main
foxbrianr 1:86f6ebbe4fd1 192 }
foxbrianr 1:86f6ebbe4fd1 193
foxbrianr 1:86f6ebbe4fd1 194 void SPI_MX25R::writeStatusreg(int addr) // Write SR cmd 01h + 3B data
foxbrianr 1:86f6ebbe4fd1 195 {
foxbrianr 1:86f6ebbe4fd1 196 m_cs = CS_LOW ;
foxbrianr 1:86f6ebbe4fd1 197 m_spi.write(CMD_WRSR) ; // Write SR cmd 01h
foxbrianr 1:86f6ebbe4fd1 198 m_spi.write((addr >> 16)&0xFF) ; // address
foxbrianr 1:86f6ebbe4fd1 199 m_spi.write((addr >> 8)&0xFF) ;
foxbrianr 1:86f6ebbe4fd1 200 m_spi.write(addr & 0xFF) ;
foxbrianr 1:86f6ebbe4fd1 201 m_cs = CS_HIGH ;
foxbrianr 1:86f6ebbe4fd1 202 }
foxbrianr 1:86f6ebbe4fd1 203
foxbrianr 1:86f6ebbe4fd1 204 void SPI_MX25R::writeSecurityreg(int addr) // WRSCUR cmd 2Fh + 1B data
foxbrianr 1:86f6ebbe4fd1 205 {
foxbrianr 1:86f6ebbe4fd1 206 m_cs = CS_LOW ;
foxbrianr 1:86f6ebbe4fd1 207 m_spi.write(CMD_WRSCUR) ; // Write SR cmd 01h
foxbrianr 1:86f6ebbe4fd1 208 m_spi.write(addr & 0xFF) ;
foxbrianr 1:86f6ebbe4fd1 209 m_cs = CS_HIGH ;
foxbrianr 1:86f6ebbe4fd1 210 }
foxbrianr 1:86f6ebbe4fd1 211
foxbrianr 1:86f6ebbe4fd1 212 void SPI_MX25R::blockErase(int addr) // 64KB Block Erase
foxbrianr 1:86f6ebbe4fd1 213 {
foxbrianr 1:86f6ebbe4fd1 214 uint8_t data[3] ;
foxbrianr 1:86f6ebbe4fd1 215 data[0] = (addr >> 16) & 0xFF ;
foxbrianr 1:86f6ebbe4fd1 216 data[1] = (addr >> 8) & 0xFF ;
foxbrianr 1:86f6ebbe4fd1 217 data[2] = (addr & 0xFF) ;
foxbrianr 1:86f6ebbe4fd1 218 m_cs = CS_LOW ;
foxbrianr 1:86f6ebbe4fd1 219 m_spi.write(CMD_BE) ;
foxbrianr 1:86f6ebbe4fd1 220 for (int i = 0 ; i < 3 ; i++ ) { // Address setting
foxbrianr 1:86f6ebbe4fd1 221 m_spi.write(data[i]) ;
foxbrianr 1:86f6ebbe4fd1 222 }
foxbrianr 1:86f6ebbe4fd1 223 m_cs = CS_HIGH ;
foxbrianr 1:86f6ebbe4fd1 224 // poll in main
foxbrianr 1:86f6ebbe4fd1 225 }
foxbrianr 1:86f6ebbe4fd1 226
foxbrianr 1:86f6ebbe4fd1 227 void SPI_MX25R::blockErase32KB(int addr) // 32KB Block Erase
foxbrianr 1:86f6ebbe4fd1 228 {
foxbrianr 1:86f6ebbe4fd1 229 uint8_t data[3] ;
foxbrianr 1:86f6ebbe4fd1 230 data[0] = (addr >> 16) & 0xFF ;
foxbrianr 1:86f6ebbe4fd1 231 data[1] = (addr >> 8) & 0xFF ;
foxbrianr 1:86f6ebbe4fd1 232 data[2] = (addr & 0xFF) ;
foxbrianr 1:86f6ebbe4fd1 233 m_cs = CS_LOW ;
foxbrianr 1:86f6ebbe4fd1 234 m_spi.write(CMD_32KBE) ;
foxbrianr 1:86f6ebbe4fd1 235 for (int i = 0 ; i < 3 ; i++ ) { // Address Setting
foxbrianr 1:86f6ebbe4fd1 236 m_spi.write(data[i]) ;
foxbrianr 1:86f6ebbe4fd1 237 }
foxbrianr 1:86f6ebbe4fd1 238 m_cs = CS_HIGH ;
foxbrianr 1:86f6ebbe4fd1 239 // poll in main
foxbrianr 1:86f6ebbe4fd1 240 }
foxbrianr 1:86f6ebbe4fd1 241
foxbrianr 1:86f6ebbe4fd1 242 void SPI_MX25R::sectorErase(int addr) // 4KB Sector Erase
foxbrianr 1:86f6ebbe4fd1 243 {
foxbrianr 1:86f6ebbe4fd1 244 uint8_t data[3] ;
foxbrianr 1:86f6ebbe4fd1 245 data[0] = (addr >> 16) & 0xFF ;
foxbrianr 1:86f6ebbe4fd1 246 data[1] = (addr >> 8) & 0xFF ;
foxbrianr 1:86f6ebbe4fd1 247 data[2] = (addr & 0xFF) ;
foxbrianr 1:86f6ebbe4fd1 248 m_cs = CS_LOW ;
foxbrianr 1:86f6ebbe4fd1 249 m_spi.write(CMD_SE) ;
foxbrianr 1:86f6ebbe4fd1 250 for (int i = 0 ; i < 3 ; i++ ) { // Address Setting
foxbrianr 1:86f6ebbe4fd1 251 m_spi.write(data[i]) ;
foxbrianr 1:86f6ebbe4fd1 252 }
foxbrianr 1:86f6ebbe4fd1 253 m_cs = CS_HIGH ;
foxbrianr 1:86f6ebbe4fd1 254 // poll in main
foxbrianr 1:86f6ebbe4fd1 255 }
foxbrianr 1:86f6ebbe4fd1 256
foxbrianr 1:86f6ebbe4fd1 257 void SPI_MX25R::chipErase(void) // Chip Erase
foxbrianr 1:86f6ebbe4fd1 258 {
foxbrianr 1:86f6ebbe4fd1 259 m_cs = CS_LOW ;
foxbrianr 1:86f6ebbe4fd1 260 m_spi.write(CMD_CE) ;
foxbrianr 1:86f6ebbe4fd1 261 m_cs = CS_HIGH ;
foxbrianr 1:86f6ebbe4fd1 262 // poll in main
foxbrianr 1:86f6ebbe4fd1 263 }
foxbrianr 1:86f6ebbe4fd1 264
foxbrianr 1:86f6ebbe4fd1 265 uint8_t SPI_MX25R::read8(int addr) // Single Byte Read
foxbrianr 1:86f6ebbe4fd1 266 {
foxbrianr 1:86f6ebbe4fd1 267 uint8_t data ;
foxbrianr 1:86f6ebbe4fd1 268 m_cs = CS_LOW ;
foxbrianr 1:86f6ebbe4fd1 269 m_spi.write(CMD_READ) ; // send 03h
foxbrianr 1:86f6ebbe4fd1 270 m_spi.write((addr >> 16)&0xFF) ;
foxbrianr 1:86f6ebbe4fd1 271 m_spi.write((addr >> 8)&0xFF) ;
foxbrianr 1:86f6ebbe4fd1 272 m_spi.write(addr & 0xFF) ;
foxbrianr 1:86f6ebbe4fd1 273 data = m_spi.write(DUMMY) ; // write data is dummy
foxbrianr 1:86f6ebbe4fd1 274 m_cs = CS_HIGH ;
foxbrianr 1:86f6ebbe4fd1 275 return( data ) ; // return 1 byte
foxbrianr 1:86f6ebbe4fd1 276 }
foxbrianr 1:86f6ebbe4fd1 277
foxbrianr 1:86f6ebbe4fd1 278 uint8_t SPI_MX25R::readSFDP(int addr) // Read SFDP
foxbrianr 1:86f6ebbe4fd1 279 {
foxbrianr 1:86f6ebbe4fd1 280 uint8_t data ;
foxbrianr 1:86f6ebbe4fd1 281 m_cs = CS_LOW ;
foxbrianr 1:86f6ebbe4fd1 282 m_spi.write(CMD_RDSFDP) ; // send cmd 5Ah
foxbrianr 1:86f6ebbe4fd1 283 m_spi.write((addr >> 16)&0xFF) ; // address[23:16]
foxbrianr 1:86f6ebbe4fd1 284 m_spi.write((addr >> 8)&0xFF) ; // address[15:8]
foxbrianr 1:86f6ebbe4fd1 285 m_spi.write(addr & 0xFF) ; // address[7:0]
foxbrianr 1:86f6ebbe4fd1 286 m_spi.write(DUMMY) ; // dummy cycle
foxbrianr 1:86f6ebbe4fd1 287 data = m_spi.write(DUMMY) ; // return 1 byte
foxbrianr 1:86f6ebbe4fd1 288 m_cs = CS_HIGH ;
foxbrianr 1:86f6ebbe4fd1 289 return( data ) ;
foxbrianr 1:86f6ebbe4fd1 290 }
foxbrianr 1:86f6ebbe4fd1 291
foxbrianr 1:86f6ebbe4fd1 292 uint8_t SPI_MX25R::readFREAD(int addr) // x1 Fast Read Data Byte
foxbrianr 1:86f6ebbe4fd1 293 {
foxbrianr 1:86f6ebbe4fd1 294 uint8_t data ;
foxbrianr 1:86f6ebbe4fd1 295 m_cs = CS_LOW ;
foxbrianr 1:86f6ebbe4fd1 296 m_spi.write(CMD_FREAD) ; // send cmd 0BH
foxbrianr 1:86f6ebbe4fd1 297 m_spi.write((addr >> 16)&0xFF) ; // address[23:16]
foxbrianr 1:86f6ebbe4fd1 298 m_spi.write((addr >> 8)&0xFF) ; // address[15:8]
foxbrianr 1:86f6ebbe4fd1 299 m_spi.write(addr & 0xFF) ; // address[7:0]
foxbrianr 1:86f6ebbe4fd1 300 m_spi.write(DUMMY) ; // dummy cycle
foxbrianr 1:86f6ebbe4fd1 301 data = m_spi.write(DUMMY) ; // return 1 byte
foxbrianr 1:86f6ebbe4fd1 302 m_cs = CS_HIGH ;
foxbrianr 1:86f6ebbe4fd1 303 return( data ) ;
foxbrianr 1:86f6ebbe4fd1 304 }
foxbrianr 1:86f6ebbe4fd1 305