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

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

[复制链接]
STMCU小助手 发布时间:2021-9-17 17:37
1.W25Q128 介绍6 B- s. O% `- T/ W
当我们有比较多的数据需要掉电存储时,上一篇文章所介绍的 24C02 (256个字节EEPROM)就不够了。此时我们会用到另外一种类型的存储器,即 Flash。比如具有 SPI 接口的 W25Q128。这颗小芯片虽然也只有简单的 8 个引脚,但存储容量却达到了128M-bit,也就是 16M 字节,同时它的读写速度可以达到 66MB/S。但是由于 STM32F030 不支持 Quad/Dual SPI,只能以标准 SPI 方式读写,所以速度会低一些。以下是 W25Q128 的主要特点:
0 v$ j+ b  w" ca.133MHz SPI Clock。, m5 V2 [' q8 J6 K7 D! t
b.10万次擦写寿命,20年数据保持时间。! p$ L& m# Z" D- M6 R# k5 e, x  V
c.每颗具有64-Bit唯一序列号 Unique ID。
  n# x! e. u/ @- c  H. Z, W, Md.每次可以写入 1 到 256 字节数据。
. G1 D0 M* [/ @7 x/ M* g2 oe.写之前需要对目的地址所在扇区进行擦除操作。
' Z  u: D- f1 g. g. L. t 14.png 7 h. ~3 X) a' z7 j0 G" k, {
( Winbond W25Q128 datasheet ); u. e( @8 h) Q. [( u- j2 Y
我们通过以下连线使 W25Q128 连至 STM32F030 的 SPI1:
' C5 }# j4 B# _0 l6 S$ H: v: ^  f& Q6 e( x- L# b

) V# c% A- \3 m- a4 P- ]W25Q128                   STM32F030
1 A( m, H  x! n/ O" s) t! xPin 1   /CS               PA4 也可以用其它 GPIO 引脚
4 x0 G) R4 ]5 J/ p0 s4 W) J' rPin 2   DO                PA6 SPI1_MISO  G, p' c& j0 B1 K
Pin 3   /WP              ( VCC )
% \0 l$ P. m4 c7 S$ S7 L7 gPin 4   GND              ( GND )    ; r: s8 p- V/ r5 N
Pin 5   DI                PA7 SPI1_MOSI( H, A: p- G- a3 y
Pin 6   CLK               PA5 SPI1_SCK* X  F5 \/ L; K8 r
Pin 7   /HOLD or /RESET   ( VCC )1 z& r% q4 x; L7 }
Pin 8   VCC               ( VCC )
; y$ S7 e) k9 B- Y1 C" A3 w% m! K2.代码5 ]2 c6 Y! _8 N0 r
代码的开发如果想提高效率,一个方法就是充分利用前人的成果,而不是自己一再的去造轮子。- r! A' |) L0 K. Y6 L
对于W25Q128 我们可以从Github上找到驱动代码:
7 D  {% n9 a, c# P9 d5 G/ F* [8 Dhttps://github.com/nimaltd/w25qxx
/ |2 z1 v& p# K0 \: oGNU General Public License v3.0
, v% z& k7 }0 S' y我们把它集成进SPI例程里,完成 W25Q128 的读写功能。
+ G' a* Y6 x; J' Z7 T+ }Step 1,下载后把解压的文件夹 w25qxx-master 放在 STM32Cube_FW_F0_V1.11.0\Drivers\BSP\Components
, @2 I& A; ]! t, S+ w$ p 15.png 0 W& Z' [; `) ]4 `
Step 2, 我们用 Keil 打开下面这个工程:
  G: B5 F# W$ [9 `STM32Cube_FW_F0_V1.11.0\Projects\STM32F030R8-Nucleo\Examples\SPI\SPI_FullDuplex_ComPolling\MDK-ARM\Project.uvprojx
# Y, v5 n$ f- x" R+ W# A6 @在项目(STM32F030R8-Nucleo)上点鼠标右键,选择Add Group...
) o# F/ B" R  d; Q8 u新建 Group 并改名称为 Drivers\BSP\Components\w25qxx-master
, A6 e2 D* T+ v! c$ e& p1 } 16.png
6 N; a8 G6 u4 ^Step 3, 在 Drivers\BSP\Components\w25qxx-master上点右键,选择Add Existing Files to Group "Drivers\BSP\Components\w25qxx-master"...,- P6 N7 x. ~0 ^% C; X
找到 Drivers/BSP/components/w25qxx-master/w25qxx.c 点击Add,然后可以看到w25qxx.c已经添加进项目中:
  j( }8 w5 L- |  A 17.png
* T# w1 u- h/ J2 s- l0 R& V; U' C& qStep 4, 在 Options for Target 里添加路径,这里使用的是工程所在路径的相对路径,也可以使用绝对路径,但如果工程拷贝到别的地方的时候,此包含路径就需要跟随更改。
9 ]0 Z. Z# s' b5 `Add include path  ../../../../../../Drivers/BSP/components/w25qxx-master
! A1 r; P7 b: F& B! D% W  @/ A 18.png   U% y* s- g4 D3 L
Step 5, 驱动头文件 w25qxx.h 中原来包含的的 spi.h, 因为我们使用的 Cube 库,头文件需要做如下替换:# ]* j  t9 |3 o
//#include "spi.h") e( _) ~$ b; }; ^5 i: H
#include "stm32f0xx_hal.h"5 b" P) o  X" ^, }* X5 u
Step 6, main.h 里根据实际情况配置引脚,把驱动头文件 #include "w25qxx.h" 包含进来。片选信号 CS 可以由任意一个 GPIO 控制,在函数! H- e6 w9 @' p4 y  h, f1 Z
HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
& g' C  p+ X. k; n% r8 j3 F里把CS引脚配置为GPIO输出就行了,实际的拉低拉高是驱动代码实现的。. h, G5 X( Z% c) n" Q
( j5 D# O. m, A
19.png
! t" h! i# o  h0 e 20.png
1 t$ E5 ?) [& }/ B+ m; t' q" v
4 Z3 t, l5 n8 }3 nStep 7, 在 main.c 里定义了 SpiHandle 并指向 SPI1, 我们在 w25qxx.c里也要用到这个 Handle,所以通过 extern 来引用一下。1 B2 }0 `. Z8 Y; `% }, d
21.png ) v# c! ?7 a" F( R! B
Step 8, 初始化 SPI1,然后调用 w25qxx 驱动的初始化代码 W25qxx_Init( ); 然后就可以用擦除,读写等函数了。' @2 v( w( G' L  ^1 p9 B; m- x/ j
" P7 |& @' |/ z4 V! S& Q3 C6 G
22.png
3 p7 e# R2 S5 c9 N 23.png ( x/ u6 l) S/ z5 ~( N6 v) Q
在代码的修改过程中,我们可以再次体会 Cube 库的这种分层结构带来的好处,特别是如何与第三方驱动代码融合。各个模块就像积木一样,我们只需要把它们搭建起来就可以快速的实现我们想要的功能。
, z7 s$ y( W: E$ }! G6 \; G+ }2 k. B下面是读出数据时实际抓取的波形:# O- K5 W1 Q  s1 Z
24.png
! m* r9 \8 ~% t4 U' G: R$ r
- D6 K! M7 H5 p" a
收藏 1 评论0 发布时间:2021-9-17 17:37

举报

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