Arduino SPI + SPI Flash芯片W25Q80BV
W25Q80BV是台湾华邦电子(Winbond)生产的8M-bit串行flash芯片。主要特性有:
- 工作电压:2.5 ~ 3.6 V
- 功耗:读写(active)时4mA,低功耗(power-down)时<1μA
- 容量:8M-bit/1M-byte,包含4096个页(每页大小256字节)
- 接口:Standard/Dual/Quad SPI,支持时钟频率最高104MHz
- 支持以4/32/64k-bytes为单位进行Sector/Block擦除
- 一次写入最多256字节
- 软件/硬件写保护功能
- 大于10万次擦除/编程寿命
- 大于20年的数据保存时间
- 封装:SOIC/USON/WSON/PDIP
管脚定义


与Arduino的连接
采用工作于3.3V的Pro Mini版本进行简单调试,接法如下。

其中HOLD脚须上拉接到3.3V,否则器件无法正常工作;WP脚可以浮空。
W25Q80BV Pro Mini (3.3V/8MHz)
VCC <------> 3.3V
GND <------> GND
/CS <------> SS (D10)
DI <------> MOSI (D11)
DO <------> MISO (D12)
CLK <------> SCK (D13)
功能调试
1. 与I2C不同,利用SPI库操作时,读和写都用同一个函数SPI.transfer()实现。
2. 读取时,可以任意地址、任意长度进行读取。
3. 与EEPROM不同,SPI Flash写入前,需要对写入的存储空间进行擦除(Erase)操作,否则写入不成功。芯片支持Chip Erase(整片擦除)、Block Erase(32K bytes/64K bytes块擦除)和Sector Erase(4K bytes扇区擦除)。
4. 当写操作对应的地址空间到达page的边界,再继续写入时目的地址会自动roll over到本页的起始位置。
测试代码
/*
communication with W25Q80BV (1 MBYTE SPI FLASH) using Arduino Pro Mini 3.3V/8MHz
Reference: http://www.instructables.com/id/How-to-Design-with-Discrete-SPI-Flash-Memory/?ALLSTEPS
*/ // the SPI bus uses pins 10 (SS), 11 (MOSI), 12 (MISO), and 13 (SCK) #include <SPI.h> #define READ_JEDEC_ID 0x9F
#define READ_STATUS_1 0x05
#define READ_DATA 0x03
#define WRITE_ENABLE 0x06
#define PAGE_PROGRAM 0x02
#define CHIP_ERASE 0xC7 byte pageBuffer[];
char str[] = "An apple a day keeps the doctor away."; //short than 256 void setup()
{
SPI.begin();
SPI.setDataMode(SPI_MODE0);
SPI.setBitOrder(MSBFIRST);
Serial.begin(); ReadID();
EraseChip();
WritePage(0x1234, str, sizeof(str));
} void loop()
{
ReadPage(0x1234, pageBuffer, sizeof(str)); for(int i = ; i < sizeof(str); i++)
{
Serial.print(char(pageBuffer[i]));
}
Serial.println(); delay();
} void CheckBusy()
{
digitalWrite(SS, HIGH);
digitalWrite(SS, LOW);
SPI.transfer(READ_STATUS_1);
while(SPI.transfer() & 0x01);
digitalWrite(SS, HIGH);
} void ReadID()
{
digitalWrite(SS, HIGH);
digitalWrite(SS, LOW);
SPI.transfer(READ_JEDEC_ID);
byte manuID = SPI.transfer();
byte memoType = SPI.transfer();
byte capa = SPI.transfer();
digitalWrite(SS, HIGH); Serial.print("Manufacturer ID: "); Serial.println(manuID, HEX);
Serial.print("Memory Type: "); Serial.println(memoType, HEX);
Serial.print("Capacity : "); Serial.println(capa, HEX); CheckBusy();
} void ReadPage(word pageNumber, byte pageBuffer[], int length)
{
// pageNumber: 16-bit data
digitalWrite(SS, HIGH);
digitalWrite(SS, LOW);
SPI.transfer(READ_DATA);
SPI.transfer((pageNumber >> ) & 0xFF);
SPI.transfer(pageNumber & 0xFF);
SPI.transfer();
for(int i = ; i < length; i++)
{
pageBuffer[i] = SPI.transfer();
}
digitalWrite(SS, HIGH);
CheckBusy();
} void WritePage(word pageNumber, char pageBuffer[], int length)
{
digitalWrite(SS, HIGH);
digitalWrite(SS, LOW);
SPI.transfer(WRITE_ENABLE);
digitalWrite(SS, HIGH);
digitalWrite(SS, LOW);
SPI.transfer(PAGE_PROGRAM);
SPI.transfer((pageNumber >> ) & 0xFF);
SPI.transfer(pageNumber & 0xFF);
SPI.transfer();
for(int i = ; i < length; i++)
{
SPI.transfer(byte(pageBuffer[i]));
}
digitalWrite(SS, HIGH);
CheckBusy();
} void EraseChip()
{
digitalWrite(SS, HIGH);
digitalWrite(SS, LOW);
SPI.transfer(WRITE_ENABLE);
digitalWrite(SS, HIGH);
digitalWrite(SS, LOW);
SPI.transfer(CHIP_ERASE);
digitalWrite(SS, HIGH);
CheckBusy();
}
读取芯片的ID信息,向W25Q80BV写入一段字符串,再将写入的信息反复读出:

