选用硬件:STM32F103 Nano开发板 板载有W25Q16


一、SPI协议简介

1、SPI的接线与数据

SPI:Serial Peripheral interface 串行外围设备接口

上图是SPI主机与从机设备间连线的关系,可以看出,主机主导了主机和从机的时序(SCLK),数据发送的流程是:
主机移位寄存器发送数据→MOSI→从机移位寄存器接收数据
从机移位寄存器发送数据→MISO→主机移位寄存器接收数据
两条线路发送数据是同步的。于是主机和从机的移位寄存器数据被交换

只进行主机写入数据到从机时,主机忽视从机返回的数据;
只进行主机读取从机数据时,主机可发送空数据。

通常规定主机与从机间的数据格式均为MSB(Most Significant Bit 高位数据先行)

此外SPI设备通常还有SS或NSS接口用于片选。每一个从设备都要接到主机的一个SS引脚上。
SS/NSS:低电平有效
通常不会使用硬件SS接口,而是直接软件控制引脚电平实现片选。
通讯开始时,SS端电平拉低,通讯结束时,SS端电平拉高。

2、时序:时钟极性(CPOL)和时钟相位(CPHA)

时钟极性(CPOL)和时钟相位(CPHA)对传输协议的影响如下:

CPOL=0:闲置时时钟信号(SCK)低电位
CPOL=1:闲置时时钟信号(SCK)高电位

CPHA=0:在时钟信号的第一个上升沿/下降沿采样
CPHA=1:在时钟信号的第二个上升沿/下降沿采样
不同模式下SPI的采样与时钟电平关系如下表所示

对于W25Q16,只支持SPI模式0和模式3。这也是大多数SPI硬件支持的模式。


二、W25Q16简介

1、部分参数

数据内容 大小
存储空间 2M Byte
页数 8192
每页大小 256 Byte(0.25KB)
最小扇区 4KB
电源供电 2.7V~3.6V

W25Q16支持4倍传输模式,在本次学习中暂时不会用到,详情见数据手册。

2、硬件连接

引脚功能:


CS:片选端输入,发送或接受数据前应先拉低片选端为低电平0,完成后拉高片选端电平为1,读取BUSY位(见下文寄存器)直至BUSY位为0,可继续发送或接受下一条指令。
WP:低电平有效,用于保护状态寄存器。
HOLD:低电平有效,允许芯片暂停工作,保持输出。

开发板的硬件连接:

W25Q16支持软件Reset(有30μs的延迟),软件启动Dual SPI和Quad SPI 。使用QUAD SPI通信时,需要使用WP引脚和HOLD引脚。在此只学习有关标准SPI通信的方法。

W25Q16内部结构与存储地址示意图如下,W25Q16共2M字节的存储空间被分为32个Block,每个Block(64KB)下有16个Sector(4KB),每个Sector(4KB)下有16个Page(256Byte),在图中的每一行的左侧地址到右侧地址表示一个Page。

3、状态寄存器

在此特别说明两个状态寄存器:BUSY和WEL(Write Enable Only)

BUSY寄存器是只读寄存器,在对存储空间操作(包括页写入,块擦除等)时,BUSY寄存器保持在高电平位,此时芯片无法执行新的指令。完成操作后,BUSY寄存器重置为低电平,芯片可继续执行指令。
实际使用中可以用BUSY寄存器来判断指令是否执行完毕。

WEL寄存器同样是只读寄存器。当寄存器至为高电平时,可以执行对存储内容进行更改(包括页写入,块擦除等)的命令。置为低电平时,不能更改存储内容。

其它寄存器用于对数据的保护,通常不需要使用。需要使用时可查看数据手册的说明。

4、指令API

W25Q16数据传输为MSB模式,传入数据在上升沿采样。因此应使用SPI MODE3

The first byte of data clocked into the DI input provides the instruction code. Data on the DI input is sampled on the rising edge of clock with most significant bit (MSB) first.

芯片支持volatile数据写入,很多指令出于保护目的而设计,但在开发板上不需要。具体有待进一步学习。
预设的操作指令如下图所示:


对指令的一些说明:

(1) 芯片一次写入数据最多支持256Byte。超出256Byte的数据将覆盖前面已经写入的数据。

(2) 标准SPI模式下输入可基本参照上表,双路SPI或四路SPI模式下需要参考数据手册的说明。上表中带括号“()”的指令在双路SPI和四路SPI模式下有不同的输入方式,具体参照数据手册。

(3) 上表中【ID15-ID0】或【ID7-ID0】以及【MF7-MF0】对应第一个表中的设备地址,A表示地址,D表示数据,S表示寄存器,L表示Locked Value(具体见数据手册)。

(4) Write Enable/Disable 写使能/禁止
在页写入,扇区擦除,块擦除,全片擦除命令前必须使用的命令。使WEL位置1。

