[ FORK ] SPI flash memory control library forked from jyam/W25X40BV
Dependents: 11u35_usbLocalFilesystem
Fork of W25X40BV by
W25X40BV.h@4:b422cdc9d751, 2016-02-28 (annotated)
- Committer:
- k4zuki
- Date:
- Sun Feb 28 15:22:40 2016 +0000
- Revision:
- 4:b422cdc9d751
- Parent:
- 3:6e3c0b23dc6e
- Child:
- 6:11e271d4fbc5
use SWSPI library; typedef; add page and block(4K/32K) erase
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
k4zuki | 4:b422cdc9d751 | 1 | /** W25X40BV.h |
k4zuki | 4:b422cdc9d751 | 2 | */ |
jyam | 1:cd41b8e3fdad | 3 | |
jyam | 1:cd41b8e3fdad | 4 | #ifndef W25X40BV_H |
jyam | 1:cd41b8e3fdad | 5 | #define W25X40BV_H |
jyam | 1:cd41b8e3fdad | 6 | |
jyam | 1:cd41b8e3fdad | 7 | #include "mbed.h" |
k4zuki | 4:b422cdc9d751 | 8 | #include "SWSPI.h" |
jyam | 1:cd41b8e3fdad | 9 | |
jyam | 1:cd41b8e3fdad | 10 | #define SPI_FREQ 1000000 |
jyam | 1:cd41b8e3fdad | 11 | #define SPI_MODE 0 |
jyam | 1:cd41b8e3fdad | 12 | #define SPI_NBIT 8 |
jyam | 1:cd41b8e3fdad | 13 | |
jyam | 1:cd41b8e3fdad | 14 | #define WE_INST 0x06 |
jyam | 1:cd41b8e3fdad | 15 | #define WD_INST 0x04 |
jyam | 1:cd41b8e3fdad | 16 | #define R_INST 0x03 |
jyam | 1:cd41b8e3fdad | 17 | #define W_INST 0x02 |
jyam | 1:cd41b8e3fdad | 18 | #define C_ERASE_INST 0x60 |
k4zuki | 4:b422cdc9d751 | 19 | #define P_ERASE_INST 0x81 |
k4zuki | 4:b422cdc9d751 | 20 | #define B4K_ERASE_INST 0x20 |
k4zuki | 4:b422cdc9d751 | 21 | #define B32K_ERASE_INST 0x52 |
jyam | 1:cd41b8e3fdad | 22 | |
jyam | 1:cd41b8e3fdad | 23 | #define DUMMY_ADDR 0x00 |
jyam | 1:cd41b8e3fdad | 24 | #define WAIT_TIME 1 |
jyam | 1:cd41b8e3fdad | 25 | |
k4zuki | 4:b422cdc9d751 | 26 | #define ADDR_BMASK2 0x001f0000 |
jyam | 1:cd41b8e3fdad | 27 | #define ADDR_BMASK1 0x0000ff00 |
jyam | 1:cd41b8e3fdad | 28 | #define ADDR_BMASK0 0x000000ff |
jyam | 1:cd41b8e3fdad | 29 | |
jyam | 1:cd41b8e3fdad | 30 | #define ADDR_BSHIFT2 16 |
jyam | 1:cd41b8e3fdad | 31 | #define ADDR_BSHIFT1 8 |
jyam | 1:cd41b8e3fdad | 32 | #define ADDR_BSHIFT0 0 |
jyam | 1:cd41b8e3fdad | 33 | |
k4zuki | 4:b422cdc9d751 | 34 | /** |
k4zuki | 4:b422cdc9d751 | 35 | W25X40BV |
k4zuki | 4:b422cdc9d751 | 36 | */ |
k4zuki | 4:b422cdc9d751 | 37 | class W25X40BV: public SWSPI { |
jyam | 1:cd41b8e3fdad | 38 | public: |
jyam | 1:cd41b8e3fdad | 39 | W25X40BV(PinName mosi, PinName miso, PinName sclk, PinName cs); |
jyam | 1:cd41b8e3fdad | 40 | |
k4zuki | 4:b422cdc9d751 | 41 | //! takes a 24-bit (3 bytes) address and returns the data (1 byte) at that location |
k4zuki | 4:b422cdc9d751 | 42 | uint32_t readByte(uint32_t addr); |
k4zuki | 4:b422cdc9d751 | 43 | //! takes the address in 3 separate bytes A[23,16], A[15,8], A[7,0] |
k4zuki | 4:b422cdc9d751 | 44 | uint32_t readByte(uint32_t a2, uint32_t a1,uint32_t a0); |
k4zuki | 4:b422cdc9d751 | 45 | //! takes a 24-bit address, reads count bytes, and stores results in buf |
k4zuki | 4:b422cdc9d751 | 46 | void readStream(uint32_t addr, uint8_t* buf, uint32_t count); |
k4zuki | 4:b422cdc9d751 | 47 | |
k4zuki | 4:b422cdc9d751 | 48 | //! takes a 24-bit (3 bytes) address and a byte of data to write at that location |
k4zuki | 4:b422cdc9d751 | 49 | void writeByte(uint32_t addr, uint32_t data); |
k4zuki | 4:b422cdc9d751 | 50 | //! takes the address in 3 separate bytes A[23,16], A[15,8], A[7,0] |
k4zuki | 4:b422cdc9d751 | 51 | void writeByte(uint32_t a2, uint32_t a1, uint32_t a0, uint32_t data); |
k4zuki | 4:b422cdc9d751 | 52 | /** write count bytes of data from buf to memory, starting at addr |
k4zuki | 4:b422cdc9d751 | 53 | * addr is expected to be 256 byte alignment: 0x000000,0x000100,...,0x01FF00 |
k4zuki | 4:b422cdc9d751 | 54 | * even if not, it works anyway. but should care count and 256byte edge: |
k4zuki | 4:b422cdc9d751 | 55 | * if count=3 while addr=0x????FE, 3rd byte will be written in 0x????00 |
k4zuki | 4:b422cdc9d751 | 56 | * @param addr 24 bit address |
k4zuki | 4:b422cdc9d751 | 57 | * @param buf data buffer |
k4zuki | 4:b422cdc9d751 | 58 | * @param count data count in byte |
k4zuki | 4:b422cdc9d751 | 59 | */ |
k4zuki | 4:b422cdc9d751 | 60 | void writeStream(uint32_t addr, uint8_t* buf, uint32_t count); |
jyam | 1:cd41b8e3fdad | 61 | |
k4zuki | 4:b422cdc9d751 | 62 | //! erase a page data(256bytes) on chip |
k4zuki | 4:b422cdc9d751 | 63 | void pageErase(uint8_t page); |
k4zuki | 4:b422cdc9d751 | 64 | |
k4zuki | 4:b422cdc9d751 | 65 | /** erase a block data(4Kbytes) on chip |
k4zuki | 4:b422cdc9d751 | 66 | * @param block block number 0x0000 - 0x001F |
k4zuki | 4:b422cdc9d751 | 67 | * block number will be left-shifted by 4 bits: 0x0000 - 0x01F0 |
k4zuki | 4:b422cdc9d751 | 68 | * and a dummy address byte (0x00) will be added |
k4zuki | 4:b422cdc9d751 | 69 | */ |
k4zuki | 4:b422cdc9d751 | 70 | void block4Erase(uint16_t block); |
jyam | 1:cd41b8e3fdad | 71 | |
k4zuki | 4:b422cdc9d751 | 72 | /** erase a block data(32Kbytes) on chip |
k4zuki | 4:b422cdc9d751 | 73 | * @param block number 0x00 - 0x03 |
k4zuki | 4:b422cdc9d751 | 74 | * block number will be left-shifted by 3 bits: 0x00 - 0x18 |
k4zuki | 4:b422cdc9d751 | 75 | * and two dummy address bytes (0x0000) will be added |
k4zuki | 4:b422cdc9d751 | 76 | */ |
k4zuki | 4:b422cdc9d751 | 77 | void block32Erase(uint8_t block); |
k4zuki | 4:b422cdc9d751 | 78 | void chipErase(); //! erase all data on chip |
jyam | 1:cd41b8e3fdad | 79 | |
jyam | 1:cd41b8e3fdad | 80 | private: |
k4zuki | 4:b422cdc9d751 | 81 | void writeEnable(); //! write enable |
k4zuki | 4:b422cdc9d751 | 82 | void writeDisable(); //! write disable |
k4zuki | 4:b422cdc9d751 | 83 | void chipEnable(); //! chip enable |
k4zuki | 4:b422cdc9d751 | 84 | void chipDisable(); //! chip disable |
jyam | 1:cd41b8e3fdad | 85 | |
k4zuki | 4:b422cdc9d751 | 86 | //! SPI _spi; |
jyam | 1:cd41b8e3fdad | 87 | DigitalOut _cs; |
jyam | 1:cd41b8e3fdad | 88 | }; |
jyam | 1:cd41b8e3fdad | 89 | |
k4zuki | 4:b422cdc9d751 | 90 | #endif |