SPI_FLASH时序描述及驱动编程
推荐
分享一个朋友的人工智能教程,零基础!通俗易懂!希望你也加入到人工智能的队伍中来!
http://www.captainbed.net/strongerhuang
Ⅰ、写在前面
前面文章讲述过关于SPI的驱动(硬件SPI 和 软件模拟SPI),本文接着那篇文章来讲述关于SPI应用中【FLASH时序描述及驱动编程】。
写这篇文章的目的有两点:1.让大家知道SPI在实际应用开发中的重要意义; 2.让大家掌握SPI FLASH存储芯片的时序及驱动编程。
市面上的SPI FLASH类型很多,但是绝大部的芯片在硬件和软件上都是兼容的。虽然本文是以华邦的W25X16芯片为例来讲述时序。其实,其它大部分SPI FLASH都适用。
有必要看芯片手册,按照手册一步一步写程序吗?
1、如果你是初学者,而且还有很多时间,建议花些时间掌握一下! 原因在于作为嵌入式开发者,需要对芯片的编程有一定了解,在以后工作项目中如果有使用新的芯片,自己就能很容易编写驱动(如果没有现成的驱动)。
2、如果你是工作了一断时间,自己对芯片驱动编程有一些经验,在需要使用新的芯片,如果有现成的、比较成熟的驱动,那么,你可以不用再话费时间自己亲自编写驱动(编写驱动很费时间,还需要花费一定时间验证)。
关于本文的更多详情请往下看。
Ⅱ、实例工程下载
笔者针对于初学者提供的例程都是去掉了许多不必要的功能,精简了官方的代码,对初学者一看就明白,以简单明了的工程供大家学习。
笔者提供的实例工程都是在板子上经过多次测试并没有问题才上传至360云盘,欢迎下载测试、参照学习。
提供下载的软件工程是基于Keil(MDK-ARM) V5版本、STM32F103ZE芯片,但F1其他型号也适用(适用F1其他型号: 关注微信,回复“修改型号”)。
STM32F10x_SPI(硬件接口)读写Flash(25Q16)实例源代码工程:
https://yunpan.cn/c6mfRJWva6AJ2 访问密码
STM32F10x_SPI(软件模拟)读写Flash(25Q16)实例源代码工程:
https://yunpan.cn/c6mf6zyzCaMwd 访问密码
SPI FLASH资料:
https://yunpan.cn/c6SNxZMtiiZfc 访问密码 dbca
STM32F1资料:
https://yunpan.cn/crBUdUGdYKam2 访问密码 ca90
Ⅲ、关于SPI FLASH
1.SPI FLASH芯片系列
SPI FLASH的种类及型号有很多,但根据笔者的了解及经验,虽然存在这些差异,但他们之间的兼容性是很好的。
如:W25Xxx系列、W25Qxx系列、GD25Qxx系列、M25Pxx系列、KM25Lxx系列、SST25VFxx系列、AT25F系列等。
2.SPI FLASH命名
每一家公司的芯片型号命名可能略有差异,但看手册就能明白。我们以华邦的W25系列芯片来举例说明:

W:代表华邦公司
25X:代表SPI FLASH类型(25X是基本芯片, 25Q是快速芯片)
16:代表16MBit,即2M字节(64代表8M字节, 128代表16M字节,依次下去)
这个需要大家了解的(主要在项目研发初级阶段对芯片的选型上使用到)。其他公司的芯片,查看方法类似.对比如图是ST公司的M25PExx系列芯片:

3.W25Xxx读写特性
读:无要求
写:需要擦除才能写,一次最多可写入256字节(可编程页)。
擦除:最小扇区擦除(4K)、可块擦除(64K)、 可整个芯片擦除。
Ⅳ、SPI FLASH时序及编程
这里还是以华邦的W25X16为例来说明(其他大部分兼容),请下载手册【W25Xxx手册(英文版)】参考。
1.预先了解W25Xxx
A.控制和状态寄存器命令(默认:0x00)
BIT位 7 6 5 4 3 2 1 0
SPR RV TB BP2 BP1 BP0 WEL BUSY
SPR:默认0,状态寄存器保护位,配合WP使用
TB,BP2,BP1,BP0:FLASH区域写保护设置
WEL:写使能锁定
BUSY:忙标记位(1,忙;0,空闲)
B.指令集表
编程主要就围绕这些“指令”来编程。在我提供的软件工程代码“sflash.h”文件中就定义了和手册对应的指令,如下图:


2.写使能(0x06)
在操作写(控制、数据)之前,都需要发送一条“写使能”指令。
时序如下图:

源代码程序:

3.写失能(0x04)
和“写使能”类似,要失能写,在操作写(控制、数据)之后,都需要发送一条“写失能”指令。
时序如下图:

