文号
t58726
阅读
19514
回复
8
收藏
11
【地摊航电】如何使用Arduino操作W25Q64
2013/07/19
IP:湖北
在网上找不到Arduino操作WinbondFlash存储芯片的库,所以自己写了一个。
支持的芯片:W25Q80,W25Q16,W25Q32,W25Q64,W25Q128
目前只测试了W25Q64,其他的芯片只是容量不同,ID号不同,应该是可以直接使用的。

测试截图
Screenshot from 2013-07-19 19:36:49.png

使用方法很简单:
1. 先声明一个flash存储器
winbondFlashSPI mem;
2. 启动存储器
if(mem.begin(_W25Q64,SPI,SS)) //这里指定你的芯片型号
    Serial.println("OK");
else
{
  Serial.println("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();


代码在此,欢迎试用

attachment icon spiFlashTest.tar.7z 3.75KB 7Z 110次下载

第一次更新:

attachment icon winbondflash.tar.gz 24.90KB GZ 327次下载

GoogleCode项目主页
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+200
科创币
game00over
2013/07/19
支持!~
+8
科创币
daxus
2013/07/20
貌似可以用来刷BIOS哦,当年我就刷爆一个,然后想用51自己搞个烧录器,失败了。。。
+18
科创币
布布卡
2013/08/12
高质量发帖
13年5个月前IP:未同步
549875
1楼
支持,猴子又为人民群众做贡献了[s:274]
引用
评论
13年5个月前IP:未同步
550090
2楼
貌似可以用来刷BIOS哦,当年我就刷爆一个,然后想用51自己搞个烧录器,失败了。。。
+1
科创币
warmonkey
2013/07/21
可以用flashrom这个程序来刷,或者用这个库
引用
评论
13年5个月前IP:未同步
550132
3楼
W25Q64不正是我P8Z68的BIOS芯片嘛!
引用
评论
13年2个月前IP:未同步
651340
4楼
ubuntu
引用
评论
11年0个月前IP:广东
799764
5楼
哈哈,这下子可以做一个spi flash烧录器了,可以和openwrt tl-wr703n放在一起看看能不能搞个什么出来
引用
评论
warmonkey作者
11年0个月前IP:广东
799804
6楼
引用 votten51:
哈哈,这下子可以做一个spi flash烧录器了,可以和openwrt tl-wr703n放在一起看看能不能搞个什么出来
烧录请用专业烧录软件flashrom。楼主位的代码适合嵌入式系统开发,不适合作为烧录机用途。
引用
评论
10年10个月前IP:四川
808350
7楼
现在还弄嘛?航电是问题啊
引用
评论
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的