ISSI IS25LQ032B 3V-Quad Serial Flash Memory with Multi-I/O SPI
Dependents: testSPI_IS25LQ032B SPI_Flash_erase
SPI Flash Memory ISSI IS25LQ032B library.
Although the device has lots of features, only a small portion of commands were implemented. (sorry)
For the data sheet please refer to http://www.issi.com/WW/pdf/25LQ080B-016B-032B.pdf
SPI_IS25LQ032B.cpp
- Committer:
- Rhyme
- Date:
- 2014-12-25
- Revision:
- 0:3f3dd929e3e5
File content as of revision 0:3f3dd929e3e5:
/** SPI_IS25LQ032B ISSI 3V - QUAD SERIAL FLASH MEMORY MULTI-I/O SPI * Data Sheet: http://www.issi.com/WW/pdf/25LQ080B-016B-032B.pdf * */ #include "SPI_IS25LQ032B.h" #define CMD_RD 0x03 #define CMD_FR 0x0B #define CMD_FRDIO 0xBB #define CMD_FRDO 0x3B #define CMD_FRQIO 0xEB #define CMD_FRQO 0x6B #define CMD_PP 0x02 #define CMD_PPQ 0x38 #define CMD_SER 0xD7 #define CMD_SER2 0x20 #define CMD_BER32 0x52 #define CMD_BER64 0xD8 #define CMD_CER 0xC7 #define CMD_WREN 0x06 #define CMD_WRDI 0x04 #define CMD_RDSR 0x05 #define CMD_WRSR 0x01 #define CMD_RDFR 0x48 #define CMD_WRFR 0x42 #define CMD_PERSUS 0x75 #define CMD_PERSUS2 0xB0 #define CMD_PERRSM 0x7A #define CMD_PERRSM2 0x30 #define CMD_DP 0xB9 #define CMD_RDID 0xAB #define CMD_RDPD 0xAB #define CMD_RDUID 0x4B #define CMD_RDJDID 0x9F #define CMD_RDMDID 0x90 #define CMD_RDSFDP 0x5A #define CMD_RSTEN 0x66 #define CMD_RST 0x99 #define CMD_RSTM 0xFF #define CMD_IRP 0x62 #define CMD_IRRD 0x68 SPI_IS25LQ032B::SPI_IS25LQ032B(PinName mosi, PinName miso, PinName sclk, PinName cs) : m_spi(mosi, miso, sclk), m_cs(cs) { // activate the peripheral } SPI_IS25LQ032B::~SPI_IS25LQ032B() { } void SPI_IS25LQ032B::writeEnable(void) { m_cs = 0 ; m_spi.write(CMD_WREN) ; m_cs = 1 ; } void SPI_IS25LQ032B::writeDisable(void) { m_cs = 0 ; m_spi.write(CMD_WRDI) ; m_cs = 1 ; } uint8_t SPI_IS25LQ032B::readStatus(void) { uint8_t data ; m_cs = 0 ; m_spi.write(CMD_RDSR) ; data = m_spi.write(CMD_RDSR) ; // write data is dummy m_cs = 1 ; return( data ) ; } void SPI_IS25LQ032B::writeStatus(uint8_t newStatus) { m_cs = 0 ; m_spi.write(CMD_WRSR) ; m_spi.write(newStatus) ; m_cs = 1 ; } uint8_t SPI_IS25LQ032B::readFunc(void) { uint8_t data ; m_cs = 0 ; m_spi.write(CMD_RDFR) ; data = m_spi.write(CMD_RDFR) ; m_cs = 1 ; return(data) ; } void SPI_IS25LQ032B::writeFunc(uint8_t newValue) { m_cs = 0 ; m_spi.write(CMD_WRFR) ; m_spi.write(newValue) ; m_cs = 1 ; } void SPI_IS25LQ032B::programPage(int addr, uint8_t *data, int numData) { int i ; m_cs = 0 ; m_spi.write(CMD_PP) ; // Program Page m_spi.write((addr >> 16)&0xFF) ; m_spi.write((addr >> 8)&0xFF) ; m_spi.write(addr & 0xFF) ; for (i = 0 ; i < numData ; i++ ) { m_spi.write(data[i]) ; } m_cs = 1 ; // you need to check RDSR WIP bit to be 0 to wait completion } void SPI_IS25LQ032B::chipErase(void) { m_cs = 0 ; m_spi.write(CMD_CER) ; m_cs = 1 ; } uint8_t SPI_IS25LQ032B::read8(int addr) { uint8_t data ; m_cs = 0 ; m_spi.write(CMD_RD) ; m_spi.write((addr >> 16)&0xFF) ; m_spi.write((addr >> 8)&0xFF) ; m_spi.write(addr & 0xFF) ; data = m_spi.write(addr & 0xFF) ; // write data is dummy m_cs = 1 ; return( data ) ; }