MX25R6435F Library
Dependents: Demo_MX25Rxx35F_Serial_NOR_Flash_Testbench mbed-lorawan-pulga mbed-lorawan-pulga-serial_rx mbed-lorawan-pulga-gps-added_shared
Fork of SPI_MX25R by
SPI_MX25R.cpp
- Committer:
- Arkadi
- Date:
- 2018-03-28
- Revision:
- 3:b6bb8d236251
- Parent:
- 2:f72110475fec
File content as of revision 3:b6bb8d236251:
/* * SPI_MX25R Series SPI-Flash Memory * Macronix Low Power Serial NOR Flash * (x2, and x4 I/O modes not implemented) */ #include "SPI_MX25R.h" SPI_MX25R::SPI_MX25R(PinName mosi, PinName miso, PinName sclk, PinName cs) : m_spi(mosi, miso, sclk), m_cs(cs) { } SPI_MX25R::~SPI_MX25R() { } void SPI_MX25R::writeEnable(void) { m_cs = CS_LOW ; m_spi.write(CMD_WREN) ; m_cs = CS_HIGH ; } void SPI_MX25R::writeDisable(void) { m_cs = CS_LOW ; m_spi.write(CMD_WRDI) ; m_cs = CS_HIGH ; } void SPI_MX25R::resetEnable(void) { m_cs = CS_LOW ; m_spi.write(CMD_RSTEN) ; m_cs = CS_HIGH ; } void SPI_MX25R::reset(void) { m_cs = CS_LOW ; m_spi.write(CMD_RST) ; m_cs = CS_HIGH ; } void SPI_MX25R::pgmersSuspend(void) { m_cs = CS_LOW ; m_spi.write(CMD_PESUS) ; m_cs = CS_HIGH ; } void SPI_MX25R::pgmersResume(void) { m_cs = CS_LOW ; m_spi.write(CMD_PERES) ; m_cs = CS_HIGH ; } void SPI_MX25R::deepPowerdown(void) { m_cs = CS_LOW ; m_spi.write(CMD_DP) ; m_cs = CS_HIGH ; } void SPI_MX25R::setBurstlength(void) { m_cs = CS_LOW ; m_spi.write(CMD_SBL) ; m_cs = CS_HIGH ; } void SPI_MX25R::releaseReadenhaced(void) { m_cs = CS_LOW ; m_spi.write(CMD_RRE) ; m_cs = CS_HIGH ; } void SPI_MX25R::noOperation(void) { m_cs = CS_LOW ; m_spi.write(CMD_NOP) ; m_cs = CS_HIGH ; } void SPI_MX25R::enterSecureOTP(void) { m_cs = CS_LOW ; m_spi.write(CMD_ENSO) ; m_cs = CS_HIGH ; } void SPI_MX25R::exitSecureOTP(void) { m_cs = CS_LOW ; m_spi.write(CMD_EXSO) ; m_cs = CS_HIGH ; } uint8_t SPI_MX25R::readStatus(void) { uint8_t data ; m_cs = CS_LOW ; m_spi.write(CMD_RDSR) ; data = m_spi.write(DUMMY) ; // dummy m_cs = CS_HIGH ; return( data ) ; } uint32_t SPI_MX25R::readConfig(void) { uint8_t data; uint32_t config32 = 0 ; m_cs = CS_LOW ; m_spi.write(CMD_RDCR) ; // send 15h data= m_spi.write(DUMMY) ; // dumy to get 1st Byte out config32 = config32 | data ; // put in 32b reg data= m_spi.write(DUMMY) ; // dummy to get 2nd Byte out config32 = (config32 << 8) | data ; // shift and put in reg m_cs = CS_HIGH ; return( config32 ) ; } uint8_t SPI_MX25R::readSecurity(void) { uint8_t data ; m_cs = CS_LOW ; m_spi.write(CMD_RDSCUR) ; // send 2Bh data = m_spi.write(DUMMY) ; // dummy m_cs = CS_HIGH ; return( data ) ; } uint32_t SPI_MX25R::readID(void) { uint8_t data; uint32_t data32 = 0 ; m_cs = CS_LOW ; m_spi.write(CMD_RDID) ; // send 9Fh data= m_spi.write(DUMMY) ; // dumy to get 1st Byte out data32 = data32 | data ; // put in 32b reg data= m_spi.write(DUMMY) ; // dummy to get 2nd Byte out data32 = (data32 << 8) | data ; // shift and put in reg data= m_spi.write(DUMMY) ; // dummy to get 3rd Byte out data32 = (data32 << 8) | data ; // shift again and put in reg m_cs = CS_HIGH ; return( data32 ) ; } uint32_t SPI_MX25R::readREMS(void) { uint8_t data; uint32_t data32 = 0 ; m_cs = CS_LOW ; m_spi.write(CMD_REMS) ; // send 90h m_spi.write(DUMMY) ; // send DUMMY1 m_spi.write(DUMMY) ; // send DUMMY2 m_spi.write(0) ; // send address=0x00 to get Manu ID 1st. data= m_spi.write(DUMMY) ; // dumy to get Manufacturer ID= C2h out data32 = data32 | data ; // put in 32b reg data= m_spi.write(DUMMY) ; // dummy to get 2nd Byte = Device ID out data32 = (data32 << 8) | data ; // shift and put in reg m_cs = CS_HIGH ; return( data32 ) ; } uint8_t SPI_MX25R::readRES(void) { uint8_t data; m_cs = CS_LOW ; m_spi.write(CMD_RES) ; // send ABh m_spi.write(DUMMY) ; // send DUMMY1 m_spi.write(DUMMY) ; // send DUMMY2 m_spi.write(DUMMY) ; // send DUMMY3 data= m_spi.write(DUMMY) ; // dumy to get Electronic Sig. out m_cs = CS_HIGH ; return( data ) ; } void SPI_MX25R::programPage(int addr, uint8_t *data, int numData) { int i ; m_cs = CS_LOW ; m_spi.write(CMD_PP) ; // Program Page 02h m_spi.write((addr >> 16)&0xFF) ; // adr 23:16 m_spi.write((addr >> 8)&0xFF) ; // adr 15:8 m_spi.write(addr & 0xFF) ; // adr 7:0 for (i = 0 ; i < numData ; i++ ) { // data = 00, 01, 02, .. to FEh, FFh = all 256 Bytes in 1 page. m_spi.write(data[i]) ; } m_cs = CS_HIGH ; // poll in main } void SPI_MX25R::writeStatusreg(int addr) // Write SR cmd 01h + 3B data { m_cs = CS_LOW ; m_spi.write(CMD_WRSR) ; // Write SR cmd 01h m_spi.write((addr >> 16)&0xFF) ; // address m_spi.write((addr >> 8)&0xFF) ; m_spi.write(addr & 0xFF) ; m_cs = CS_HIGH ; } void SPI_MX25R::writeSecurityreg(int addr) // WRSCUR cmd 2Fh + 1B data { m_cs = CS_LOW ; m_spi.write(CMD_WRSCUR) ; // Write SR cmd 01h m_spi.write(addr & 0xFF) ; m_cs = CS_HIGH ; } void SPI_MX25R::blockErase(int addr) // 64KB Block Erase { uint8_t data[3] ; data[0] = (addr >> 16) & 0xFF ; data[1] = (addr >> 8) & 0xFF ; data[2] = (addr & 0xFF) ; m_cs = CS_LOW ; m_spi.write(CMD_BE) ; for (int i = 0 ; i < 3 ; i++ ) { // Address setting m_spi.write(data[i]) ; } m_cs = CS_HIGH ; // poll in main } void SPI_MX25R::blockErase32KB(int addr) // 32KB Block Erase { uint8_t data[3] ; data[0] = (addr >> 16) & 0xFF ; data[1] = (addr >> 8) & 0xFF ; data[2] = (addr & 0xFF) ; m_cs = CS_LOW ; m_spi.write(CMD_32KBE) ; for (int i = 0 ; i < 3 ; i++ ) { // Address Setting m_spi.write(data[i]) ; } m_cs = CS_HIGH ; // poll in main } void SPI_MX25R::sectorErase(int addr) // 4KB Sector Erase { uint8_t data[3] ; data[0] = (addr >> 16) & 0xFF ; data[1] = (addr >> 8) & 0xFF ; data[2] = (addr & 0xFF) ; m_cs = CS_LOW ; m_spi.write(CMD_SE) ; for (int i = 0 ; i < 3 ; i++ ) { // Address Setting m_spi.write(data[i]) ; } m_cs = CS_HIGH ; // poll in main } void SPI_MX25R::chipErase(void) // Chip Erase { m_cs = CS_LOW ; m_spi.write(CMD_CE) ; m_cs = CS_HIGH ; // poll in main } uint8_t SPI_MX25R::read8(int addr) // Single Byte Read { uint8_t data ; m_cs = CS_LOW ; m_spi.write(CMD_READ) ; // send 03h m_spi.write((addr >> 16)&0xFF) ; m_spi.write((addr >> 8)&0xFF) ; m_spi.write(addr & 0xFF) ; data = m_spi.write(DUMMY) ; // write data is dummy m_cs = CS_HIGH ; return( data ) ; // return 1 byte } uint8_t SPI_MX25R::readSFDP(int addr) // Read SFDP { uint8_t data ; m_cs = CS_LOW ; m_spi.write(CMD_RDSFDP) ; // send cmd 5Ah m_spi.write((addr >> 16)&0xFF) ; // address[23:16] m_spi.write((addr >> 8)&0xFF) ; // address[15:8] m_spi.write(addr & 0xFF) ; // address[7:0] m_spi.write(DUMMY) ; // dummy cycle data = m_spi.write(DUMMY) ; // return 1 byte m_cs = CS_HIGH ; return( data ) ; } uint8_t SPI_MX25R::readFREAD(int addr) // x1 Fast Read Data Byte { uint8_t data ; m_cs = CS_LOW ; m_spi.write(CMD_FREAD) ; // send cmd 0BH m_spi.write((addr >> 16)&0xFF) ; // address[23:16] m_spi.write((addr >> 8)&0xFF) ; // address[15:8] m_spi.write(addr & 0xFF) ; // address[7:0] m_spi.write(DUMMY) ; // dummy cycle data = m_spi.write(DUMMY) ; // return 1 byte m_cs = CS_HIGH ; return( data ) ; } void SPI_MX25R::readNBytes(int addr, uint8_t *data, int nBytes) // read sequential n bytes { int i; m_cs = CS_LOW ; m_spi.write(CMD_READ) ; // send 03h m_spi.write((addr >> 16)&0xFF) ; m_spi.write((addr >> 8)&0xFF) ; m_spi.write(addr & 0xFF) ; for (i = 0 ; i < nBytes ; i++ ) { // data: sequential data bytes data[i] = m_spi.write(DUMMY) ; } m_cs = CS_HIGH ; }