1.W25Q128介紹
當(dāng)我們有比較多的數(shù)據(jù)需要掉電存儲(chǔ)時(shí),上一篇文章所介紹的 24C02 (256個(gè)字節(jié)EEPROM)就不夠了。此時(shí)我們會(huì)用到另外一種類型的存儲(chǔ)器,即 Flash。比如具有 SPI 接口的 W25Q128。這顆小芯片雖然也只有簡(jiǎn)單的 8 個(gè)引腳,但存儲(chǔ)容量卻達(dá)到了128M-bit,也就是 16M 字節(jié),同時(shí)它的讀寫速度可以達(dá)到 66MB/S。但是由于 STM32F030 不支持 Quad/Dual SPI,只能以標(biāo)準(zhǔn) SPI 方式讀寫,所以速度會(huì)低一些。以下是 W25Q128 的主要特點(diǎn):
a.133MHz SPI Clock。
b.10萬次擦寫壽命,20年數(shù)據(jù)保持時(shí)間。
c.每顆具有64-Bit唯一序列號(hào) Unique ID。
d.每次可以寫入 1 到 256 字節(jié)數(shù)據(jù)。
e.寫之前需要對(duì)目的地址所在扇區(qū)進(jìn)行擦除操作。
( 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.代碼
代碼的開發(fā)如果想提高效率,一個(gè)方法就是充分利用前人的成果,而不是自己一再的去造輪子。
GNU General Public License v3.0我們把它集成進(jìn)SPI例程里,完成 W25Q128 的讀寫功能。Step 1,下載后把解壓的文件夾 w25qxx-master 放在 STM32Cube_FW_F0_V1.11.0\Drivers\BSP\Components
Step 2, 我們用 Keil 打開下面這個(gè)工程:STM32Cube_FW_F0_V1.11.0\Projects\STM32F030R8-Nucleo\Examples\SPI\SPI_FullDuplex_ComPolling\MDK-ARM\Project.uvprojx在項(xiàng)目(STM32F030R8-Nucleo)上點(diǎn)鼠標(biāo)右鍵,選擇Add Group...新建 Group 并改名稱為 Drivers\BSP\Components\w25qxx-master
Step 3, 在 Drivers\BSP\Components\w25qxx-master上點(diǎn)右鍵,選擇Add Existing Files to Group "Drivers\BSP\Components\w25qxx-master"...,找到 Drivers/BSP/components/w25qxx-master/w25qxx.c 點(diǎn)擊Add,然后可以看到w25qxx.c已經(jīng)添加進(jìn)項(xiàng)目中:
Step 4, 在 Options for Target 里添加路徑,這里使用的是工程所在路徑的相對(duì)路徑,也可以使用絕對(duì)路徑,但如果工程拷貝到別的地方的時(shí)候,此包含路徑就需要跟隨更改。Add include path ../../../../../../Drivers/BSP/components/w25qxx-master
Step 5, 驅(qū)動(dòng)頭文件 w25qxx.h 中原來包含的的 spi.h, 因?yàn)槲覀兪褂玫?Cube 庫,頭文件需要做如下替換://#include "spi.h"#include "stm32f0xx_hal.h"Step 6, main.h 里根據(jù)實(shí)際情況配置引腳,把驅(qū)動(dòng)頭文件 #include "w25qxx.h" 包含進(jìn)來。片選信號(hào) CS 可以由任意一個(gè) GPIO 控制,在函數(shù)HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)里把CS引腳配置為GPIO輸出就行了,實(shí)際的拉低拉高是驅(qū)動(dòng)代碼實(shí)現(xiàn)的。
Step 7, 在 main.c 里定義了 SpiHandle 并指向 SPI1, 我們?cè)?w25qxx.c里也要用到這個(gè) Handle,所以通過 extern 來引用一下。
Step 8, 初始化 SPI1,然后調(diào)用 w25qxx 驅(qū)動(dòng)的初始化代碼 W25qxx_Init( ); 然后就可以用擦除,讀寫等函數(shù)了。
在代碼的修改過程中,我們可以再次體會(huì) Cube 庫的這種分層結(jié)構(gòu)帶來的好處,特別是如何與第三方驅(qū)動(dòng)代碼融合。各個(gè)模塊就像積木一樣,我們只需要把它們搭建起來就可以快速的實(shí)現(xiàn)我們想要的功能。下面是讀出數(shù)據(jù)時(shí)實(shí)際抓取的波形:
審核編輯:劉清
-
單片機(jī)
+關(guān)注
關(guān)注
6040文章
44615瀏覽量
637319 -
EEPROM
+關(guān)注
關(guān)注
9文章
1030瀏覽量
81819 -
SPI接口
+關(guān)注
關(guān)注
0文章
259瀏覽量
34475 -
STM32F0
+關(guān)注
關(guān)注
0文章
61瀏覽量
17115
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論