(5) Read/Write Status Register-1/2/3 读取/写入寄存器1/2/3的状态
上文中只介绍了Status Register-1的内容,实际使用中基本也只需要用到其中的BUSY和WEL两个状态寄存器,主要是读取寄存器的状态用于判断指令是否完成,或改变写入权限(通常通过写使能命令)。
对于读取状态寄存器的命令,当CS(片选端)未置高电平时将一直返回寄存器的状态。CS置1后命令结束。

(6) Read Data 读取数据
读取数据命令能够从发送的地址开始不断地读取数据直至CS置高电平1,能够读取至整个芯片。
此外还有作用相近的Fast Read 命令,在3个地址字节后加dummy字节,用于调整时钟速度,再进行数据的发送。具体没有进行实验,暂时只使用Read Data命令。

(7) Page Program 页写入
页写入命令必须在写使能(WEL=1)的条件下才有效。
页写入命令中的地址数据末八位(A7-A0)应当为00h,此时的地址是页的首地址,能够完整地将数据写入页中。
若地址末八位不是00h,则当输入的数据地址自增至页尾时,地址将回到页首继续写入。
写入数据的位置必须是擦出状态(0xFF),否则写入失败。
若写入的数据超出256字节,则超出的字节将覆盖写入数据的首部分字节。
完成数据写入后,应将CS置1才能使命令有效。此后芯片需要等待一段时间t才能完成数据的写入。写入过程中可用Read Status Register 读取BUSY寄存器查看命令是否完成。写入命令完成后,写使能自动被禁止(WEL=0)。

(8)
Sector Erase 扇区擦除(4KB)
32KB Block Erase 半块擦除
64KB Block Erase 整块擦除
Chip Erase 全片擦除

这几个命令与页写入命令相似,同样需要在WEL=1的条件下才可使用。命令执行过程中可通过查看BUSY标志位确认命令是否完成,命令完成后写使能自动被禁止,即WEL=0。
被擦除的数据将被全部置为1,即FFh。


三、STM32 HAL库 有关SPI的API

1.SPI初始化结构体

初始化结构体的可控参数如下所示。

typedef struct
{uint32_t Mode; //模式:主(SPI_MODE_MASTER),从(SPI_MODE_SLAVE)uint32_t Direction; //方式: 只接收模式,单线双向通信数据模式,全双工uint32_t DataSize; //8 位还是 16 位帧格式选择项uint32_t CLKPolarity; //时钟极性uint32_t CLKPhase;//时钟相位uint32_t NSS; //SS 信号由硬件(NSS 管脚)还是软件控制uint32_t BaudRatePrescaler;//设置 SPI 波特率预分频值uint32_t FirstBit;//起始位是 MSB 还是 LSBuint32_t TIMode; //帧格式 SPI motorola 模式还是 TI 模式uint32_t CRCCalculation; //硬件 CRC 是否使能uint32_t CRCPolynomial; //CRC 多项式
}SPI_InitTypeDef;

各个参数具体的预设值可参考官方数据手册。以下是根据W25Q16数据手册进行的初始化预设

 SPI2_Handler.Instance=SPI2; //SPI2SPI2_Handler.Init.Mode=SPI_MODE_MASTER; //设置为主模式SPI2_Handler.Init.Direction=SPI_DIRECTION_2LINES; //SPI 设置为双线模式SPI2_Handler.Init.DataSize=SPI_DATASIZE_8BIT; //SPI 发送接收 8 位帧结构SPI2_Handler.Init.CLKPolarity=SPI_POLARITY_HIGH; //串行同步时钟的空闲状态为高电平SPI2_Handler.Init.CLKPhase=SPI_PHASE_2EDGE; //第二个跳变沿数据被采样SPI2_Handler.Init.NSS=SPI_NSS_SOFT;//NSS 信号由硬件管理SPI2_Handler.Init.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_256;//定义波特率预分频的值:波特率预分频值为 256SPI2_Handler.Init.FirstBit=SPI_FIRSTBIT_MSB; //数据传输从 MSB 位开始SPI2_Handler.Init.TIMode=SPI_TIMODE_DISABLE; //关闭 TI 模式SPI2_Handler.Init.CRCCalculation=SPI_CRCCALCULATION_DISABLE;//关闭硬件 CRCSPI2_Handler.Init.CRCPolynomial=7; //CRC 值计算的多项式HAL_SPI_Init(&SPI2_Handler);//初始化

注:
SPI模式中还支持TI模式,TI模式又称SSP模式,是由TI公司定义的通讯标准,关闭TI模式下的SPI是由Motorola公司定义的通讯标准。通常使用的是Motorola公司定义的SPI通讯模式。
CRC:CRC校验
用STM32CubeMX配置引脚时,要设置SYS的Debug模式为Serial Wire,以免下载程序一次后无法读取调试器。

