https://github.com/nopnop2002/raspberry-w25q64
SPI Flash Memory W25Q64 Access Library for RaspberryPi
https://github.com/nopnop2002/raspberry-w25q64
orangepi raspberrypi spiflash w25q128 w25q16 w25q32 w25q64 w25q80
Last synced: 4 months ago
JSON representation
SPI Flash Memory W25Q64 Access Library for RaspberryPi
- Host: GitHub
- URL: https://github.com/nopnop2002/raspberry-w25q64
- Owner: nopnop2002
- License: mit
- Created: 2017-03-25T04:08:22.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2024-03-02T01:20:29.000Z (over 1 year ago)
- Last Synced: 2025-02-28T19:52:59.945Z (5 months ago)
- Topics: orangepi, raspberrypi, spiflash, w25q128, w25q16, w25q32, w25q64, w25q80
- Language: C
- Homepage:
- Size: 35.2 KB
- Stars: 49
- Watchers: 8
- Forks: 18
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Raspberry-W25Q64
SPI Flash Memory W25Q64 Access Library for RaspberryPi
I ported from here.https://github.com/Tamakichi/Arduino-W25Q64
# Software requirement
WiringPi Library
This project uses the wiringPiSPISetup() function to initialize SPI, and use /dev/spidev0.0.
If you use it on a board other than the RPI board, you may need to change the SPI device.
As far as I know, there are these libraries.
- WiringPi for OrangePi
- WiringPi for BananaPi
- WiringPi for NanoPi
- WiringPi for Pine-64# Build
```
git clone https://github.com/nopnop2002/Raspberry-W25Q64
cd Raspberry-W25Q64
make
```# API
// Start Flash
void W25Q64_begin(uint8_t spich);// Get status register1
uint8_t W25Q64_readStatusReg1(void);// Get status register2(Winbond only)
uint8_t W25Q64_readStatusReg2(void);// Get JEDEC ID(Manufacture, Memory Type,Capacity)
void W25Q64_readManufacturer(uint8_t* jedc);// Get Unique ID(Winbond only)
void W25Q64_readUniqieID(uint8_t* id);// Check busy
bool W25Q64_IsBusy(void);// Set power down mode
void W25Q64_powerDown(void);// Set write enable
void W25Q64_WriteEnable(void);// Set write disable
void W25Q64_WriteDisable(void);// Read data from memory
uint16_t W25Q64_read(uint32_t addr,uint8_t *buf,uint16_t n);// First read data from memory
uint16_t W25Q64_fastread(uint32_t addr,uint8_t *buf,uint16_t n);// Erase data by Sector
bool W25Q64_eraseSector(uint16_t sect_no, bool flgwait);// Erase data by block(64KB)
bool W25Q64_erase64Block(uint16_t blk_no, bool flgwait);// Erase data by Block(32KB)
bool W25Q64_erase32Block(uint16_t blk_no, bool flgwait);// Erase all data
bool W25Q64_eraseAll(bool flgwait);// Write data to memory
uint16_t W25Q64_pageWrite(uint16_t sect_no, uint16_t inaddr, uint8_t* data, uint16_t n);# Wireing

# Winbond
|Device|# of Bytes|Address range|# of 4K-Sectors|# of 32K-Blocks|# of 64K-Blocks|JEDEC ID|
|:---|:---|:---|:---|:---|:---|:---|
|W25Q80|1M|0x0FFFFF|256|32|16|EF-40-14|
|W25Q16|2M|0x1FFFFF|512|64|32|EF-40-15|
|W25Q32|4M|0x3FFFFF|1024|128|64|EF-40-16|
|W25Q64|8M|0x7FFFFF|2048|256|128|EF-40-17|
|W25Q128|16M|0xFFFFFF|4096|512|256|EF-40-18|The letters after the volume number indicate operating parameters.
For example W25Q64BV, W25Q64CV, W25Q64FV, W25Q64JV are all the same 8 MB flash drives, but with different maximum frequencies and speeds.
In theory you could replace slow with fast, but the other way around might not work.
- BV: 80MHz clock operation
- CV: 104MHz clock operation
- FV: 104MHz clock operation
- JV: 133MHz clock operation## W25Q80
- Manufacturer:
Byte1 : ManufacturerID(0xEF=Winbond)
Byte2 : MemoryType(0x40=SPI/0x60=QPI)
Byte3 : Capacity(2^0x14=2^20=0x100000=1M Byte=8M Bit)
- First 10Byte : ASCII 0-9
- Next 32Byte : ASCII A-Z## W25Q16
## W25Q32
## W25Q64
## W25Q128
# MACRONIX
|Device|# of Bytes|Address range|# of 4K-Sectors|# of 32K-Blocks|# of 64K-Blocks|JEDEC ID|
|:---|:---|:---|:---|:---|:---|:---|
|MX25L32|4M|0x3FFFFF|1024|128|64|C2-20-16|
|MX25L64|8M|0x7FFFFF|2048|256|128|C2-20-17|
|MX25L128|16M|0xFFFFFF|4096|512|256|C2-20-18|The letters after the volume number indicate operating parameters.
For example, MX25L3205, MX25L3205A, MX25L3205D, MX25L3206E are all the same 4 MB flash drives, but with different maximum frequencies and speeds.
In theory you could replace slow with fast, but the other way around might not work.
- MX25L3205 50MHz serial clock
- MX25L3205A 50MHz serial clock
- MX25L3205D 86MHz serial clock
- MX25L3206E 86MHz serial clock## MX25L32
- Manufacturer:
Byte1 : ManufacturerID(0xC2=Macronix)
Byte2 : MemoryType(0x20)
Byte3 : Capacity(2^0x16=2^22=0x400000=4M Byte=32M Bit)## MX25L64
## MX25L128
# Eon Silicon Solution
|Device|# of Bytes|Address range|# of 4K-Sectors|# of 32K-Blocks|# of 64K-Blocks|JEDEC ID|
|:---|:---|:---|:---|:---|:---|:---|
|EN25Q32B|4M|0x3FFFFF|1024|128|64|1C-30-16|
|EN25QH64|8M|0x7FFFFF|2048|256|128|1C-70-17|## EN25Q32B
- Manufacturer:
Byte1 : ManufacturerID(0x1C=Eon Silicon Solution)
Byte2 : MemoryType
Byte3 : Capacity(2^0x16=2^22=0x400000=4M Byte=32M Bit)## EN25QH64
# Note
I tested these.
But I couldn't get it working.
- GD25Q64
- SST25VF016B
- SST25VF032B