參考
http://t.csdnimg.cn/gHcrG
一、NOR FLASH簡介
XIP技術:https://blog.csdn.net/ffdia/article/details/87437872?fromshare=blogdetail
NOR Flash 和 NAND Flash 的特點和應用舉例:
NOR Flash:
特點:
支持隨機訪問,可以直接像讀取內存一樣通過獨立的地址線和數據線進行字節級讀取,不需要額外的解碼電路。
提供快速的讀取速度,通常比NAND Flash快,特別適合于執行代碼(XIP,eXecute-In-Place)的場合。
擦除和寫入是以區塊(sector)為單位,但也可以支持單個字節的編程。
通常沒有壞塊管理問題,出廠時質量較為均勻。
容量相對較小,成本相對較高。
應用舉例:
存儲程序代碼,例如微控制器的Bootloader、嵌入式系統的固件、計算機BIOS等。
快速讀取要求較高的小型存儲應用,如無線通信模塊、工業控制設備中的程序存儲。
NAND Flash:
特點:
不支持隨機訪問,讀取操作需要通過I/O口間接進行,地址和數據共用總線。
讀取速度略低于NOR Flash,但寫入和擦除速度較快,尤其是以頁(page)為單位的大批量操作。
通常以較大的塊(block)為擦除單位,且存在壞塊管理問題,需要專門的管理機制。
成本較低,容量較大,體積緊湊,適合大規模數據存儲。
應用舉例:
大容量存儲設備,如嵌入式系統的文件系統、消費類電子產品中的數據存儲、SSD(固態硬盤)。
移動設備的內置存儲,如智能手機和平板電腦的eMMC(Embedded MultiMedia Card)。
U盤、存儲卡等便攜式存儲設備。
二、NM25Q128簡介
NM25Q128是一款128Mb(16MB)容量的NOR型串行閃存芯片,專為需要高速、可靠數據存儲的應用而設計。該器件通過SPI(Serial Peripheral Interface)接口與主控設備通信,提供了一種節省引腳、易于集成到系統中的存儲方案。
特點概述:
容量:128Mb,即16,777,216比特(約2MB)。
擦寫次數:具有很高的耐用性,可承受至少10萬次的擦寫周期。
數據保存期長:數據可保存長達20年以上,體現了NOR Flash優異的數據保留性能。
SPI接口:支持SPI模式0(CPOL=0, CPHA=0)和模式3(CPOL=1, CPHA=1),適用于多種工作環境和系統設計需求。
數據格式:采用8位數據寬度傳輸,遵循先發高位(MSB)再發低位(LSB)的傳輸規則。
傳輸速度:標準模式下支持高達104M bit/s的數據傳輸速率,具有高效的讀寫性能。
接口信號說明:
CS(Chip Select):片選信號輸入,用于選擇NM25Q128作為SPI總線上的活動設備。
HOLD:暫停通訊信號,當該信號為低電平時,暫時停止SPI通信。
SO(Serial Output):數據輸出引腳,從NM25Q128向主控設備傳送數據。
CLK(Clock):時鐘輸入引腳,為主設備與NM25Q128之間的數據傳輸提供同步時鐘信號。
WP(Write Protect):寫保護功能引腳,用于禁止或允許對閃存進行寫入操作。
SI(Serial Input):數據輸入引腳,用于將數據從主設備寫入NM25Q128。
總的來說,NM25Q128因其高密度、高速度、易用性和耐用性等特點,被廣泛應用于嵌入式系統、固件存儲、微控制器的代碼存儲、數據記錄等多種場合。
三、NM25Q128存儲結構
NM25Q128的存儲結構按照地址范圍、頁、扇區和塊進行組織,其具體劃分如下:
**地址范圍:**NM25Q128的地址范圍是從0x00000000到0x00FFFFFF,共計16,777,216個地址,對應128Mbit(16,777,216比特)或16MByte(16,777,216字節)的存儲容量。
存儲單元劃分:
Page:NM25Q128的一個頁面(Page)大小為256字節(1byte * 256)。
Sector:一個扇區(Sector)由16個連續的頁面組成,因此一個扇區的大小為16 * 256字節 = 4096字節。
Block:一個塊(Block)由16個連續的扇區組成,所以一個塊的大小為16 * 4096字節 = 65,536字節(即64KB)。
**整體結構:**整個NM25Q128由256個這樣的塊組成,因此其總容量為256 * 65,536字節 = 16,777,216字節(即16MByte)。
這種分層結構使得NM25Q128在進行數據管理和維護時具有良好的靈活性,最小擦除單位為一個扇區,數據讀寫則以字節為單位。在進行擦除操作時,必須以扇區為單位進行,這樣有助于提升使用壽命并簡化固件升級等操作。
四、NM25Q128常用指令
NM25Q128或者其他NOR Flash常用的指令還包括但不限于以下幾種:
指令(十六進制):0x06
名稱:寫使能(Write Enable)
作用:在對NOR Flash進行任何寫入操作(包括頁寫和擦除)之前,必須先發送這條指令,使得NOR Flash進入寫入允許狀態。
指令(十六進制):0x05
名稱:讀狀態寄存器1(Read Status Register 1)
作用:用于讀取NOR Flash的狀態寄存器1,確認NOR Flash是否處于空閑狀態,是否準備好進行下一步操作,特別是擦除操作之前需要確認設備是否已完成上一次操作。
指令(十六進制):0x03
名稱:讀數據(Read Data)
作用:用于從NOR Flash中讀取數據,通過指定地址讀取連續的數據流。
指令(十六進制):0x02
名稱:頁編程(Page Program)
作用:用于向NOR Flash的指定地址開始的連續256字節區域寫入數據。注意,寫入數據必須按照頁的邊界進行,不能跨越頁的邊界。
指令(十六進制):0x20
名稱:扇區擦除(Sector Erase)
作用:對NOR Flash中最小擦除單位(扇區)進行擦除操作,通常NM25Q128的一個扇區大小為4096字節(4KB)。
除此之外,還有其他的指令,例如:
指令(十六進制):0xD8
名稱:塊擦除(Bulk Erase)
作用:擦除整個芯片的所有數據,對于NM25Q128來說,一次性擦除所有256個塊。
指令(十六進制):0xB0~0xBF
名稱:讀取標識符(Read Manufacturer and Device ID)
作用:讀取制造商ID和設備ID,用于驗證和識別具體的NOR Flash型號。
指令(十六進制):0x04
名稱:寫禁止(Write Disable)
作用:結束寫入操作序列,防止意外的寫入動作發生,使NOR Flash退出寫入允許狀態。
五、NM25Q128 讀/擦除/寫 步驟
NM25Q128的讀、擦除、寫操作時序如下:
1.寫使能(Write Enable)
發送指令:0x06H
作用:在執行寫操作(如頁寫或擦除)之前,必須先發送該指令,使NOR Flash進入可寫狀態。
2.讀狀態寄存器1(Read Status Register 1)
發送指令:0x05H
作用:讀取NOR Flash的狀態寄存器1,檢查設備是否處于就緒狀態,以便進行下一步操作。
3.讀數據時序(Read Data Bytes)
發送指令:0x03H
時序步驟:
發送讀指令(0x03H);
發送要讀取數據的起始地址;
從數據線(SO)接收數據;
循環上述步驟直到讀取所需的所有數據。
4.頁寫時序(Page Program)
發送指令:0x02H
時序步驟:
發送寫使能指令(0x06H);
發送頁寫指令(0x02H);
發送要寫入數據的目標地址;
將最多256字節的數據通過數據線(SI)發送到NOR Flash;
等待寫操作完成,可通過讀狀態寄存器來確認。
5.扇區擦除時序(Sector Erase)
發送指令:0x20H
時序步驟:
發送寫使能指令(0x06H);
發送扇區擦除指令(0x20H);
發送要擦除扇區的起始地址(地址應對齊到扇區邊界);
等待擦除操作完成,可通過讀狀態寄存器來確認。
在實際操作過程中,還需注意地址和數據的傳輸格式以及相關的時鐘同步,確保嚴格按照器件數據手冊的要求進行操作。此外,某些操作完成后,建議發送寫禁止指令(0x04H)以防止意外的寫操作。
在執行諸如Page Program(頁寫)、Sector Erase(扇區擦除)、Block Erase(塊擦除)和Chip Erase(整片擦除)以及Write Status Register(寫狀態寄存器)等操作之前,必須先向NOR Flash發送Write Enable(寫使能)指令(0x06H)。這個指令的作用是讓NOR Flash進入可寫狀態,只有在寫使能之后,才能進行后續的寫入或擦除操作。
當寫使能指令發出后,NOR Flash內部的相關控制位會被設置,允許接下來的寫入或擦除指令被執行。完成相應的寫入或擦除操作后,通常需要發送Write Disable(寫禁止)指令以取消寫使能狀態,防止在不需要寫入的時候誤操作導致數據損壞。寫禁止指令通常為0x04H。
NM25Q128的讀操作步驟可以細化如下:
1.發送讀命令
向SPI總線的MOSI(數據輸入)線上發送0x03H(讀數據指令)。
2.發送地址
NM25Q128地址范圍是0x000000到0xFFFFFF,總共24位。
地址需要按照小端模式(Least Significant Bit First,LSB)分三次發送,每次8位。例如,要讀取地址0x123456,則應按以下順序發送地址字節:
第一次發送最低8位(0x56)。
第二次發送中間8位(0x34)。
第三次發送最高8位(0x12)。
3.讀取數據
在地址發送完畢后,發送一個無效數據字節(通常是0xFF)到SPI總線的MOSI線上,此時NM25Q128開始在MISO(數據輸出)線上輸出請求地址處的數據。
接收從NM25Q128返回的第一個數據字節,并且只要保持SPI時鐘(SCK)的持續脈沖,就可以連續讀取數據,直至所需數據全部讀取完畢。
總之,NM25Q128的讀操作流程是先發送讀指令,接著發送目標地址,然后通過發送無效數據字節觸發并連續讀取存儲器中的數據。在整個讀取過程中,務必確保時鐘信號的正確同步,以保證數據的準確傳輸。
NM25Q128擦除扇區的具體步驟如下:
1.發送寫使能命令
向SPI總線的MOSI(數據輸入)線上發送0x06H(寫使能命令),使NOR Flash進入可寫狀態。
2.等待空閑
讀取并檢查狀態寄存器(通常通過發送0x05H指令讀取),確保NOR Flash已經完成之前的任何操作,并且處于空閑狀態。只有在空閑狀態下,才能進行下一步的擦除操作。
3.發送擦除扇區命令
向SPI總線的MOSI線上發送0x20H(扇區擦除命令),通知NOR Flash即將進行扇區擦除操作。
4.發送地址
根據要擦除的扇區地址,將24位地址按照小端模式(LSB優先)分三次發送到SPI總線的MOSI線上。地址應對齊到扇區邊界,即扇區的起始地址。
5.等待空閑
在發送完擦除命令和地址后,需要再次等待NOR Flash完成擦除操作并回到空閑狀態。通常通過輪詢讀取狀態寄存器來判斷是否完成,狀態寄存器中的相應位變為適當狀態時,表示擦除操作完成。
需要注意的是,整個擦除操作期間需要確保時鐘信號SCK的正確同步,并且在擦除操作結束后,最好發送寫禁止命令(0x04H)以避免意外的寫操作。此外,在實際應用中,請參照NM25Q128的具體數據手冊,遵循正確的時序和操作規范。
NM25Q128寫操作步驟(此處假設目標區域已經經過擦除):
1.擦除扇區(20H)
在寫入數據前,需要確保目標地址所在的扇區已經被擦除。如果目標地址的數據尚未擦除,可參照之前提供的擦除扇區步驟進行操作。
2.發送寫使能命令
向SPI總線的MOSI(數據輸入)線上發送0x06H(寫使能命令),使NOR Flash進入可寫狀態。
3.發送頁寫命令
向SPI總線的MOSI線上發送0x02H(頁寫命令),通知NOR Flash即將進行頁寫操作。
4.發送地址
根據要寫入數據的目標地址,將24位地址按照小端模式(LSB優先)分三次發送到SPI總線的MOSI線上。
5.發送數據
在發送完地址后,立即通過SPI總線的MOSI線將最多256字節的數據寫入到NOR Flash中。注意數據應按照字節順序逐個發送,且必須連續寫入整個一頁。
6.等待空閑
在發送完所有數據后,需要等待NOR Flash完成寫入操作并返回到空閑狀態。可以通過輪詢讀取狀態寄存器來判斷寫入是否完成,當狀態寄存器中的相應位變為適當狀態時,表示寫入操作完成。
在實際應用中,一定要確保寫入數據前目標區域已被擦除,并且在寫入操作結束后,推薦發送寫禁止命令(0x04H)以避免不必要的寫操作。同時,嚴格遵守NM25Q128的數據手冊中規定的時序要求。
六、NOR FLASH基本驅動步驟
NOR FLASH基于SPI接口的基本驅動步驟可以概括為以下幾點:
1.SPI工作參數配置初始化
使用HAL_SPI_Init()函數對SPI外設進行初始化,設置工作模式(CPOL和CPHA)、時鐘速度、數據幀格式(8位、16位等)、NSS管理方式等參數。
2.使能SPI時鐘和初始化相關引腳
首先,通過__HAL_RCC_SPIx_CLK_ENABLE()函數啟用SPI外設的時鐘。
其次,對于STM32等微控制器,需要配置SPI接口相關的GPIO引腳為復用推挽輸出模式或其他合適的模式,這部分操作通常不在HAL_SPI_MspInit()函數內完成,而是在初始化SPI之前手動配置GPIO的AF(Alternate Function)寄存器。
// 示例代碼(偽代碼)
GPIO_InitStruct.Pin = GPIO_PIN_...; // 設置SPI對應引腳
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // 設置為復用推挽輸出模式
GPIO_InitStruct.Pull = GPIO_NOPULL; // 如果不需要上下拉電阻,設置為無上拉下拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // 設置GPIO速度
GPIO_InitStruct.Alternate = GPIO_AF_SPIx; // 設置對應SPI外設的復用功能
HAL_GPIO_Init(GPIOx, &GPIO_InitStruct); // 初始化GPIO引腳
3.使能SPI
使用__HAL_SPI_ENABLE(&hspi)函數使能SPI外設,這里的hspi是指向SPI_HandleTypeDef結構體的指針。
4.SPI傳輸數據
發送數據:使用HAL_SPI_Transmit(&hspi, tx_buffer, size, timeout)函數發送數據,tx_buffer是發送緩沖區,size是發送數據的長度,timeout是超時時間。
接收數據:使用HAL_SPI_Receive(&hspi, rx_buffer, size, timeout)函數接收數據,rx_buffer是接收緩沖區。
同時發送和接收:使用HAL_SPI_TransmitReceive(&hspi, tx_buffer, rx_buffer, size, timeout)函數執行全雙工傳輸。
5.設置SPI傳輸速度
根據系統要求,操作SPI_CR1寄存器(或相關的時鐘配置寄存器)中的波特率控制位來設置SPI通信的時鐘頻率。在HAL庫中,通常在HAL_SPI_Init()函數里通過配置SPI_InitTypeDef結構體中的BaudRatePrescaler字段來間接設置SPI時鐘速度。
NM25Q128 NOR Flash的驅動步驟可以歸納為以下詳細步驟:
1.初始化片選引腳與SPI接口
配置NM25Q128對應的片選引腳為GPIO輸出模式,并將其設置為高電平(通常意味著SPI處于非選通狀態)。
初始化SPI接口:
配置SPI的工作模式(根據NM25Q128支持的SPI模式0或模式3)。
設置數據傳輸位數(通常是8位)。
分配SPI時鐘源并設置分頻系數以得到合適的SPI時鐘頻率。
根據需求設置數據傳輸順序(MSB或LSB優先)。
使用HAL庫函數如HAL_SPI_Init()進行初始化。
2.NM25Q128 讀取
發送讀取指令(0x03)。
發送24位地址(地址對齊到讀取粒度)。
通過SPI接口讀取數據,可以循環讀取直到需要的數據量接收完畢。
3.NM25Q128 扇區擦除
發送寫使能指令(0x06)。
確保設備處于空閑狀態,可以通過讀取狀態寄存器來判斷。
發送扇區擦除指令(0x20)。
發送24位地址(地址對齊到扇區邊界)。
等待設備完成擦除操作并返回空閑狀態。
4.NM25Q128 寫入
可選:如果目標地址所在的扇區尚未擦除,則先執行扇區擦除。
發送寫使能指令(0x06)。
發送頁寫指令(0x02)。
發送24位地址(地址對齊到頁邊界)。
發送要寫入的數據,每次最多256字節(一個頁)。
確保所有數據發送完畢,并等待設備返回空閑狀態。
NOR FLASH驅動注意事項:
**1.是否需要擦除:**在向NOR Flash寫入數據前,必須確保目標地址所在的區域已經被擦除,因為NOR Flash只能向已擦除的區域寫入數據,且是以塊(扇區/頁)為單位進行擦除操作。
2.寫入數據:
**換頁:**如果需要寫入的數據跨越了頁的邊界,必須分開多次寫入操作,每次寫入不超過一個頁的數據量。
換扇區:同樣的,如果跨越了扇區邊界,也需確保對相鄰扇區做相應的擦除操作。
**3.遵循讀、改、寫的原則:**在修改已存在的數據時,通常需要先讀取原始數據,更改需要改變的部分,然后覆蓋寫入整個塊(或頁)。這是因為在NOR Flash中不能直接修改已寫入的數據,只能通過擦除后再寫入的方式更新數據。
在實際應用中,應根據NM25Q128的數據手冊和所使用的HAL庫函數來精確實施上述步驟。