鄧國(guó)榮
(暨南大學(xué)信息技術(shù)研究所,廣東 廣州 510075)
M25P80FLASH可以按頁(yè)、扇區(qū)和整片擦除,并提供按頁(yè)寫(xiě)數(shù)據(jù)功能,能夠方便地保存數(shù)據(jù)。STM32有獨(dú)立的SPI控制器,該控制器可以直接控制SPI FLASH的讀寫(xiě)操作,自動(dòng)生成讀寫(xiě)SPI FLASH控制時(shí)序。因此,本文采用STM32的SPI接口控制M25P80FLASH讀寫(xiě),分析了M25P80FLASH的讀寫(xiě)時(shí)序和SPI接口的初始化,最終實(shí)現(xiàn)了M25P80FLASH的讀寫(xiě),仿真結(jié)果顯示,該方案正確、可行。
STM32 SPI接口結(jié)構(gòu)框圖如圖1所示。STM32 SPI接口內(nèi)部有一個(gè)移位寄存器,當(dāng)數(shù)據(jù)從MOSI管腳輸入時(shí),數(shù)據(jù)首先通過(guò)移位寄存器移位輸入,然后保存在接收緩沖區(qū)中,由地址和數(shù)據(jù)總線讀出,當(dāng)數(shù)據(jù)寫(xiě)出時(shí),寫(xiě)入數(shù)據(jù)首先被寫(xiě)入發(fā)送緩沖區(qū),然后由移位寄存器從MISO管腳移出。SPI接口輸入和輸出控制時(shí)序由波特率發(fā)生器產(chǎn)生,然后從SCK管腳輸出,在數(shù)據(jù)讀寫(xiě)過(guò)程中同步產(chǎn)生。
圖1 STM32 SPI接口結(jié)構(gòu)圖
STM 32 SPI接口與M25P80SPI FLASH硬件連接如圖2所示。MOSI對(duì)應(yīng)連接M25P80的數(shù)據(jù)輸出口Q,MOSO對(duì)應(yīng)M25P80的數(shù)據(jù)輸入口D,時(shí)鐘管腳SCK提供M25P80的時(shí)鐘控制管腳C,CS 對(duì)應(yīng) M25P80片選控制管腳 S[1]。
圖2 STM32與M25P80之間的硬件連接
STM32 SPI接口初始化流程圖如圖3所示。首先,在SPI開(kāi)始配置之前,必須先配置SPI接口控制的RCC時(shí)鐘,然后配置MOSI、MOSO和SCK管腳為復(fù)用管腳,并進(jìn)一步配置管腳工作方式為推挽上拉方式,管腳最大輸出工作時(shí)鐘為50M,配置SPI管腳為雙線雙向數(shù)據(jù)傳輸方式,NSS管腳為軟件控制模式,并配置SPI控制方式為主模式,數(shù)據(jù)寬度為8 bit,數(shù)據(jù)采樣時(shí)鐘極性通過(guò)CPOL和CPHA控制,設(shè)置時(shí)鐘分頻系數(shù)和CRC校驗(yàn)方式,最后,設(shè)置數(shù)據(jù)傳輸起始位,即先傳輸數(shù)據(jù)高位還是低位。
M25P80的片選控制管腳S,可以直接用STM32的普通IO控制,需要配置為輸出模式,推免上拉,最大輸出與SPI接口管腳一致,都為50M。
圖3 SPI接口初始化配置流程
M25P80控制讀寫(xiě)的第一步就是讀取ID號(hào),只有ID正常讀取才能說(shuō)明M25P80時(shí)序控制配置正常。讀M25P80控制指令為0x30,讀M25P80的ID控制指令為0x9F,緊跟控制指令READ之后的是24位讀取數(shù)據(jù)地址,然后就可以直接讀取數(shù)據(jù)了。STM32F2xx固件庫(kù)中提供了向SPI FLASH發(fā)送和接收數(shù)據(jù) API函數(shù) SPI_I2S_SendData()和 SPI_I2S_ReceiveData(),在每次數(shù)據(jù)發(fā)送時(shí),都要檢測(cè)SPI控制接口的工作狀態(tài),可以通過(guò)API函數(shù)SPI_I2S_GetFlagStatus()檢測(cè)SPI接口控制狀態(tài)。在控制指令和讀取數(shù)據(jù)地址發(fā)送之后完成,讀取數(shù)據(jù)時(shí),需向FLASH發(fā)送空指令0xA5才能啟動(dòng)數(shù)據(jù)讀取時(shí)序。
在每次向FLAHS發(fā)送數(shù)據(jù)之前,必須先將片選管腳拉低,在每次數(shù)據(jù)讀取完成之后,必須拉高。
M25P80FLASH在寫(xiě)數(shù)據(jù)之前,必須首先擦除。首先,發(fā)送擦除控制指令,有3種擦除FLASH方式,頁(yè)擦除、扇區(qū)擦除和整片擦除,可以根據(jù)需要選擇擦除方式,頁(yè)擦除每次擦除一頁(yè)空間大小,為256 Byte空間,扇區(qū)擦除空間大小為1個(gè)扇區(qū)為64K,整片擦除就是將整個(gè)空間數(shù)據(jù)都擦除。按頁(yè)擦除需要的時(shí)間是最短的,適用于對(duì)于擦除時(shí)間要求比較短的情況下,扇區(qū)擦除和整片擦除都需要比較長(zhǎng)的時(shí)間,而且擦除區(qū)域大,需要擦除的數(shù)據(jù)區(qū)域也大,不適宜實(shí)時(shí)擦除數(shù)據(jù)更新情況,適用于一次性寫(xiě)入大片數(shù)據(jù)情況。
M25P80寫(xiě)數(shù)據(jù)之前,首先需要擦除需要寫(xiě)入空間數(shù)據(jù),然后才能寫(xiě)入數(shù)據(jù),每次寫(xiě)數(shù)據(jù)之前還需要寫(xiě)使能,即設(shè)置狀態(tài)寄存器的WEL位為高電平同時(shí),需要檢查狀態(tài)寄存器的SRWD寫(xiě)保護(hù)位,高電平為寫(xiě)保護(hù)失效,低電平為寫(xiě)保護(hù)使能,在每次數(shù)據(jù)寫(xiě)入時(shí),必須SRWD為高電平,即寫(xiě)保護(hù)失效才能寫(xiě)入數(shù)據(jù)。M25P80按頁(yè)寫(xiě)入數(shù)據(jù)時(shí)序圖如圖4所示,按頁(yè)寫(xiě)數(shù)據(jù)一次可以寫(xiě)入256 Byte,M25P80只提供按頁(yè)寫(xiě)數(shù)據(jù)命令,只能一次寫(xiě)入一頁(yè)數(shù)據(jù)。
圖4 M25P80按頁(yè)寫(xiě)入數(shù)據(jù)時(shí)序圖
由于M25P80只能一次寫(xiě)入一頁(yè)數(shù)據(jù),只能一次寫(xiě)入256 Byte數(shù)據(jù),而且M25P80的地址空間是按頁(yè)分配的,每次不能跨頁(yè)寫(xiě)數(shù)據(jù),一次只能在一頁(yè)中寫(xiě)數(shù)據(jù),所以,當(dāng)寫(xiě)入數(shù)據(jù)超出一頁(yè)時(shí),就需要多次寫(xiě)入數(shù)據(jù)。M25P80多頁(yè)寫(xiě)數(shù)據(jù)處理流程圖如圖5所示。首先,寫(xiě)入數(shù)據(jù)之前,需要先擦寫(xiě)寫(xiě)入地址空間數(shù)據(jù),然后判斷寫(xiě)入起始地址是否是頁(yè)初始地址,如果是頁(yè)初始地址,再判斷寫(xiě)入數(shù)據(jù)長(zhǎng)度是否超出一頁(yè)大小,如果是,數(shù)據(jù)計(jì)算需要寫(xiě)入的頁(yè)數(shù)N,把數(shù)據(jù)寫(xiě)入N頁(yè)地址空間中,并將最后剩余字節(jié)寫(xiě)入第N頁(yè)的下一頁(yè)中,如果寫(xiě)入數(shù)據(jù)長(zhǎng)度小于一頁(yè),只需要直接將數(shù)據(jù)寫(xiě)入指定頁(yè)中即可。如果寫(xiě)入地址不是頁(yè)初始地址,首先需要判斷數(shù)據(jù)是否超出一頁(yè),如果沒(méi)有超出一頁(yè)大小,還需要判斷寫(xiě)入數(shù)據(jù)長(zhǎng)度是否大于寫(xiě)入數(shù)據(jù)起始地址到頁(yè)尾的剩余字節(jié)數(shù),如果是,則寫(xiě)滿寫(xiě)入頁(yè)地址空間,并將剩余字節(jié)寫(xiě)入下一頁(yè)中,如果寫(xiě)入數(shù)據(jù)小于寫(xiě)入數(shù)據(jù)起始地址到頁(yè)尾的剩余字節(jié)數(shù),則直接將數(shù)據(jù)寫(xiě)入指定頁(yè)中即可;如果寫(xiě)入數(shù)據(jù)超出一頁(yè)大小,首先填滿起始頁(yè)地址空間,然后計(jì)算剩余數(shù)據(jù)需要寫(xiě)入頁(yè)數(shù)N,將剩余數(shù)據(jù)寫(xiě)入N頁(yè)地址空間中,最后,將剩余字節(jié)寫(xiě)入第N頁(yè)的下一頁(yè)中即可[2-3]。
圖5 SPI FLASH多頁(yè)寫(xiě)數(shù)據(jù)處理流程圖
STM32的SPI接口控制M25P80仿真結(jié)果圖如圖6所示。首先,STM32控制頁(yè)擦除M25P80的地址空間0x00對(duì)應(yīng)的頁(yè),然后向FLASH中寫(xiě)入SPI_SendData[]中的數(shù)據(jù),寫(xiě)完之后,再讀取FLASH對(duì)應(yīng)地址中的數(shù)據(jù),將結(jié)果存放到SPI_RecData[]中,仿真結(jié)果顯示,寫(xiě)入數(shù)據(jù)和讀出數(shù)據(jù)一致,說(shuō)明FLASH已經(jīng)正常讀寫(xiě)了。
圖6 SPI FLASH數(shù)據(jù)讀寫(xiě)仿真圖
本文分析了M25P80FLASH的讀寫(xiě)控制時(shí)序,并針對(duì)M25P80的多頁(yè)寫(xiě)數(shù)據(jù)功能進(jìn)行了詳細(xì)的分析和介紹,并使用STM32的SPI控制接口實(shí)現(xiàn)了對(duì)M25P80FLASH的讀寫(xiě)控制。仿真結(jié)果顯示,STM32的 SPI控制接口可以實(shí)現(xiàn)對(duì)M25P80FLASH的讀寫(xiě)控制。
[1]關(guān)珊珊,周潔敏.基于Xilinx FPGA的SPI Flash控制器設(shè)計(jì)與驗(yàn)證[J].電子器件,2012,2(35):216~220
[2]張立為,鐘慧敏.實(shí)現(xiàn)基于FPGA的SPI Flash控制器設(shè)計(jì)[J].微計(jì)算機(jī)信息,2010,6(26):124~126
[3]唐琳,方方,張保靜,等.基于ARM的多通道SPI Flash控制器設(shè)計(jì)[J].核電子學(xué)與探測(cè)技術(shù),2012,5(32):583~586