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

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

[复制链接]
STMCU小助手 发布时间:2021-9-17 17:37
1.W25Q128 介绍( k3 |  g5 |% W9 w. }
当我们有比较多的数据需要掉电存储时,上一篇文章所介绍的 24C02 (256个字节EEPROM)就不够了。此时我们会用到另外一种类型的存储器,即 Flash。比如具有 SPI 接口的 W25Q128。这颗小芯片虽然也只有简单的 8 个引脚,但存储容量却达到了128M-bit,也就是 16M 字节,同时它的读写速度可以达到 66MB/S。但是由于 STM32F030 不支持 Quad/Dual SPI,只能以标准 SPI 方式读写,所以速度会低一些。以下是 W25Q128 的主要特点:3 F5 M* k/ e, |, {, e
a.133MHz SPI Clock。
: }$ j5 ^9 \6 O1 ~+ nb.10万次擦写寿命,20年数据保持时间。
3 O! j. Y. ~$ E# @c.每颗具有64-Bit唯一序列号 Unique ID。
3 ~8 R6 I! `& L: h& M; Qd.每次可以写入 1 到 256 字节数据。& _! Q$ J9 Z5 A9 o' ~! @& d7 C
e.写之前需要对目的地址所在扇区进行擦除操作。
2 S+ F& C: t' F5 Z% j; m3 r 14.png 7 [9 k8 G# c5 x1 D+ U) ?
( Winbond W25Q128 datasheet ); B! e3 G' m$ B8 Q
我们通过以下连线使 W25Q128 连至 STM32F030 的 SPI1:
( j( R* g, k) u8 }' g! T; \0 ~0 \3 ]% q$ `, N1 i% o

  t' c- z6 l7 j# |- y$ m! B/ LW25Q128                   STM32F030
8 {: U& ], z: ^0 sPin 1   /CS               PA4 也可以用其它 GPIO 引脚: m- X: ]9 [( ^. U
Pin 2   DO                PA6 SPI1_MISO% k9 L0 `" L3 y1 d* {" C1 J) A
Pin 3   /WP              ( VCC )1 H2 T" ~" f2 F: F$ ]' d
Pin 4   GND              ( GND )   
' Y& e- W8 m) pPin 5   DI                PA7 SPI1_MOSI0 j; P# L- f8 d& r2 E$ Q
Pin 6   CLK               PA5 SPI1_SCK
% h% k! Q; u3 rPin 7   /HOLD or /RESET   ( VCC )
0 P" M7 @& f" v8 W( pPin 8   VCC               ( VCC )5 D) w6 l- X+ A: r/ r4 T* W+ C
2.代码
6 H: T0 A. [  K& k& X& q$ x代码的开发如果想提高效率,一个方法就是充分利用前人的成果,而不是自己一再的去造轮子。3 f: {0 `. Q1 e) n- ]5 H
对于W25Q128 我们可以从Github上找到驱动代码:) X0 h' Q& G6 {' ]) x5 ?( c- S
https://github.com/nimaltd/w25qxx
+ V/ G# J. i3 k$ b& Y/ K8 S3 U& EGNU General Public License v3.01 c9 e" D* E3 D2 z& _  b: J+ v8 {
我们把它集成进SPI例程里,完成 W25Q128 的读写功能。
* s% N) C( j2 Z- jStep 1,下载后把解压的文件夹 w25qxx-master 放在 STM32Cube_FW_F0_V1.11.0\Drivers\BSP\Components# w/ h5 h' H" y, |
15.png
/ D% r2 w6 [* d9 ]& F* @: WStep 2, 我们用 Keil 打开下面这个工程:4 E* v1 [8 J( Q1 ?, C9 J" c9 T
STM32Cube_FW_F0_V1.11.0\Projects\STM32F030R8-Nucleo\Examples\SPI\SPI_FullDuplex_ComPolling\MDK-ARM\Project.uvprojx1 [7 m; H$ b) y
在项目(STM32F030R8-Nucleo)上点鼠标右键,选择Add Group...
5 W2 R, m) d& ?3 ~& B& D( A新建 Group 并改名称为 Drivers\BSP\Components\w25qxx-master
% \2 c& s8 l% P+ r' y* l$ } 16.png : }( s7 T4 J/ c  x, V2 c
Step 3, 在 Drivers\BSP\Components\w25qxx-master上点右键,选择Add Existing Files to Group "Drivers\BSP\Components\w25qxx-master"...,5 x( ]9 q7 x+ ^# y( J5 C' ^- y
找到 Drivers/BSP/components/w25qxx-master/w25qxx.c 点击Add,然后可以看到w25qxx.c已经添加进项目中:
2 C6 x: e; M. I: | 17.png ) d* G/ f7 E& X3 R( @2 B
Step 4, 在 Options for Target 里添加路径,这里使用的是工程所在路径的相对路径,也可以使用绝对路径,但如果工程拷贝到别的地方的时候,此包含路径就需要跟随更改。4 H% A7 B% H% y) [! |
Add include path  ../../../../../../Drivers/BSP/components/w25qxx-master
$ z8 j- E$ m4 t 18.png ( H  C  {: q$ A" z
Step 5, 驱动头文件 w25qxx.h 中原来包含的的 spi.h, 因为我们使用的 Cube 库,头文件需要做如下替换:9 O' w1 n% P9 g3 ~0 t
//#include "spi.h"8 x) g9 {; {$ l6 k4 F% u1 h1 t
#include "stm32f0xx_hal.h"8 Y0 ]# g' w: X2 ~) G
Step 6, main.h 里根据实际情况配置引脚,把驱动头文件 #include "w25qxx.h" 包含进来。片选信号 CS 可以由任意一个 GPIO 控制,在函数1 ~! ]5 q9 n1 b/ l
HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
8 A' b, g. t+ [" l里把CS引脚配置为GPIO输出就行了,实际的拉低拉高是驱动代码实现的。) r4 c7 H& h, P) S7 U& M

7 u: f: Z0 a! a/ B$ r 19.png
; N( ]+ V  S# I! f8 I7 ] 20.png 9 t9 n, S; l3 C, C4 [1 \1 B
1 G6 C- N' Z/ o+ `
Step 7, 在 main.c 里定义了 SpiHandle 并指向 SPI1, 我们在 w25qxx.c里也要用到这个 Handle,所以通过 extern 来引用一下。! U* v% \- Y* B. C! P
21.png
/ d) {* _3 U4 w2 m0 e. Z0 y* N2 RStep 8, 初始化 SPI1,然后调用 w25qxx 驱动的初始化代码 W25qxx_Init( ); 然后就可以用擦除,读写等函数了。: G( w' }1 X% Z

- ]1 ?, f' C; ]+ v 22.png
0 @  R3 ]& P) w( Y3 u 23.png
& Q# r7 a0 l  H$ l在代码的修改过程中,我们可以再次体会 Cube 库的这种分层结构带来的好处,特别是如何与第三方驱动代码融合。各个模块就像积木一样,我们只需要把它们搭建起来就可以快速的实现我们想要的功能。
, ?; @) i, ^, ~" N3 E7 H下面是读出数据时实际抓取的波形:
7 B/ |& P0 s% Q 24.png
2 [+ W$ g- D& j$ P2 }  a! [
4 N' Y) N7 t! D: ?2 o) ~2 |3 a
收藏 1 评论0 发布时间:2021-9-17 17:37

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版