15.1 FLASH
Flash,全名叫做Flash EEPROM Memory,即平時所說的“閃存”,它結合了ROM和RAM的長處,不僅可以反復擦除,還可以快速讀取數(shù)據(jù),STM32運行的程序其實就是存放在Flash當中,但是由于STM32的Flash一般1M左右,只能存儲程序大小的數(shù)據(jù),所以往往需要外擴Flash來存儲數(shù)據(jù),比如LCD界面當中的漢字字庫,以及文件系統(tǒng)中讀取的文件內(nèi)容。
但是一般Flash的擦除次數(shù)有限制,STM32F1系列最新的文檔指出,片內(nèi)的FLASH擦寫次數(shù)大約在1W次左右,所以一般Flash用于擦除次數(shù)不多,但是數(shù)據(jù)量很大的場合。
這個Flash讀寫實驗我們用到的芯片是W25Q128,這是一款采用SPI協(xié)議進行讀寫的Flash芯片,存儲容量為128Mbit,合計16Mbyte,工作電壓2.7V~3.6V。這個實驗我們采用STM32內(nèi)置的SPI模塊來進行對芯片的讀寫操作,STM32F1的SPI功能很強大,SPI時鐘最高可以到18MHz,支持DMA,可以配置為SPI協(xié)議或者I2S協(xié)議。
15.2 硬件SPI模塊
通過之前51單片機開發(fā)我們可以知道,SPI協(xié)議一共需要四根線來完成數(shù)據(jù)通信,即片選CS,總線時鐘SCK,主機輸入從機輸出MISO和主機輸出從機輸入MOSI四根數(shù)據(jù)線。STM32的內(nèi)部SPI模塊結構框圖如下圖所示。
從上面的結構框圖我們可以發(fā)現(xiàn),硬件SPI的優(yōu)勢就在于開發(fā)者不需要考慮SPI的詳細參數(shù)以及時序,只需要配置內(nèi)部的寄存器,設置速率,電平就可以實現(xiàn)SPI通信。
15.3 相關寄存器
15.3.1 SPI控制寄存器1:SPIx_CR1
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
BIDIMODE | BIDIOE | CRCEN | CRCNEXT | DFF | RXONLY | SSM | SSI | LSBFIRST | SPE | BR[2:0] | MSTR | CPOL | CPHA |
Bit 15:雙向數(shù)據(jù)模式使能
0:選擇雙線雙向模式
1:選擇單線雙向模式
Bit 14:雙向模式下的輸出使能
0:輸出禁止(只收模式)
1:輸出使能(只發(fā)模式)
Bit 13:硬件CRC校驗使能
0:禁止CRC計算
1:啟動CRC計算
Bit 12:下一個發(fā)送CRC
0:下一個發(fā)送的值來自發(fā)送緩沖區(qū)
1:下一個發(fā)送的值來自發(fā)送CRC寄存器
Bit 11:數(shù)據(jù)幀格式
0:使用8位數(shù)據(jù)幀格式進行發(fā)送/接收
1:使用16位數(shù)據(jù)幀格式進行發(fā)送/接收
Bit 10:只接收
0:全雙工(發(fā)送和接收)
1:禁止輸出(只接收模式)
Bit 9:軟件從設備管理
0:禁止軟件從設備管理
1:啟用軟件從設備管理
Bit 8:內(nèi)部從設備選擇
注:該位只在SSM位為1時有意義。它決定了NSS上的電平,在NSS引腳上的I/O操作無效
Bit 7:幀格式
0:先發(fā)送MSB
1:先發(fā)送LSB
Bit 6:SPI使能
0:禁止SPI設備
1:開啟SPI設備
Bit 5~Bit 3:波特率控制
000:f PCLK /2
001:f PCLK /4
010:f PCLK /8
011:f PCLK /16
100:f PCLK /32
101:f PCLK /64
110:f PCLK /128
111:f PCLK /256
Bit 2:主設備選擇
0:配置為從設備
1:配置為主設備
Bit 1:時鐘極性
0:空閑狀態(tài)時,SCK保持低電平
1:空閑狀態(tài)時,SCK保持高電平
Bit 0:時鐘相位
0:數(shù)據(jù)采樣從第一個時鐘邊沿開始
1:數(shù)據(jù)采樣從第二個時鐘邊沿開始
15.3.2 SPI狀態(tài)寄存器:SPIx_SR
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- | BSY | OVR | MODF | CRCERR | UDR | CHSIDE | TXE | RXNE |
Bit 7:忙標志
0:SPI不忙
1:SPI正忙于通信,或者發(fā)送緩沖非空
Bit 6:溢出標志
0:沒有出現(xiàn)溢出錯誤
1:出現(xiàn)溢出錯誤
Bit 5:模式錯誤(在SPI模式下不使用)
0:沒有出現(xiàn)模式錯誤
1:出現(xiàn)模式錯誤
Bit 4:CRC錯誤標志(在SPI模式下不使用)
0:收到的CRC值和SPI_RXCRCR寄存器中的值匹配
1:收到的CRC值和SPI_RXCRCR寄存器中的值不匹配
Bit 3:下溢標志位(在SPI模式下不使用)
0:未發(fā)生下溢
1:發(fā)生下溢
Bit 2:聲道(在SPI模式下不使用)
0:需要傳輸或者接收左聲道
1:需要傳輸或者接收右聲道
Bit 1:發(fā)送緩沖為空
0:發(fā)送緩沖非空
1:發(fā)送緩沖為空
Bit 0:接收緩沖非空
0:接收緩沖為空
1:接收緩沖非空
15.4 實驗例程
功能:在Flash中寫入一段字符串,而后讀出來并顯示在TFTLCD上。
(1)創(chuàng)建w25q128.h并輸入以下代碼。
/*********************************************************************************************************
FLASH 驅(qū) 動 文 件
*********************************************************************************************************/
#ifndef _W25Q128_H_
#define _W25Q128_H_
#include "sys.h"
/*********************************************************************************************************
端 口 定 義
*********************************************************************************************************/
#define W25QXX_CS PBout( 12 ) //W25QXX的片選信號
/*********************************************************************************************************
數(shù) 據(jù) 定 義
*********************************************************************************************************/
//SPI總線速度設置
#define SPI_SPEED_2 0
#define SPI_SPEED_4 1
#define SPI_SPEED_8 2
#define SPI_SPEED_16 3
#define SPI_SPEED_32 4
#define SPI_SPEED_64 5
#define SPI_SPEED_128 6
#define SPI_SPEED_256 7
//指令表
#define W25X_WriteEnable 0x06
#define W25X_WriteDisable 0x04
#define W25X_ReadStatusReg 0x05
#define W25X_WriteStatusReg 0x01
#define W25X_ReadData 0x03
#define W25X_FastReadData 0x0B
#define W25X_FastReadDual 0x3B
#define W25X_PageProgram 0x02
#define W25X_BlockErase 0xD8
#define W25X_SectorErase 0x20
#define W25X_ChipErase 0xC7
#define W25X_PowerDown 0xB9
#define W25X_ReleasePowerDown 0xAB
#define W25X_DeviceID 0xAB
#define W25X_ManufactDeviceID 0x90
#define W25X_JedecDeviceID 0x9F
/*********************************************************************************************************
函 數(shù) 列 表
*********************************************************************************************************/
void W25QXX_Init( void ) ; //初始化Flash
void W25QXX_Read( u8* pBuffer, u32 Address, u16 Len ) ; //讀取Flash
void W25QXX_Write( u8* pBuffer, u32 WriteAddr, u16 NumByteToWrite ) ; //寫入Flash
void W25QXX_Erase_Chip( void ) ; //整片擦除
void W25QXX_Erase_Sector( u32 Dst_Addr ) ; //扇區(qū)擦除
#endif
-
單片機
+關注
關注
6030文章
44489瀏覽量
631971 -
FlaSh
+關注
關注
10文章
1614瀏覽量
147652 -
ROM
+關注
關注
4文章
562瀏覽量
85623 -
STM32
+關注
關注
2264文章
10854瀏覽量
354291 -
EEPROM
+關注
關注
9文章
1008瀏覽量
81332
發(fā)布評論請先 登錄
相關推薦
評論