源代码程序:

4.读状态/控制(0x05)
W25X芯片唯一的状态寄存器,各个位的意思请看上面的介绍,比如判断忙不忙,就需要读状态。
时序如下图:

源代码程序:

5.写状态/控制(0x01)
写状态/控制 和 读状态/控制类似。
时序如下图:

源代码程序:

6.读数据(0x03)
这个就是我们重要的读数据指令。1.写入指令0x03; 2.写入24位地址; 3.连续读出N字节数据(只要有时钟,可以连续读出多字节);
时序如下图:

源代码程序:

7.快速读数据(0x0B)
“快速读数据”和“读数据”类似,但它的区别:1.读数据速度更快; 2.需要在写入地址之后需要8个时钟的等待。
1.写入指令0x0B; 2.写入24位地址; 3.写入8个时钟; 4.连续读出N字节数据(只要有时钟,可以连续读出多字节);
时序如下图:

源代码程序:

8.快速双通道读数据(0x3B)
“快速双通道读数据”和“快速读数据”类似,但它的区别:在读数据的时候是两条通道,也就是我们平时主机的输出引脚(MOSI)在这个时候拿来当做输入引脚读数据。
注意:
使用该指令功能,需要改变SPI底层驱动(即需要改变MOSI引脚的输入输出状态)。针对初学者,我提供的工程也没有写的那么复杂,即该指令功能没有(感兴趣的朋友可研究一下)。
9.写数据(页编程)(0x02)
“写数据”和“读数据”类似,但写数据都是在同一条数据(DIO)线上,读数据在地址之后是在DO数据上。
1.写入指令0x02; 2.写入24位地址; 3.连续写入N字节数据(只要有时钟,可以连续写入多字节,注意这里一次不能超过256字节数据);
时序如下图:

源代码程序:

10.块擦除(0xD8)
W25Xxx块的多少有芯片型号决定,一块数据大小64K。
W25X16共2M字节,有16块(2M/64K = 16)
W25X64共8M字节,有64块(8M/64K = 64)
以此类推...
注意:这个块的地址是和数据的地址对应,我们程序块擦除中将块区分开来。
时序如下图:

源代码程序:

11.扇区擦除(0x20)
W25Xxx扇区的多少有芯片型号决定,扇区数据大小4K。
W25X16共2M字节,有256块(2M/4K = 256)
W25X64共8M字节,有1024块(8M/4K = 1024)
以此类推...
同样,我们程序扇区擦除中将扇区以扇区的形式区分开来。
时序如下图:

源代码程序:

12.芯片擦除(0xC7)
这条指令是擦除整个芯片内容,如果要继续操作芯片,需要等待擦除完成(检查忙信号)。
时序如下图:

源代码程序:

13.掉电(低功耗)(0xB9)
需要将芯片处于低功耗,发送该指令。
时序如下图:

源代码程序:

14.唤醒/ID(0xAB)
该指令有两个功能:1.将处于低功耗的芯片唤醒(常用); 2.读取设备ID(不常用)。
发送该指令可以将芯片唤醒,继续发送3字节无效数据,可继续读出设备ID.由于读取设备ID有单独的指令,这里基本不常用于读设备ID(程序中也没有该功能)。
时序如下图:

源代码程序:

15.读取ID(0x90)
这个指令读取两字节数据(ID):高字节是厂家Manufacturer,低字节是芯片型号ID.

如我开发板上是W25Q128,读到的ID是:0XEF17
W25X16读到的ID是:EF14
时序如下图:

源代码程序:

16.JEDEC_ID(0x9F)
出于兼容性考虑,有些芯片厂家使用该指令读取ID,这条指令和上一条指令类似。
与上一条指令不同点:1.不用发送3字节无效数据; 2.读出来的ID是3字节(依次是:厂家ID、批次ID、型号ID)。
时序如下图:

源代码程序:

以上就是关于W25Xxx芯片所有的指令,其他厂家芯片或许还有一些指令,请根据情况看手册编写相应代码。
Ⅴ、说明
本文主要是为初学者提供一个编程的思路,及如何根据时序编程。
以上总结仅供参考,若有不对之处,敬请谅解。
Ⅵ、最后
更多精彩文章我将第一时间在微信公众号里面分享,该文有什么疑问可留言。
本着免费分享的原则,方便大家手机学习知识,定期在微信平台分享技术知识。如果你觉得分享的内容对你有用,又想了解更多相关的文章,请用微信搜索“EmbeddDeveloper” 或者扫描下面二维码、关注,将有更多精彩内容等着你。

