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 ...
随机推荐
- CentOS7修改ssh端口
http://www.cnblogs.com/rwxwsblog/p/5756894.html 修改/etc/ssh/sshd_config vi /etc/ssh/sshd_config #Port ...
- EMMA 覆盖率工具
1. EMMA 介绍 EMMA 是一个开源.面向 Java 程序测试覆盖率收集和报告工具.它通过对编译后的 Java 字节码文件进行插装,在测试执行过程中收集覆盖率信息,并通过支持多种报表格式对覆盖率 ...
- 转--activemq的官方中文文档
1 JMS 在介绍ActiveMQ之前,首先简要介绍一下JMS规范. 1.1 JMS的基本构件 1.1.1 连接工厂 连接工厂是客户用来创建连接的对象,例如ActiveMQ提供的ActiveMQCon ...
- adb命令检测apk启动时间、内存、CPU使用情况、流量、电池电量等——常用的adb命令
ADB:Android Debug Bridge,是Android SDK里一个可以直接操作安卓模拟器或真实设备的工具,颇为强大. 检测APP: adb shell am start -W p ...
- 什么是事件代理?DOM2.0标准事件模型的三个阶段
体验更优排版请移步原文:http://blog.kwin.wang/programming/js-event-delegation.html 事件代理,又称事件委托(Delegation),就是将处理 ...
- 利用maven实现差异化配置
回顾过去 生产环境,测试环境,开发环境在不同的环境下会有各种各样的配置,比如数据库链接地址,账户名,密码等等.不同环境下都需要配置,但是配置却又不同.以前分享过一篇文章,介绍了我之前A公司的差异化配置 ...
- Linux 如何杀死僵尸进程
问题描述: shell > top top - :: up days, :, user, load average: 0.23, 0.81, 1.07 Tasks: total, running ...
- Dreamweaver安装与破解
1.下载Dreamweaver cs6破解版解压包 打开下载网址http://pan.baidu.com/s/1jGr8pbK,点击下载,保存到自己想要保存的位置. 2.下载Dreamweaver c ...
- ES6中新添加的Array.prototype.fill
用法 array.fill(start=0, end=this.length) 示例 [1, 2, 3].fill(4) // [4, 4, 4] [1, 2, 3].fill(4, 1) // [1 ...
- ROS解决网页断流现象 (转)
“pppoe-client”接口,将“MAX MTU”和“MAX MRU”都设置成“” /ip firewall mangle add action=change-mss chain=forward ...