0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于SPI_FLASH时序描述及驱动编程

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 2020-03-25 11:15 次阅读

Ⅰ、写在前面

写这篇文章的目的有两点: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访问密码 4bc4

STM32F10x_SPI(软件vwin )读写Flash(25Q16)实例源代码工程:

https://yunpan.cn/c6mf6zyzCaMwd访问密码 cf45

SPI FLASH资料:

https://yunpan.cn/c6Yi3agWUnGNQ访问密码 d790

STM32F1资料:

https://yunpan.cn/crBUdUGdYKam2访问密码 ca90

Ⅲ、关于SPIFLASH

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)、 可整个芯片擦除。

Ⅳ、SPIFLASH时序及编程

这里还是以华邦的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芯片所有的指令,其他厂家芯片或许还有一些指令,请根据情况看手册编写相应代码。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FlaSh
    +关注

    关注

    10

    文章

    1592

    浏览量

    147271
  • 驱动
    +关注

    关注

    12

    文章

    1771

    浏览量

    84818
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1651

    浏览量

    90506
收藏 人收藏

    评论

    相关推荐

    时序逻辑电路的五种描述方法

    时序逻辑电路是数字电路中的一种重要类型,它具有存储和处理信息的能力。 时序逻辑电路的 描述方法有很多种,不同的方法适用于不同的设计和分析场景。以下是五种常见的 时序逻辑电路
    的头像 发表于08-28 11:39 129次阅读

    时序逻辑电路的描述方法有哪些

    时序逻辑电路是数字电路中的一种重要类型,它具有存储功能,能够根据输入信号和内部状态的变化来改变其输出。 时序逻辑电路广泛应用于计算机、通信、控制等领域。本文将介绍 时序逻辑电路的 描述方法,
    的头像 发表于08-28 11:37 131次阅读

    spi_flash期间的计时器中断导致崩溃怎么解决?

    spi_flash_erase_sector(...); spi_flash_write(...); 如果在闪存访问期间发生计时器中断,ESP 似乎会崩溃并重新启动。 当然,这可以通过在访问 Flash时禁用中断来
    发表于07-12 11:54

    ESP32外部flashspi外设冲突怎么解决?

    硬件: ESP32 ,W25Q128 SPI显示器 库:IDF4.0.1 使用hspi挂载了外部16MB的W25Q128,并同时挂载了 SPI的显示器,使用两不同IO口进行分时复用。 问题 描述:分时
    发表于06-25 06:19

    基于FPGA的SPIFlash控制器的设计方案

    、块擦除、整体擦除、读取数据、快速读取数据、页面 编程)时所需指令 时序,用户只需要输入对应操作的8位指令值及对应的操作地址值, SPI接口与 SPI Fl
    发表于06-03 10:13

    FATFS对SPI_FLASH新建文件、删除文件或者修改文件后电脑无法识别,为什么?

    FATFS对 SPI_FLASH新建文件、删除文件或者修改文件后电脑无法识别,而且会断开连接,需要重新插拔,这是什么问题呢
    发表于04-09 07:06

    通用bootloader选“支持spiflash”,无论设定download为片内还是片外flash启动都找不到at45db161,为什么?

    通用bootloader不选“支持 spi flash”,download放于片内 flash,正常启动,ota正常,app 驱动at45db161读写正常。通用bootloader选“支持
    发表于03-22 07:45

    求助,关于SPI读写Flash的理解

    利用 SPI读写 Flash指令的过程中,当主机发送指令后,为什么还需要再发送“任意的数据”,才能够获取指令解释后的返回值。 当读取 Flash的JEDEC_ID指令时,按 FLASH的ID指
    发表于03-20 06:06

    CYUSB3014烧录SPIFLASHimage时总是报错的原因?可以通过USB直接更新SPIFLASH吗?

    时,硬件PMOD设置为 SPIboot模式,但 SPI FLASH中是空的,想通过USB更新 SPI FLASH,但是无法成功,这样
    发表于02-28 07:40

    想用FX3SPI编程SPIFlash,页面尾部随机丢失了3个字节的数据是为什么?

    你好,我想用 FX3 SPI编程 SPI Flash。 通过 cyu3pspiReceiveWords 功能,阅读页面似乎没问题。 当我用 cyu3pspitransmitWord
    发表于02-26 07:34

    AD7193如何通过spi时序图来进行模拟spi的通信编程

    本人准备应用AD7193,现在一直无法实现AD7193 的 spi通信,请问如何通过 spi时序图来进行模拟 spi的通信 编程
    发表于12-21 07:36

    FPGA通过SPI对ADC配置简介(二)-4线SPI配置时序分析

    本篇将以德州仪器(TI)的高速ADC芯片—ads52j90为例,进行ADC的4线 SPI配置 时序介绍与分析。
    的头像 发表于12-11 09:05 1366次阅读
    FPGA通过<b class='flag-5'>SPI</b>对ADC配置简介(二)-4线<b class='flag-5'>SPI</b>配置<b class='flag-5'>时序</b>分析

    ART-Pi外部SPIFlash使用elmfatfs文件系统流程记录

    ARTPI 有一个外部 SPI Flash,空间为 16-Mbytes,使用的是 ARTPI 的 SPI1 接口。
    的头像 发表于11-21 11:39 1098次阅读
    ART-Pi外部<b class='flag-5'>SPI</b> <b class='flag-5'>Flash</b>使用elmfatfs文件系统流程记录

    单片机spi接口的使用方法有哪些(spi接口和串口的区别)

    如果单片机没有硬件 SPI模块,或者需要额外的IO引脚来实现多个 SPI设备的通信,可以使用软件 SPI模拟。软件 SPI通常使用GPIO口模拟 SPI
    的头像 发表于11-10 16:38 2795次阅读

    关于NUC972SPINORflash驱动问题

    最近使用NUC972做了一块板子,学习一下。在使用BSP 驱动 SPINOR flash的时候遇到一个问题,请教大家能否指点一下。 我的板子改了 SPI为GD25Q256D,为32Mby
    发表于09-05 06:28