SPI_FLASH时序描述及驱动编程的更多相关文章
- 嵌入式linux驱动开发之点亮led(驱动编程思想之初体验)
这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...
- (转)Windows驱动编程基础教程
版权声明 本书是免费电子书. 作者保留一切权利.但在保证本书完整性(包括版权声明.前言.正文内容.后记.以及作者的信息),并不增删.改变其中任何文字内容的前提下,欢迎任何读者 以任何形式(包括 ...
- 驱动编程思想之初体验 --------------- 嵌入式linux驱动开发之点亮LED
这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...
- 梦织未来Windows驱动编程 第03课 驱动的编程规范
最近根据梦织未来论坛的驱动教程学习了一下Windows下的驱动编程,做个笔记备忘.这是第03课<驱动的编程规范>. 驱动部分包括基本的驱动卸载函数.驱动打开关闭读取写入操作最简单的分发例程 ...
- 介绍linux设备驱动编程
目前,Linux软件工程师大致可分为两个层次: (1)Linux应用软件工程师(Application Software Engineer): 主要利用C库函数和Linux API进行应用 ...
- 透彻理解液晶显示模组LCD1602指令集与驱动编程(1)
LCD1602可以说是大多数单片机工程师了解液晶显示的入门级模组,其显示原理与其它很多显示模组也是相似的,今天我们就来详细讨论一下它的指令集.所谓模组的指令集,本质上是该模组使用的控制芯片的指令集,本 ...
- 160826、浏览器渲染页面过程描述,DOM编程技巧以及重排和重绘
一.浏览器渲染页过程描述 1.浏览器解析html源码,然后创建一个DOM树. 在DOM树中,每一个HTML标签都有一个对应的节点(元素节点),并且每一个文本也都有一个对应的节点(文本节点). DO ...
- Linux设备驱动编程中的中断与定时器处理
所谓中断是指CPU在执行过程中,出现某些突发时间急待处理,CPU必须暂停执行当前的程序,转去处理突发事件,处理完毕后CPU又返回原程序被中断的位置并继续执行. 中断分为(根据中断源来分): 内部中断 ...
- at91sam9x5 linux 4.1.0下dts驱动编程模型
测试环境: CPU: AT91SAM9X35 Linux: Atmel提供的linux-at91-linux4sam_5.3 (Linux-4.1.0) 转载请注明: 凌云物网智科嵌入式实 ...
随机推荐
- vue项目配置使用flow类型检查
你是否经常在debug那些简单可避免的bug?可能你给函数传参的时候搞错了参数的顺序,或者本来应该传个Number类型的参数,你传了一个String类型?JavaScript的弱类型是这一类bug的罪 ...
- 可以ping通虚拟机但不能telnet 9000端口
突然发现eclipse不能连上虚拟机了,报错是本机连接不上9000的端口. 觉得有点奇怪,就在命令行里试图ping通虚拟机,成功:但尝试这telnet 9000端口的时候,却报错连接不上. 上网查了这 ...
- elastic不错的官方文档(中文)
https://www.blog-china.cn/template/documentHtml/1484101683485.html http://www.open-open.com/doc/list ...
- Java中常用的6种排序算法详细分解
排序算法很多地方都会用到,近期又重新看了一遍算法,并自己简单地实现了一遍,特此记录下来,为以后复习留点材料. 废话不多说,下面逐一看看经典的排序算法: 1. 选择排序 选择排序的基本思想是遍历数组的过 ...
- .html(),.text()和.val()的差异
.html(),.text()和.val()的差异总结: .html(),.text(),.val()三种方法都是用来读取选定元素的内容:只不过.html()是用来读取元素的html内容(包括htm ...
- 演示程序之打游戏 -- 慕司板IAP15
上位机和协议制定我的大学舍友(他的微博:http://weibo.com/lesshst? topnav=1&wvr=5&topsug=1)毕业前百忙之中使用Python花了一个下午完 ...
- Java学习笔记1、常用dos命令
cd 改变当前目录 sys 制作DOS系统盘 copy 拷贝文件 del 删除文件 deltree 删除目录树 dir 列文件名 diskcopy 制磁盘 edit 文本编辑 format ...
- Unity 逻辑层通知UI 通过接口消除他们通信的switch判断
需求如何: 用户名字长度为2-12之间, 如果错误在界面上弹出一个消息框 写烂一点 public void PostRename(string name) { if (string.IsNullO ...
- MySQL数据库的查询缓冲机制
MySQL数据库的查询缓冲机制 2011-08-10 11:07 佚名 火魔网 字号:T | T 使用查询缓冲机制,可以极大地提高MySQL数据库查询的效率,节省查询所用的时间.那么查询缓冲机制是怎样 ...
- Tcp Ip -- tcpdump win窗口大小
问题介绍 今天,有内部模块与外部系统断连. (外部系统smgw,内部接口interface) smgw <----> interface 有消息交互. 通过tcpdump -xns0 po ...