加载中
加载中
表情图片
评为精选
鼓励
加载中...
分享
加载中...
文件下载
加载中...
修改排序
加载中...
【地摊航电】如何使用Arduino操作W25Q64
warmonkey2013/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 108次下载

第一次更新:

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

GoogleCode项目主页
https://code.google.com/p/winbondflash/
+200  科创币    game00over    2013/07/19 支持!~
+8  科创币    daxus    2013/07/20 貌似可以用来刷BIOS哦,当年我就刷爆一个,然后想用51自己搞个烧录器,失败了。。。
+18  科创币    布布卡    2013/08/12 高质量发帖
来自:自助服务区 / 会员海报
8
新版本公告
~~空空如也
虎哥
12年3个月前 IP:未同步
549875
支持,猴子又为人民群众做贡献了[s:274]
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
daxus
12年3个月前 IP:未同步
550090
貌似可以用来刷BIOS哦,当年我就刷爆一个,然后想用51自己搞个烧录器,失败了。。。
+1
科创币
warmonkey
2013-07-21
可以用flashrom这个程序来刷,或者用这个库
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
ddomax
12年3个月前 IP:未同步
550132
W25Q64不正是我P8Z68的BIOS芯片嘛!
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
wwb90828
11年11个月前 IP:未同步
651340
ubuntu
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
votten51
9年10个月前 IP:广东
799764
哈哈,这下子可以做一个spi flash烧录器了,可以和openwrt tl-wr703n放在一起看看能不能搞个什么出来
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
warmonkey作者
9年10个月前 IP:广东
799804
引用 votten51:
哈哈,这下子可以做一个spi flash烧录器了,可以和openwrt tl-wr703n放在一起看看能不能搞个什么出来
烧录请用专业烧录软件flashrom。楼主位的代码适合嵌入式系统开发,不适合作为烧录机用途。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
chemistry02
9年8个月前 IP:四川
808350
现在还弄嘛?航电是问题啊
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的