参考资料
W25Q80BV datasheet - Winbond
Arduino - SPI
Designing with Discrete SPI Flash Memory - InstructablesFlash芯片硬件特性
Arduino SPI + SPI Flash芯片W25Q80BV的更多相关文章
- STM32F10X SPI操作flash MX25L64读写数据(转)
源:STM32F10X SPI操作flash MX25L64读写数据 前一段时间在弄SPI,之前没接触过嵌入式外围应用,就是单片机也只接触过串口通信,且也是在学校的时候了.从离开手机硬件测试岗位后,自 ...
- SPI操作flash MX25L64读写数据
STM32F10X SPI操作flash MX25L64读写数据 简单的一种应用,ARM芯片作为master,flash为slaver,实现单对单通信.ARM主控芯片STM32F103,flash芯片 ...
- Arduino 与 SPI 结合使用 以及SPI 深层理解
本文主要讲解两部分内容,不做任何转发,仅个人学习记录: 一. Arduino 与 SPI 结合使用 : 二. SPI 深层理解 有价值的几个好的参考: 1. 中文版: https://blog.cs ...
- STM32—SPI读写FLASH
目录 FLASH简介 W25Q64 W25Q64简介 FLASH控制指令 FLASH内部存储结构 代码讲解 读取芯片ID 发送写使能信号 等待FLASH不忙 擦除扇区 写入数据 读取数据 注 FLAS ...
- spi nor flash使用汇总
Overview SPI flash, 分为spi flash, DUAL spi flash, QUAD spi flash, 3-wire spi, 4-wire spi, 6-wire spi. ...
- 【DSP开发】TMS320C66x DSP SPI Nor Flash的程序烧写
经过一段时间的研究终于把TMS320C6657单核和双核的SPI Nor Flash的程序烧写调通了.工具都是前辈的工作,有需要的可以留下邮箱,我有空可以发. 原理参考钱丰的<TI c66x 系 ...
- Nor Flash芯片特性分析
Nor Flash是Intel在1988年推出的非易失闪存芯片,可随机读取,擦写时间长,可以擦写1~100W次,支持XIP(eXecute In Place). 本文以JS28F512M29EWH为例 ...
- Nand flash 芯片工作原理
Nand flash 芯片型号为 Samsung K9F1208U0B,数据存储容量为 64MB,采用块页式存储管理.8 个 I/O 引脚充当数据.地址.命令的复用端口. 芯片内部存储布局及存储操作特 ...
- FLASH 存储学习-串行SPI NOR FLASH
1.1 SST25VF080B简介1.1.1 主要特性 关键点:容量.速度(时钟速度.读写速度).功耗. l 容量:8MBit: l 最高SPI时钟频率:50MHz: l 低功耗模式下电流消耗:5uA ...
随机推荐
- C#中 标识符“XXX”不符合 CLS
标识符“XXX”不符合 CLS,意思是只要是不与外面有接口,比如在私有函数中操作,可是使用一些不符合cls的类型,但是如果是公共的,就必须要符合这个规范. 解决方法是,将这个类中的这些public类型 ...
- [转] c# 操作Word
来自 风过四季天 的原文 c# 操作Word总结 在医疗管理系统中为保存患者的体检和治疗记录,方便以后的医生或其他人查看.当把数据保存到数据库中,需要新建很多的字段,而且操作很繁琐,于是想 到网页的信 ...
- Django 使用体会
最近急于赶项目,少有更新博文.如今项目大致不那么赶了,终于可以在晚上码字码文章,而不是码代码了. 从开始使用Django开发到现在, 也已经有大半年了.公司的项目也是逐步地加功能,加模块,一步步完善设 ...
- 将本地Jar包安装到maven仓库中去
开发中会遇到无法通过pom.xml下载jar包的情况,遇到这种情况我们可以手动在本地安装jar包到本地仓库中去,这样就可以下次再用到的话不用再次联网下载,具体以oracle的驱动包ojdbc6.jar ...
- ubuntu Qt5 opencv3.4 项目配置
#------------------------------------------------- # # Project created by QtCreator 2019-03-25T14:14 ...
- leetcode array解题思路
Array *532. K-diff Pairs in an Array 方案一:暴力搜索, N平方的时间复杂度,空间复杂度N 数组长度为10000,使用O(N平方)的解法担心TLE,不建议使用,尽管 ...
- win7 + eclipse + cocos2dx 开发环境配置
最近想在win7上配置eclipse+cocos2dx开发环境,在安装之前一定要注意每项是32位还是64位,我选择的都是64位版本的,闲话少叙我们开始安装吧! 1.下载cocos2dx,我选择的是co ...
- turntable
1.业务流程 2.80001代码逻辑 3.80002代码逻辑 4抽奖概率计算
- 工作流系统webservice服务
http://blog.csdn.net/zhengzhb/article/details/7477616
- IBatis模糊查询
IBatis模糊查询 补充: mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * ...