SPI Flash Memory ST M25PE20

Dependents:   testSPI_M25PE20

my SPI libirary for ST M25PE20.

I found the data sheet at

http://pdf1.alldatasheet.jp/datasheet-pdf/view/149113/STMICROELECTRONICS/M25PE20.html

Committer:
Rhyme
Date:
Thu Dec 25 04:32:22 2014 +0000
Revision:
0:580b55070577
commit before publish;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Rhyme 0:580b55070577 1 /*
Rhyme 0:580b55070577 2 * SPI_M25PE20 SPI-Flash Memory
Rhyme 0:580b55070577 3 * ST 1 and 2 Mbit, Low Voltage, Page-Erasable Serial Flash Memory
Rhyme 0:580b55070577 4 * with Byte-Alterability, 33 MHz SPI Bus, Standard Pin-out
Rhyme 0:580b55070577 5 */
Rhyme 0:580b55070577 6
Rhyme 0:580b55070577 7 #include "SPI_M25PE20.h"
Rhyme 0:580b55070577 8
Rhyme 0:580b55070577 9 #define CMD_WREN 0x06 /* Write Enable */
Rhyme 0:580b55070577 10 #define CMD_WRDI 0x04 /* Write Disable */
Rhyme 0:580b55070577 11 #define CMD_RDJDID 0x9F /* Read Identification */
Rhyme 0:580b55070577 12 #define CMD_RDSR 0x05 /* Read Status Register */
Rhyme 0:580b55070577 13 #define CMD_READ 0x03 /* Read Data Byte */
Rhyme 0:580b55070577 14 #define CMD_FAST_READ 0x0B /* Read Data Byte at Higher Speed */
Rhyme 0:580b55070577 15 #define CMD_PW 0x0A /* Page Write */
Rhyme 0:580b55070577 16 #define CMD_PP 0x02 /* Page Program */
Rhyme 0:580b55070577 17 #define CMD_PE 0xDB /* Page Erase */
Rhyme 0:580b55070577 18 #define CMD_SE 0xD8 /* Sector Erase */
Rhyme 0:580b55070577 19 #define CMD_DP 0xB9 /* Deep Power-down */
Rhyme 0:580b55070577 20 #define CMD_RDP 0xAB /* Release from Deep Power-down */
Rhyme 0:580b55070577 21
Rhyme 0:580b55070577 22 SPI_M25PE20::SPI_M25PE20(PinName mosi, PinName miso, PinName sclk, PinName cs) :
Rhyme 0:580b55070577 23 m_spi(mosi, miso, sclk), m_cs(cs) {
Rhyme 0:580b55070577 24 // activate the peripheral
Rhyme 0:580b55070577 25
Rhyme 0:580b55070577 26 }
Rhyme 0:580b55070577 27
Rhyme 0:580b55070577 28 SPI_M25PE20::~SPI_M25PE20() { }
Rhyme 0:580b55070577 29
Rhyme 0:580b55070577 30 void SPI_M25PE20::writeEnable(void)
Rhyme 0:580b55070577 31 {
Rhyme 0:580b55070577 32 m_cs = 0 ;
Rhyme 0:580b55070577 33 m_spi.write(CMD_WREN) ;
Rhyme 0:580b55070577 34 m_cs = 1 ;
Rhyme 0:580b55070577 35 }
Rhyme 0:580b55070577 36
Rhyme 0:580b55070577 37 void SPI_M25PE20::writeDisable(void)
Rhyme 0:580b55070577 38 {
Rhyme 0:580b55070577 39 m_cs = 0 ;
Rhyme 0:580b55070577 40 m_spi.write(CMD_WRDI) ;
Rhyme 0:580b55070577 41 m_cs = 1 ;
Rhyme 0:580b55070577 42 }
Rhyme 0:580b55070577 43
Rhyme 0:580b55070577 44 uint8_t SPI_M25PE20::readStatus(void)
Rhyme 0:580b55070577 45 {
Rhyme 0:580b55070577 46 uint8_t data ;
Rhyme 0:580b55070577 47 m_cs = 0 ;
Rhyme 0:580b55070577 48 m_spi.write(CMD_RDSR) ;
Rhyme 0:580b55070577 49 data = m_spi.write(CMD_RDSR) ; // write data is dummy
Rhyme 0:580b55070577 50 m_cs = 1 ;
Rhyme 0:580b55070577 51 return( data ) ;
Rhyme 0:580b55070577 52 }
Rhyme 0:580b55070577 53
Rhyme 0:580b55070577 54 void SPI_M25PE20::programPage(int addr, uint8_t *data, int numData)
Rhyme 0:580b55070577 55 {
Rhyme 0:580b55070577 56 int i ;
Rhyme 0:580b55070577 57 m_cs = 0 ;
Rhyme 0:580b55070577 58 m_spi.write(CMD_PP) ; // Program Page
Rhyme 0:580b55070577 59 m_spi.write((addr >> 16)&0xFF) ;
Rhyme 0:580b55070577 60 m_spi.write((addr >> 8)&0xFF) ;
Rhyme 0:580b55070577 61 m_spi.write(addr & 0xFF) ;
Rhyme 0:580b55070577 62 for (i = 0 ; i < numData ; i++ ) {
Rhyme 0:580b55070577 63 m_spi.write(data[i]) ;
Rhyme 0:580b55070577 64 }
Rhyme 0:580b55070577 65 m_cs = 1 ;
Rhyme 0:580b55070577 66 // you need to check RDSR WIP bit to be 0 to wait completion
Rhyme 0:580b55070577 67 }
Rhyme 0:580b55070577 68
Rhyme 0:580b55070577 69 void SPI_M25PE20::pageErase(int addr)
Rhyme 0:580b55070577 70 {
Rhyme 0:580b55070577 71 uint8_t data[3] ;
Rhyme 0:580b55070577 72 data[0] = (addr >> 16) & 0xFF ;
Rhyme 0:580b55070577 73 data[1] = (addr >> 8) & 0xFF ;
Rhyme 0:580b55070577 74 data[2] = (addr & 0xFF) ;
Rhyme 0:580b55070577 75 m_cs = 0 ;
Rhyme 0:580b55070577 76 m_spi.write(CMD_PE) ;
Rhyme 0:580b55070577 77 for (int i = 0 ; i < 3 ; i++ ) {
Rhyme 0:580b55070577 78 m_spi.write(data[i]) ;
Rhyme 0:580b55070577 79 }
Rhyme 0:580b55070577 80 m_cs = 1 ;
Rhyme 0:580b55070577 81 }
Rhyme 0:580b55070577 82
Rhyme 0:580b55070577 83 void SPI_M25PE20::sectorErase(int addr)
Rhyme 0:580b55070577 84 {
Rhyme 0:580b55070577 85 uint8_t data[3] ;
Rhyme 0:580b55070577 86 data[0] = (addr >> 16) & 0xFF ;
Rhyme 0:580b55070577 87 data[1] = (addr >> 8) & 0xFF ;
Rhyme 0:580b55070577 88 data[2] = (addr & 0xFF) ;
Rhyme 0:580b55070577 89 m_cs = 0 ;
Rhyme 0:580b55070577 90 m_spi.write(CMD_SE) ;
Rhyme 0:580b55070577 91 for (int i = 0 ; i < 3 ; i++ ) {
Rhyme 0:580b55070577 92 m_spi.write(data[i]) ;
Rhyme 0:580b55070577 93 }
Rhyme 0:580b55070577 94 m_cs = 1 ;
Rhyme 0:580b55070577 95 }
Rhyme 0:580b55070577 96
Rhyme 0:580b55070577 97 uint8_t SPI_M25PE20::read8(int addr)
Rhyme 0:580b55070577 98 {
Rhyme 0:580b55070577 99 uint8_t data ;
Rhyme 0:580b55070577 100 m_cs = 0 ;
Rhyme 0:580b55070577 101 m_spi.write(CMD_READ) ;
Rhyme 0:580b55070577 102 m_spi.write((addr >> 16)&0xFF) ;
Rhyme 0:580b55070577 103 m_spi.write((addr >> 8)&0xFF) ;
Rhyme 0:580b55070577 104 m_spi.write(addr & 0xFF) ;
Rhyme 0:580b55070577 105 data = m_spi.write(addr & 0xFF) ; // write data is dummy
Rhyme 0:580b55070577 106 m_cs = 1 ;
Rhyme 0:580b55070577 107 return( data ) ;
Rhyme 0:580b55070577 108 }