STM32F0單片機快速入門十:用 SPI HAL 庫讀寫W25Q128

1. W25Q128 介紹

當我們有比較多的數據需要掉電存儲時,上一篇文章所介紹的 24C02 (256個字節EEPROM)就不夠了。此時我們會用到另外一種類型的存儲器,即 Flash。比如具有 SPI 接口的 W25Q128。這顆小芯片雖然也只有簡單的 8 個引腳,但存儲容量卻達到了128M-bit,也就是 16M 字節,同時它的讀寫速度可以達到 66MB/S。但是由於 STM32F030 不支持 Quad/Dual SPI,只能以標準 SPI 方式讀寫,所以速度會低一些。以下是 W25Q128 的主要特點:

a. 133MHz SPI Clock。

b. 10萬次擦寫壽命,20年數據保持時間。

c. 每顆具有64-Bit唯一序列號 Unique ID。

d. 每次可以寫入 1 到 256 字節數據。

e. 寫之前需要對目的地址所在扇區進行擦除操作。

STM32F0單片機快速入門十:用 SPI HAL 庫讀寫W25Q128

( 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上找到驅動代碼:

https://github.com/nimaltd/w25qxx

GNU General Public License v3.0


我們把它集成進SPI例程裡,完成 W25Q128 的讀寫功能。

Step 1,下載後把解壓的文件夾 w25qxx-master 放在 STM32Cube_FW_F0_V1.11.0\Drivers\BSP\Components

STM32F0單片機快速入門十:用 SPI HAL 庫讀寫W25Q128

Step 2, 我們用 Keil 打開下面這個工程:

STM32Cube_FW_F0_V1.11.0\Projects\STM32F030R8-Nucleo\Examples\SPI\SPI_FullDuplex_ComPolling\MDK-ARM\Project.uvprojx

在項目(STM32F030R8-Nucleo)上點鼠標右鍵,選擇Add Group...

新建 Group 並改名稱為 Drivers\BSP\Components\w25qxx-master

STM32F0單片機快速入門十:用 SPI HAL 庫讀寫W25Q128

Step 3, 在 Drivers\BSP\Components\w25qxx-master上點右鍵,選擇Add Existing Files to Group "Drivers\BSP\Components\w25qxx-master"...,

找到
Drivers/BSP/components/w25qxx-master/w25qxx.c 點擊Add,然後可以看到w25qxx.c已經添加進項目中:

STM32F0單片機快速入門十:用 SPI HAL 庫讀寫W25Q128

Step 4, 在 Options for Target 裡添加路徑,這裡使用的是工程所在路徑的相對路徑,也可以使用絕對路徑,但如果工程拷貝到別的地方的時候,此包含路徑就需要跟隨更改。

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

STM32F0單片機快速入門十:用 SPI HAL 庫讀寫W25Q128

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輸出就行了,實際的拉低拉高是驅動代碼實現的。

STM32F0單片機快速入門十:用 SPI HAL 庫讀寫W25Q128

STM32F0單片機快速入門十:用 SPI HAL 庫讀寫W25Q128

Step 7, 在 main.c 裡定義了 SpiHandle 並指向 SPI1, 我們在 w25qxx.c裡也要用到這個 Handle,所以通過 extern 來引用一下。

STM32F0單片機快速入門十:用 SPI HAL 庫讀寫W25Q128

Step 8, 初始化 SPI1,然後調用 w25qxx 驅動的初始化代碼 W25qxx_Init( ); 然後就可以用擦除,讀寫等函數了。

STM32F0單片機快速入門十:用 SPI HAL 庫讀寫W25Q128

STM32F0單片機快速入門十:用 SPI HAL 庫讀寫W25Q128

在代碼的修改過程中,我們可以再次體會 Cube 庫的這種分層結構帶來的好處,特別是如何與第三方驅動代碼融合。各個模塊就像積木一樣,我們只需要把它們搭建起來就可以快速的實現我們想要的功能。

下面是讀出數據時實際抓取的波形:

STM32F0單片機快速入門十:用 SPI HAL 庫讀寫W25Q128


參考資料:

PM0215 STM32F0xxx Cortex-M0 programming manual

UM1785 Description of STM32F0 HAL and low-layer drivers

Winbond W25Q128 Datasheet

STM32F030 Datasheet

STM32F030 Reference Manual


分享到:


相關文章: