在网上找不到Arduino操作WinbondFlash存储芯片的库,所以自己写了一个。
支持的芯片:W25Q80,W25Q16,W25Q32,W25Q64,W25Q128
目前只测试了W25Q64,其他的芯片只是容量不同,ID号不同,应该是可以直接使用的。
测试截图
使用方法很简单:
1. 先声明一个flash存储器
winbondFlashSPI mem;
2. 启动存储器
if(XXXXXXgin(_W25Q64,SPI,SS)) //这里指定你的芯片型号 XXXXXXXXXintln("OK");else
{
XXXXXXXXXintln("FAILED");}
如果型号与读出的芯片ID对不上,begin()函数会返回false,表示初始化失败
3. 进行读写操作
uint16_t read (uint32_t addr,uint8_t *buf,uint16_t n=256);//从addr读n字节数据到buf
void setWriteEnable(bool cmd = true);//写入或者擦除之前,请先打开写入功能
uint16_t write(uint32_t addr,uint8_t *buf,uint16_t n=256);//buf有n字节数据,写入到addr位置
读写地址addr均为绝对地址,按byte计算的。如果想要获得比较好的性能,则需要对齐到256byte的扇区,也就是地址为256的倍数,数据长度n也要是256的倍数,尤其是写入的时候,这个十分重要。
4. 更多API参见头文件
bool begin(partNumber _partno = autoDetect);
void end();
long bytes();
uint16_t pages();
uint16_t sectors();
uint16_t blocks();
uint16_t read (uint32_t addr,uint8_t *buf,uint16_t n=256);
void setWriteEnable(bool cmd = true);
bool writeEnable();
//setWriteEnable(true) before write or erase
uint16_t write(uint32_t addr,uint8_t *buf,uint16_t n=256);
bool erase(uint32_t addr,uint32_t n=4096);
//auto erase: sector(s), 32k block(s), 64k block(s) select by size
bool eraseSector(uint32_t addr_start,uint32_t n=4096);
//erase multiple sectors ( 4096bytes ), return false if error
bool erase32kBlock(uint32_t addr_start,uint32_t n=32768);
//erase multiple 32k blocks ( 32768b )
bool erase64kBlock(uint32_t addr_start,uint32_t n=65536);
//erase multiple 64k blocks ( 65536b )
bool eraseAll();
//chip erase, return true if successfully started, busy()==false -> erase complete
void eraseSuspend();
void eraseResume();
bool busy();
bool sync();//wait all operations complete
//return true when exit normally, return false = timeout
inline void setTimeout(uint16_t ms) {m_timeout=ms;}
//timeout == 0 -> do once, timeout < 0 -> wait forever
inline uint16_t timeout() {return m_timeout;}
uint8_t readManufacturer();
uint16_t readPartID();
uint64_t readUniqueID();
uint16_t readSR();
代码在此,欢迎试用
spiFlashTest.tar.7z
3.75KB
7Z
102次下载
第一次更新:
winbondflash.tar.gz
24.90KB
GZ
292次下载
GoogleCode项目主页
XXXXXXXXXXXXXXXXXXXXXXX/p/winbondflash/
200字以内,仅用于支线交流,主线讨论请采用回复功能。