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

Revision:
0:3f3dd929e3e5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SPI_IS25LQ032B.cpp	Thu Dec 25 00:46:17 2014 +0000
@@ -0,0 +1,134 @@
+/** 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 ) ;
+}