STM32F0单片机快速入门十: 用 SPI HAL 库读写W25Q128

发布时间:2023-03-14  

1.W25Q128 介绍

当我们有比较多的数据需要掉电存储时,上一篇文章所介绍的 24C02 (256个字节EEPROM)就不够了。此时我们会用到另外一种类型的存储器,即 Flash。比如具有 SPI 接口的 W25Q128。这颗小芯片虽然也只有简单的 8 个引脚,但存储容量却达到了128M-bit,也就是 16M 字节,同时它的读写速度可以达到 66MB/S。但是由于 STM32F030 不支持 Quad/Dual SPI,只能以标准 SPI 方式读写,所以速度会低一些。以下是 W25Q128 的主要特点:

  1. 133MHz SPI Clock。

  2. 10万次擦写寿命,20年数据保持时间。

  3. 每颗具有64-Bit唯一序列号 Unique ID。

  4. 每次可以写入 1 到 256 字节数据。

  5. 写之前需要对目的地址所在扇区进行擦除操作。


( Winbond W25Q128 datasheet )

我们通过以下连线使 W25Q128 连至 STM32F030 的 SPI1:

W25Q128 STM32F030

Pin 1 /CS PA4 也可以用其它 GPIO 引脚

Pin 2 DO PA6 SPI1_MISO

Pin 3 /WP ( VCC )

Pin 4 GND ( GND )

Pin 5 DI PA7 SPI1_MOSI

Pin 6 CLK PA5 SPI1_SCK

Pin 7 /HOLD or /RESET ( VCC )

Pin 8 VCC ( VCC )

2.代码

代码的开发如果想提高效率,一个方法就是充分利用前人的成果,而不是自己一再的去造轮子。

对于W25Q128 我们可以从Github上找到驱动代码:

github.com/nimaltd/w25q

GNU General Public License v3.0

我们把它集成进SPI例程里,完成 W25Q128 的读写功能。

Step 1,下载后把解压的文件夹 w25qxx-master 放在 STM32Cube_FW_F0_V1.11.0DriversBSPComponents

Step 2, 我们用 Keil 打开下面这个工程:

STM32Cube_FW_F0_V1.11.0ProjectsSTM32F030R8-NucleoExamplesSPISPI_FullDuplex_ComPollingMDK-ARMProject.uvprojx

在项目(STM32F030R8-Nucleo)上点鼠标右键,选择Add Group...

新建 Group 并改名称为 DriversBSPComponentsw25qxx-master

Step 3, 在 DriversBSPComponentsw25qxx-master上点右键,选择Add Existing Files to Group "DriversBSPComponentsw25qxx-master"...,

找到 Drivers/BSP/components/w25qxx-master/w25qxx.c 点击Add,然后可以看到w25qxx.c已经添加进项目中:

Step 4, 在 Options for Target 里添加路径,这里使用的是工程所在路径的相对路径,也可以使用绝对路径,但如果工程拷贝到别的地方的时候,此包含路径就需要跟随更改。

Add include path ../../../../../../Drivers/BSP/components/w25qxx-master

Step 5, 驱动头文件 w25qxx.h 中原来包含的的 spi.h, 因为我们使用的 Cube 库,头文件需要做如下替换:

//#include "spi.h"

#include "stm32f0xx_hal.h"

Step 6, main.h 里根据实际情况配置引脚,把驱动头文件 #include "w25qxx.h" 包含进来。片选信号 CS 可以由任意一个 GPIO 控制,在函数

HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)

里把CS引脚配置为GPIO输出就行了,实际的拉低拉高是驱动代码实现的。

Step 7, 在 main.c 里定义了 SpiHandle 并指向 SPI1, 我们在 w25qxx.c里也要用到这个 Handle,所以通过 extern 来引用一下。

Step 8, 初始化 SPI1,然后调用 w25qxx 驱动的初始化代码 W25qxx_Init( ); 然后就可以用擦除,读写等函数了。

在代码的修改过程中,我们可以再次体会 Cube 库的这种分层结构带来的好处,特别是如何与第三方驱动代码融合。各个模块就像积木一样,我们只需要把它们搭建起来就可以快速的实现我们想要的功能。

下面是读出数据时实际抓取的波形:

参考资料:

PM0215 STM32F0xxx Cortex-M0 programming manual

UM1785 Description of STM32F0 HAL and low-layer drivers

Winbond W25Q128 Datasheet

STM32F030 Datasheet

STM32F030 Reference Manual


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>