一、环境介绍
编程软件: keil5
操作系统: win10
mcu型号: stm32f103zet6
stm32编程方式: 寄存器开发 (方便程序移植到其他单片机)
spi总线: stm32本身支持spi硬件时序,本文示例代码里同时采用模拟时序和硬件时序两种方式读写w25q64。
模拟时序更加方便移植到其他单片机,更加方便学习理解spi时序,通用性更高,不分mcu;
硬件时序效率更高,每个mcu配置方法不同,依赖mcu硬件本身支持。
存储器件: 采用华邦w25q64 flash存储芯片。
w25q64这类似的flash存储芯片在单片机里、嵌入式系统里还是比较常见,可以用来存储图片数据、字库数据、音频数据、保存设备运行日志文件等。
二、华邦w25q64介绍(flash存储类型) 2.1 w25q64芯片功能介绍
w25q64是为系统提供一个最小空间、最少引脚,最低功耗的串行flash存储器,25q系列比普通的串行flash存储器更灵活,性能更优越。
w25q64支持双倍/四倍的spi,可以储存包括声音、文本、图片和其他数据;芯片支持的工作电压 2.7v 到 3.6v,正常工作时电流小于5ma,掉电时低于1ua,所有芯片提供标准的封装。
w25q64的内存空间结构: 一页256字节,4k(4096 字节)为一个扇区,16个扇区为1块,容量为8m字节,共有128个块,2048 个扇区。
w25q64每页大小由256字节组成,每页的256字节用一次页编程指令即可完成。
擦除指令分别支持: 16页(1个扇区)、128页、256页、全片擦除。
w25q64支持标准串行外围接口(spi),和高速的双倍/四倍输出,双倍/四倍用的引脚:串行时钟、片选端、串行数据 i/o0(di)、i/o1(do)、i/o2(wp)和 i/o3(hold)。
spi 最高支持 80mhz,当用快读双倍/四倍指令时,相当于双倍输出时最高速率160mhz,四倍输出时最高速率 320mhz。这个传输速率比得上8位和16位的并行flash存储器。
w25q64支持 jedec 标准,具有唯一的 64 位识别序列号,方便区别芯片型号。
2.2 w25q64芯片特性详细介绍 ●spi串行存储器系列
-w25q64:64m 位/8m 字节
-w25q16:16m 位/2m 字节
-w25q32:32m 位/4m 字节
-每 256 字节可编程页
●灵活的4kb扇区结构
-统一的扇区擦除(4k 字节)
-块擦除(32k 和 64k 字节)
-一次编程 256 字节
-至少 100,000 写/擦除周期
-数据保存 20 年
●标准、双倍和四倍spi
-标准 spi:clk、cs、di、do、wp、hold
-双倍 spi:clk、cs、io0、io1、wp、hold
-四倍 spi:clk、cs、io0、io1、io2、io3
●高级的安全特点
-软件和硬件写保护
-选择扇区和块保护
-一次性编程保护(1)
-每个设备具有唯一的64位id(1)
●高性能串行flash存储器
-比普通串行flash性能高6倍
-80mhz时钟频率
-双倍spi相当于160mhz
-四倍spi相当于320mhz
-40mb/s连续传输数据
-30mb/s随机存取(每32字节)
-比得上16位并行存储器
●低功耗、宽温度范围
-单电源 2.7v-3.6v
-工作电流 4ma,掉电<1μa(典型值)
-40℃~+85℃工作
2.3 引脚介绍 下面只介绍w25q64标准spi接口,因为目前开发板上的封装使用的就是标准spi接口。
引脚编号
引脚名称
i/o
功能
1
/cs
i
片选端输入
2
do(io1)
i/o
数据输出(数据输入输出 1)*1
3
/wp(io2)
i/o
写保护输入(数据输入输出 2)*2
4
gnd
地
5
di(io0)
i/o
数据输入(数据输入输出 0)*1
6
clk
i
串行时钟输入
7
/hold(io3)
i/o
保持端输入(数据输入输出 3)*2
8
vcc
电源
2.2.1 spi片选(/cs)引脚用于使能和禁止芯片操作 cs引脚是w25q64的片选引脚,用于选中芯片;当cs为高电平时,芯片未被选择,串行数据输出(do、io0、io1、io2 和 io3)引脚为高阻态。未被选择时,芯片处于待机状态下的低功耗,除非芯片内部在擦除、编程。当/cs 变成低电平,芯片功耗将增长到正常工作,能够从芯片读写数据。上电后, 在接收新的指令前,/cs 必须由高变为低电平。上电后,/cs 必须上升到 vcc,在/cs 接上拉电阻可以完成这个操作。
2.2.2 串行数据输入、输出和 ios(di、do 和 io0、io1、io2、io3) w25q64、w25q16 和 w25q32 支持标准 spi、双倍 spi 和四倍 spi。
标准的 spi 传输用单向的 di(输入)引脚连续的写命令、地址或者数据在串行时钟(clk)的上升沿时写入到芯片内。
标准的spi 用单向的 do(输出)在 clk 的下降沿从芯片内读出数据或状态。
2.2.3 写保护(/wp) 写保护引脚(/wp)用来保护状态寄存器。和状态寄存器的块保护位(sec、tb、bp2、bp1 和bp0)和状态寄存器保护位(srp)对存储器进行一部分或者全部的硬件保护。/wp 引脚低电平有效。当状态寄存器 2 的 qe 位被置位了,/wp 引脚(硬件写保护)的功能不可用。
2.2.4 保持端(/hold) 当/hold 引脚是有效时,允许芯片暂停工作。在/cs 为低电平时,当/hold 变为低电平,do 引脚将变为高阻态,在 di 和 clk 引脚上的信号将无效。当/hold 变为高电平,芯片恢复工作。/hold 功能用在当有多个设备共享同一 spi 总线时。/hold 引脚低电平有效。当状态寄存器 2 的 qe 位被置位了,/ hold 引脚的功能不可用。
2.2.5 串行时钟(clk) 串行时钟输入引脚为串行输入和输出操作提供时序。(见 spi 操作)。
设备数据传输是从高位开始,数据传输的格式为 8bit,数据采样从第二个时间边沿开始,空闲状态时,时钟线 clk 为高电平。
2.3 内部结构框架图
2.4 w25q64的标准spi操作流程 w25q64标准spi总线接口包含四个信号: 串行时钟(clk)、片选端(/cs)、串行数据输入(di)和串行数据输出(do)。
di输入引脚在clk的上升沿连续写命令、地址或数据到芯片内。
do输出引脚在clk的下降沿从芯片内读出数据或状态。
w25q64分别支持spi总线工作模式0和工作模式3。模式0和模式3的主要区别在于常态时的clk信号不同;对于模式0来说,当spi主机已准备好数据还没传输到串行flash中时,clk信号常态为低;
设备数据传输是从高位开始,数据传输的格式为8bit,数据采样从第二个时间边沿开始,空闲状态时,时钟线clk为高电平。
2.5 部分控制和状态寄存器介绍 2.5.1 w25q64的指令表
指令名称
字节 1
(代码)
字节 2
字节 3
字节 4
字节 5
字节 6
写使能
06h
write_enabled
禁止写
04h
读状态寄存器 1
05h
(s7-s0)(2)
读状态寄存器 2
35h
(s15-s8)(2)
写状态寄存器
01h
(s7-s0)
(s15-s8)
页编程
02h
a23-a16
a15-a8
a7-a0
(d7-d0)
四倍页编程
32h
a23-a16
a15-a8
a7-a0
(d7-d0,…)(3)
块擦除(64kb)
d8h
a23-a16
a15-a8
a7-a0
块擦除(32kb)
52h
a23-a16
a15-a8
a7-a0
扇区擦除(4kb)
20h
a23-a16
a15-a8
a7-a0
全片擦除
c7h/60h
暂停擦除
75h
恢复擦除
7ah
掉电模式
b9h
高性能模式
a3h
2.5.2 读状态寄存器1 状态寄存器1的内部结构如下:
状态寄存器1的s0位是当前w25q64的忙状态;为1的时候表示设备正在执行程序(可能是在擦除芯片)或写状态寄存器指令,这个时候设备将忽略传来的指令, 除了读状态寄存器和擦除暂停指令外,其他写指令或写状态指令都无效, 当 s0 为 0 状态时指示设备已经执行完毕,可以进行下一步操作。
读状态寄存器1的时序如下:
读取状态寄存器的指令是 8 位的指令。发送指令之前,先将/cs 拉低,再发送指令码“05 h” 或者“35h”。设备收到读取状态寄存器的指令后,将状态信息(高位)依次移位发送出去,读出的状态信息,最低位为 1 代表忙,最低位为 0 代表可以操作,状态信息读取完毕,将片选线拉高。
读状态寄存器指令可以使用在任何时候,即使程序在擦除的过程中或者写状态寄存器周期正在进行中。这可以检测忙碌状态来确定周期是否完成,以确定设备是否可以接受另一个指令。
2.5.3 读制造商id和芯片id 时序图如下:
读取制造商/设备 id 指令可以读取制造商 id 和特定的设备 id。读取之前,拉低 cs 片选信号,接着发送指令代码“90h” ,紧随其后的是一个 24 位地址(a23-a0)000000h。 设备收到指令之后,会发出华邦电子制造商 id(efh) 和设备id(w25q64 为 16h)。如果 24 位地址设置为 000001h ,设备 id 会先发出,然后跟着制造商 id。制造商和设备id可以连续读取。完成指令后,片选信号/ cs 拉高。
2.5.4 全片擦除(c7h/60h)
全芯片擦除指令,可以将整个芯片的所有内存数据擦除,恢复到 0xff 状态。写入全芯片擦除指令之前必须执行设备写使能(发送设备写使能指令 0x06),并判断状态寄存器(状态寄存器位最低位必须等于 0 才能操作)。发送全芯片擦除指令前,先拉低/ cs,接着发送擦除指令码”c7h”或者是”60h”, 指令码发送完毕后,拉高片选线 cs/,,并判断状态位,等待擦除结束。全片擦除指令尽量少用,擦除会缩短设备的寿命。
2.5.5 读数据(03h)
读取数据指令允许按顺序读取一个字节的内存数据。当片选 cs/拉低之后,紧随其后是一个 24 位的地址(a23-a0)(需要发送 3 次,每次 8 个字节,先发高位)。芯片收到地址后,将要读的数据按字节大小转移出去,数据是先转移高位,对于单片机,时钟下降沿发送数据,上升沿接收数据。读数据时,地址会自动增加,允许连续的读取数据。这意味着读取整个内存的数据,只要用一个指令就可以读完。数据读取完成之后,片选信号/ cs 拉高。
读取数据的指令序列,如上图所示。如果一个读数据指令而发出的时候,设备正在擦除扇区,或者(忙= 1),该读指令将被忽略,也不会对当前周期有什么影响。
三、spi时序介绍 spi是串行外设接口(serial peripheral interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为pcb的布局上节省空间。
spi是一种高速、高效率的串行接口技术,一共有4根线。通常由一个主模块和一个或多个从模块组成,主模块选择一个从模块进行同步通信,从而完成数据的交换。spi是一个环形结构,通信时需要至少4根线(在单向传输时3根线也可以)。分别是miso(主设备数据输入)、mosi(主设备数据输出)、sclk(时钟)、cs(片选)。
(1)miso– master input slave output,主设备数据输入,从设备数据输出;
(2)mosi– master output slave input,主设备数据输出,从设备数据输入;
(3)sclk – serial clock,时钟信号,由主设备产生;
(4)cs – chip select,从设备使能信号,由主设备控制。
其中,cs是从芯片是否被主芯片选中的控制信号,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),主芯片对此从芯片的操作才有效。这就使在同一条总线上连接多个spi设备成为可能。接下来就负责通讯的3根线了。通讯是通过数据交换完成的,这里先要知道spi是串行通讯协议,也就是说数据是一位一位的传输的。这就是sclk时钟线存在的原因,由sclk提供时钟脉冲,sdi,sdo则基于此脉冲完成数据传输。数据输出通过 sdo线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。因此,至少需要8次时钟信号的改变(上沿和下沿为一次),才能完成8位数据的传输。
时钟信号线sclk只能由主设备控制,从设备不能控制。这样的传输方式有一个优点,在数据位的传输过程中可以暂停,也就是时钟的周期可以为不等宽,因为时钟线由主设备控制,当没有时钟跳变时,从设备不采集或传送数据。spi还是一个数据交换协议:因为spi的数据输入和输出线独立,所以允许同时完成数据的输入和输出。芯片集成的spi串行同步时钟极性和相位可以通过寄存器配置,io模拟的spi串行同步时钟需要根据从设备支持的时钟极性和相位来通讯。spi通信原理比i2c要简单,iic有应答机制,可以确保数据都全部发送成。spi接口没有指定的流控制,没有应答机制确认是否接收到数据,速度上更加快。
spi总线通过时钟极性和相位可以配置成4种时序:
stm32f103参考手册,spi章节介绍的时序图:
spi时序比较简单,cpu如果没有硬件支持,可以直接写代码采用io口模拟,下面是模拟时序的示例的代码:
东芝TransMemory USB3.0 U363闪存盘上市:全金属外壳一体成型,日常使用中更加便捷
C语言入门教程-函数库
简单易懂的图解方式来进一步阐述轮毂电机技术
光伏黑硅技术的概念
汽车电气化:你想要的功能安全电源管理产品,恩智浦准备好啦!
STM32:SPI总线、W25Q64(FLASH)的详细介绍
物联网卡在物联网应用中有着什么样的作用?
通过无线传感贴片能够追踪早产儿的状态
德国车企一直在沉睡,必将付出血的代价
享受音乐的每个细节 森海塞尔全新IE 300入耳式耳机
2000元内高屏占比手机,荣耀X20 SE今日正式开售
一位网络工程师的从业经验
曝苹果计划9月7日举办秋季产品发布会
TI C2000微控制器的EtherCAT包如何为每个阶段提供支持
先进的电力线监测需要一个高性能,同时采样模数转换器-Adva
电力电子业突破技术瓶颈任重道远
区块链游戏工作室正在推动区块链游戏领域的创新
IC芯片型号的那些后缀怎么看?
联想数博会展示:显示了其对大数据应用的前瞻性布局
小米“米家”VS海尔U+ 谁将称霸智能家居市场?