你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32F0单片机快速入门十 用 SPI HAL 库读写W25Q128

[复制链接]
STMCU小助手 发布时间:2021-9-17 17:37
1.W25Q128 介绍" z8 u5 L6 _6 ?8 Q+ |. h- h' I
当我们有比较多的数据需要掉电存储时,上一篇文章所介绍的 24C02 (256个字节EEPROM)就不够了。此时我们会用到另外一种类型的存储器,即 Flash。比如具有 SPI 接口的 W25Q128。这颗小芯片虽然也只有简单的 8 个引脚,但存储容量却达到了128M-bit,也就是 16M 字节,同时它的读写速度可以达到 66MB/S。但是由于 STM32F030 不支持 Quad/Dual SPI,只能以标准 SPI 方式读写,所以速度会低一些。以下是 W25Q128 的主要特点:- Q. S! {% C% E6 w% k+ f
a.133MHz SPI Clock。' ~- f- F  ~6 |5 t: `7 K
b.10万次擦写寿命,20年数据保持时间。! k9 P/ h  f; ]" }8 @
c.每颗具有64-Bit唯一序列号 Unique ID。* w$ r  @; C5 x* V
d.每次可以写入 1 到 256 字节数据。7 z" E" x+ s; I  ]$ H
e.写之前需要对目的地址所在扇区进行擦除操作。
$ N6 J8 G8 ^! d0 P' z$ e3 j 14.png 4 N/ h! P. t- n  B+ K
( Winbond W25Q128 datasheet )
5 D' `( z) K7 [2 A我们通过以下连线使 W25Q128 连至 STM32F030 的 SPI1:2 }5 Y4 T8 h3 m1 }2 ^! `

# Z% z- w, W: s8 I7 \
. W+ |- Q" D0 H4 p0 `
W25Q128                   STM32F030; w& b. k0 j+ D" u5 X1 E2 D
Pin 1   /CS               PA4 也可以用其它 GPIO 引脚) i/ X1 e$ r, c
Pin 2   DO                PA6 SPI1_MISO
, e# w$ u1 w1 wPin 3   /WP              ( VCC )) C0 y) X$ f" d& J: |, U
Pin 4   GND              ( GND )   
, a% {- Q4 {) nPin 5   DI                PA7 SPI1_MOSI
5 c4 i! U/ B- Y: O& \+ dPin 6   CLK               PA5 SPI1_SCK
9 C$ z5 s( @$ }4 {' PPin 7   /HOLD or /RESET   ( VCC )
9 d9 F9 q" I1 Q% P  |2 \Pin 8   VCC               ( VCC )% U; A1 Y  ^6 ]% A$ }
2.代码
0 \  r% O: ]+ C1 s# D代码的开发如果想提高效率,一个方法就是充分利用前人的成果,而不是自己一再的去造轮子。, V6 g- S* W3 c5 u! [
对于W25Q128 我们可以从Github上找到驱动代码:
1 O. s4 L8 _# x# q7 w8 g, _0 Chttps://github.com/nimaltd/w25qxx
; L: `0 P* d4 y! bGNU General Public License v3.09 Z0 z$ p; T7 Z% V9 k; a* V
我们把它集成进SPI例程里,完成 W25Q128 的读写功能。
( L- Z2 u. F' UStep 1,下载后把解压的文件夹 w25qxx-master 放在 STM32Cube_FW_F0_V1.11.0\Drivers\BSP\Components- h. _& T* W9 T* g
15.png $ m( @3 d* D9 ]0 ^! K
Step 2, 我们用 Keil 打开下面这个工程:: N# D2 b' k% Y7 X5 }( m! W
STM32Cube_FW_F0_V1.11.0\Projects\STM32F030R8-Nucleo\Examples\SPI\SPI_FullDuplex_ComPolling\MDK-ARM\Project.uvprojx. X! J/ V& C7 Y, Y, e; g
在项目(STM32F030R8-Nucleo)上点鼠标右键,选择Add Group...
/ L" _) x: B  }; ~2 {6 I# A新建 Group 并改名称为 Drivers\BSP\Components\w25qxx-master: R+ w: H/ N3 \4 l6 T, n0 r
16.png ! ^( B  K( |9 Y- |: m* d
Step 3, 在 Drivers\BSP\Components\w25qxx-master上点右键,选择Add Existing Files to Group "Drivers\BSP\Components\w25qxx-master"...,
( b! \. P/ M7 o/ B# \找到 Drivers/BSP/components/w25qxx-master/w25qxx.c 点击Add,然后可以看到w25qxx.c已经添加进项目中:
8 g7 G4 s5 }# N: S# F 17.png 6 x4 ?! m' p2 g% a1 e4 z6 _% `7 E+ s
Step 4, 在 Options for Target 里添加路径,这里使用的是工程所在路径的相对路径,也可以使用绝对路径,但如果工程拷贝到别的地方的时候,此包含路径就需要跟随更改。0 S" W- ~3 \, e$ p( U
Add include path  ../../../../../../Drivers/BSP/components/w25qxx-master& j+ z1 t+ x- }& C
18.png 0 W) k- Z# R: ]9 |
Step 5, 驱动头文件 w25qxx.h 中原来包含的的 spi.h, 因为我们使用的 Cube 库,头文件需要做如下替换:/ w6 Y- b+ u( l0 k  y5 E
//#include "spi.h"5 o6 B- q+ O$ _' d5 v) T0 M1 w
#include "stm32f0xx_hal.h"
! W" g* H5 r+ k( j2 YStep 6, main.h 里根据实际情况配置引脚,把驱动头文件 #include "w25qxx.h" 包含进来。片选信号 CS 可以由任意一个 GPIO 控制,在函数
7 i! h2 E) q4 C3 T0 eHAL_SPI_MspInit(SPI_HandleTypeDef *hspi)+ N$ }; @; ]' K
里把CS引脚配置为GPIO输出就行了,实际的拉低拉高是驱动代码实现的。6 i, z# c$ q4 w1 i. j& `- _( Z5 a

- W5 R; x, a9 Q' ]8 n 19.png 8 u) A9 I& j8 F* q2 i; C3 Q+ C
20.png 1 w9 z! l7 ]9 s  t7 O

3 j- B) a% c3 Q1 U) k+ gStep 7, 在 main.c 里定义了 SpiHandle 并指向 SPI1, 我们在 w25qxx.c里也要用到这个 Handle,所以通过 extern 来引用一下。
1 O; O6 b( F/ n; g- Z 21.png
% i: z" b3 u* w: l+ r8 GStep 8, 初始化 SPI1,然后调用 w25qxx 驱动的初始化代码 W25qxx_Init( ); 然后就可以用擦除,读写等函数了。: z; D$ p/ Z: C; B) c
2 }) q" G3 @6 e* a: ]
22.png
$ Y- G  C6 T9 R# F 23.png # W; P, w. M3 Q
在代码的修改过程中,我们可以再次体会 Cube 库的这种分层结构带来的好处,特别是如何与第三方驱动代码融合。各个模块就像积木一样,我们只需要把它们搭建起来就可以快速的实现我们想要的功能。
, _* [* q2 T/ }( g& s  O0 z下面是读出数据时实际抓取的波形:; a2 u% s5 O- x9 @- {
24.png 7 q7 V3 N4 [) ?& d# |) x

$ G. s$ D6 Q8 u* v6 q
赞 收藏 1 评论0 发布时间:2021-9-17 17:37

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版