STM32学习开发记录:W25Q16(FLASH)——SPI相关推荐

  1. stm32学习开发记录:OLED——I2C

    [缓慢施工中] 一.STM32 HAL库的I2C API 在Keil--help中可以直接找到对应开发板所需的编程资料. 找到HAL库关于I2C函数的说明: I2C使用流程: (1)I2C参数初始化, ...

  2. STM32学习笔记(15)——SPI协议

    STM32学习笔记(15)--SPI协议 一.SPI协议简介 1. 物理层 2. 协议层 (1) 通讯的开始与停止 (2)时钟极性CPOL.时钟相位CPHA 二.STM32的SPI外设 1. 通讯引脚 ...

  3. STM32学习笔记:读写内部FLASH

    ST提供的库函数基本能搞定 简介 由于 FLASH 存储器的内容在掉电后不会丢失,芯片重新上电复位后,内核可从内部 FLASH 中加载代码并运行,亦可当做EEROM来使用保存所需要的数据,以便下次启用 ...

  4. STM32学习之SPI协议(读写FLASH)

    关于STM32学习分享 第八章 SPI协议(读写FLASH) 文章目录 关于STM32学习分享 前言 二.代码 1.spi_flash.c 2.spi_flash.h 3.main.c 总结 前言 开 ...

  5. STM32开发实战:W25Q32JV SPI Flash详解

    STM32开发实战:W25Q32JV SPI Flash详解 在STM32单片机的应用中,使用SPI Flash能够有效地扩展程序和数据存储空间.W25Q32JV SPI Flash是一种常用的Fla ...

  6. 硬件学习、高速dsp开发板制作、STM32学习笔记

    1.硬件工程师成长之路(1)--元件基础_[云轩]的博客-CSDN博客_硬件工程师的成长之路 总目录:https://blog.csdn.net/weixin_44407238/category_10 ...

  7. STM32学习笔记:FLASH读写之一

    因为关于STM32的Flash相关的知识点比较多,所以该内容的学习我们分为以下4个部分 1.RAM和ROM的一些基本概念 -- STM32学习笔记:FLASH读写之一 2.STM32的Flash寄存器 ...

  8. STM8L151 使用硬件SPI驱动W25Q16 Flash

    SPI:有四根线的串行通信协议,允许与其他设备以半.全双工.同步.串行方式通信. MISO:主模式输入.从模式输出线 MOSI:主模式输出.从模式输入线 CLK:时钟线 NSS:从设备选择引脚,主设备 ...

  9. 《STM32学习笔记》2——开发环境的建立

    接上文,文中的图片知识,大多数来自视频的截图(来自洋桃电子). 欢迎大家批评指正! STM32学习笔记-专栏 文章目录 一.接口定义 1 芯片引脚整体简介 2 各部分引脚介绍 二.开发板简介 三.IS ...

最新文章

  1. leetcode算法题--最长数对链
  2. docker 与tomcat整合
  3. Elasticsearch 实现自定义排序插件
  4. 关于数据分析:你想知道的都在这里!
  5. 阿里云存储OSS中设置上传文件content type
  6. GNS3(eNSP)和VMWare搭建网络学习环境
  7. pcm5102a解码芯片音质评测_简单测评200元档可能是唯一搭载高通QCC3020芯片的真无线蓝牙耳机...
  8. 醒醒吧!只努力了一个礼拜就想成功,你不觉得无耻吗?
  9. Exchange+SP2的安装
  10. Java程序设计基础思维导图
  11. 计算机桌面如何分区,学会电脑桌面整理分区,提高工作效率
  12. 服务器硬盘整体ghost,ghost备份整个硬盘| 全盘镜像ghost步骤
  13. 三层交换机原理及实验操作
  14. Briefings in bioinformatics2022 | 基于神经网络的分子性质预测通用优化策略
  15. 计算机英语情景对话二人组,英语情景对话要求两人的对话 时间5分钟左右 内容是在校园两个好朋友谈论...
  16. win10 jdk环境变量配置
  17. 路由器恢复出厂设置,如何重新配置访问网络
  18. WPF:鼠标拖曳、拖动控件
  19. 汉王纷争服务器维护,4月12日汉王纷争58服/59服赛季合服公告
  20. 计算机主机内置音箱,如何使Realtek声卡分别区分内置扬声器和耳机?

热门文章

  1. bzoj2018 [Usaco2009 Nov]农场技艺大赛
  2. 他可能是全球最会说唱的程序员
  3. 版权登记是对商标最好的保护!
  4. VirtualBox虚拟机与主机之间复制粘贴设置以及文件拖拽
  5. xdebug linux,linux下配置xdebug
  6. PHP使用OpenSSL的3DES加密
  7. 老男孩教育day2学习总结
  8. C语言山东春考技能模拟,1-2020年山东省春季高考技能考试信息技术类专业考试(样题)(2).pdf...
  9. 解决华硕电脑右键word/excel文件,文件资源管理器(文件夹)就卡死的问题
  10. teamcity mysql 配置_teamcity自动化部署