【地摊航电】如何使用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(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();


代码在此,欢迎试用

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

第一次更新:

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

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

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

文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}