目錄
前言
一、SPI通信協(xié)議
1.概述?
2.硬件電路
?3.移位示意圖
二、SPI時序
1.時序基本單元
2.完整時序波形
三、W25Q64存儲芯片
1.芯片簡介
?2.硬件電路&引腳定義
?3.芯片框圖
4.Flash操作注意事項
四、軟件SPI讀寫W25Q64
五、SPI通信外設(shè)
總結(jié)
前言
聲明:學(xué)習(xí)筆記來自江科大自化協(xié)B站教程,僅供學(xué)習(xí)交流??!
對于SPI通信的學(xué)習(xí)和I2C一樣,分為軟件模擬實現(xiàn)和硬件配置實現(xiàn)讀寫W25Q64 Flash存儲器!
SPI傳輸數(shù)據(jù)的速度更快,協(xié)議沒有嚴格規(guī)定最大傳輸速度,取決于芯片廠商需求;SPI的設(shè)計比較簡單粗暴,實現(xiàn)的功能沒有I2C多,比較簡單;SPI硬件開銷比較大,通信線的個數(shù)較多,且通信過程經(jīng)常有資源浪費的現(xiàn)象——“富家子弟,有錢任性”,只在乎任務(wù)快速完成!
一、SPI通信協(xié)議
1.概述
①SPI(Serial Peripheral Interface串行外設(shè)接口)是由Motorola公司開發(fā)的一種通用數(shù)據(jù)總線。
②四根通信線:SCK(Serial Clock)、MOSI(Master Output Slave Input)、MISO(Master Input Slave Output)、SS(Slave Select)。同步、全雙工
③支持掛載多設(shè)備(一主多從)。有幾個從機就有幾個SS線,指定從機十分方便,給對應(yīng)線觸發(fā)電平就行。從機上引腳常寫DO或DI,分別接主機的MISO和MOSI。
2.硬件電路
①所有SPI設(shè)備的SCK、MOSI、MISO分別連在一起;
②主機另外引出多條SS控制線,分別接到各從機的SS引腳。同一時刻只可選擇一個從機。
③輸出引腳配置為推挽輸出,輸入引腳配置為浮空或上拉輸入。推挽輸出高低電平均有很強的驅(qū)動能力,這將使得SPI引腳信號的下降沿非常迅速,上升沿也非常迅速(不像I2C那樣,下降沿迅速,上升沿緩慢),信號變化快,可達到更高傳輸速度(MHz級別)。I2C并不是不想使用這個推挽輸出,而是因為I2C要實現(xiàn)半雙工,經(jīng)常要切換輸入輸出,而且要實現(xiàn)多主機的時鐘同步和總線仲裁,這些功能都不允許I2C使用推挽輸出,要不然一不小心就會電源短路,他選擇了更多的功能自然就要放棄更強的性能。SPI也有個沖突點,如圖的MISO引腳,主機一個輸入接了從機三個輸出,如果三個從機都是始終時推挽輸出,勢必造成沖突,所以在SPI協(xié)議里有條規(guī)定:當(dāng)從機的SS引腳為高電平(未被選中時),這個從機的MISO引腳必須切換為高阻態(tài)(相當(dāng)于引腳斷開,不輸出任何電平),在從機SS為低電平時,MISO引腳才允許為推挽輸出。
?3.移位示意圖
移位示意圖是SPI硬件電路設(shè)計的核心
?主機和從機的移位寄存器都有一個時鐘輸入端(SCK箭頭),SPI一般都是高位先行,所以每來一個時鐘移位寄存器都會向左進行移位,主和從同理。移位寄存器的時鐘源是由主機提供,這里叫作波特率發(fā)生器,它產(chǎn)生的時鐘驅(qū)動主機的移位寄存器進行移位,同時也通過SCK引腳輸出到從機的移位寄存器。
電路工作流程:首先規(guī)定時鐘的上升沿,所有移位寄存器向左移動一位,移出去的位放到引腳上(通信線上,實際是輸出數(shù)據(jù)寄存器);時鐘的下降沿,引腳上的位采樣輸入到移位寄存器的最低位。假設(shè)主機有個數(shù)據(jù)10101010要發(fā)送到從機,同時從機有個數(shù)據(jù)01010101要發(fā)送到主機...“轉(zhuǎn)圈圈”如圖,八個時鐘后就會實現(xiàn)。SPI收發(fā)都是基于字節(jié)交換,當(dāng)主機同時需要發(fā)送一個字節(jié),且同時要接收一個字節(jié)時,就可執(zhí)行下字節(jié)交換的時序。如果只想發(fā)送不想接收?仍然采用交換字節(jié)的時序,發(fā)送與接收同時進行,只不過接收的數(shù)據(jù)(一般統(tǒng)一發(fā)0x00或0xFF)不看就行。
二、SPI時序
1.時序基本單元
①起始條件:SS從高電平切換為低電平。SS是從機選擇線,低電平有效,一旦選擇了從機通信就開始了。
②終止條件:SS從低電平切換為高電平。
? ? ? ? ? ? ??
③交換一個字節(jié)
(模式0)
CPOL=0:空閑狀態(tài)時,SCK為低電平
CPHA=0:SCK第一個邊沿移入數(shù)據(jù)(奇數(shù)邊沿進行數(shù)據(jù)采樣),第二個邊沿移出數(shù)據(jù)。但數(shù)據(jù)總要先移出再移入,所以在SCK第一個邊沿之前,就要提前開始移動出數(shù)據(jù)了,如圖幾乎與SS下降沿開始信號同步,再SCK第一個上升沿之前。我們實操時按模式0!
(模式1)
CPOL=0:空閑狀態(tài)時,SCK為低電平
CPHA=0:SCK第一個邊沿移出數(shù)據(jù),第二個邊沿移入數(shù)據(jù)(偶數(shù)邊沿進行數(shù)據(jù)采樣)。先移出數(shù)據(jù),再移入數(shù)據(jù),比較符合常理,實際應(yīng)用中模式1和模式0應(yīng)用最多!
(模式2)
CPOL=1:空閑狀態(tài)時,SCK為高電平
CPHA=0:SCK第一個邊沿移入數(shù)據(jù)(奇數(shù)邊沿進行數(shù)據(jù)采樣),第二個邊沿移出數(shù)據(jù)。
(模式3)
CPOL=1:空閑狀態(tài)時,SCK為高電平
CPHA=0:SCK第一個邊沿移出數(shù)據(jù),第二個邊沿移入數(shù)據(jù)(偶數(shù)邊沿進行數(shù)據(jù)采樣)。
模式0與模式2對比:CPOL相反,空閑狀態(tài)電平不同,即SCK極性取反;剩下流程一致。
模式1與模式3對比:與上相同。
注意:CPHA表示時鐘相位,決定的是第一個時鐘采樣移入還是第二個時鐘采樣移入,并不是規(guī)定上升沿采樣還是下降沿采樣。
2.完整時序波形
當(dāng)然每個芯片對SPI時序字節(jié)流功能的定義不同,這里以實操芯片W25Q64的時序為例進行講解。SPI對字節(jié)流功能的規(guī)定不像I2C那樣,I2C的規(guī)定一般是有效數(shù)據(jù)流第一個字節(jié)是寄存器地址,之后依次是讀寫的數(shù)據(jù),使用的讀寫寄存器模型;
而在SPI中,通常采用的是指令碼加讀寫數(shù)據(jù)的模型,過程就是SPI起始后,第一個交換發(fā)送給從機的數(shù)據(jù),一般叫作指令碼,在從機中對應(yīng)會定義一個指令集,當(dāng)我們需要發(fā)送什么指令時,就可以在起始后第一個字節(jié)發(fā)送指令集里面的數(shù)據(jù),這樣就能指導(dǎo)從機完成相應(yīng)功能了,不同的指令可以有不同的指令個數(shù),有的指令只需要一個指令碼就可以完成,比如W25Q64的寫使能、寫失能等指令,而有的指令后面就需要再跟上要讀寫的數(shù)據(jù),比如W25Q64的寫數(shù)據(jù)、讀數(shù)據(jù)等,寫數(shù)據(jù)指令后面就要跟上在哪里寫、要寫什么,讀數(shù)據(jù)同樣。
下述圖片可能不清,詳見江科大教程!
發(fā)送指令:向SS指定設(shè)備,發(fā)送指令(0x06)
?指定地址寫:向SS指定的設(shè)備,發(fā)送寫指令(0x02),隨后在指定地址(Address[23:0])下,寫入指定數(shù)據(jù)(Data)
指定地址讀:向SS指定的設(shè)備,發(fā)送讀指令(0x03),隨后在指定地址(Address[23:0])下,讀取從機數(shù)據(jù)(Data)
?除了以上這些,還有其他時序,不過大同小異:都是起始、交換、交換、交換...、停止,只需要關(guān)注下每個字節(jié)的功能定義,就能很方便地利用SPI控制設(shè)備了。?
三、W25Q64存儲芯片
1.芯片簡介
①W25Qxx系列是一種低成本、小型化、使用簡單的非易失性存儲器(掉電不丟失),常應(yīng)用于數(shù)據(jù)存儲、字庫存儲、固件程序存儲等場景。存儲器分為易失性存儲器和非易失性存儲器,前者包括SRAM、DRAM等,后者包括E2PROM、Flash等。
②存儲介質(zhì):Nor Flash(閃存)。像STM32的程序存儲器、U盤、電腦里的固態(tài)硬盤等都是Flash閃存,閃存分為Nor Flash和Nand Flash。
③時鐘頻率:80MHz、160MHz(Dual SPI雙重SPI模式等效頻率)、320MHz(Quad SPI四重)。雙重和四重SPI了解下,本節(jié)未用!就是一個時鐘發(fā)送或接收2位/4位,有點并行的意思!
④存儲容量(24位地址):
- W25Q40:? ? 4Mbit/512KByte(bit除以8換算為Byte)
- W25Q80:? ? 8Mbit/1MByte
- W25Q16:? ? 16Mbit/2MByte
- W25Q32:? ? 32Mbit/4MByte
- W25Q64:? ? 64Mbit/8MByte
- W25Q128:? ? 128Mbit/16MByte
- W25Q256:? ? 256Mbit/32MByte
?2.硬件電路&引腳定義
“/”和“—”的意思一樣,低電平有效!
WP(Write Protect)寫保護,低電平有效。配合內(nèi)部的寄存器配置,可以實現(xiàn)硬件的寫保護,低電平時保護住不讓寫。
HOLD數(shù)據(jù)保持,低電平有效,用的不多。如果在進行正常讀寫時,突然產(chǎn)生中斷,然后想用SPI通信線去操控其他器件,這時如果把CS置回高電平,那時序就終止了,但又想在不終止總線時操作其他器件,這就可以HOLD引腳置低電平,這樣芯片就HOLD住了——芯片釋放總線,但是芯片時序也不會終止,它會記住當(dāng)前的狀態(tài),當(dāng)操作完其他器件時,可以再把HOLD置回高電平,然后繼續(xù)HOLD之前的時序。
引腳圖中括號里的IO0~IO3與上邊說的雙重和四重SPI有關(guān),這里先不管!
電路原理圖C1是電源濾波,R1和D1是一個電源指示燈,HOLD和WP都是低電平有效接到VC!
?3.芯片框圖
Flash空間劃分:
?一般一塊存儲空間可以先劃分為若干的塊block,其中每一塊再劃分為若干的扇區(qū)Sector,每個扇區(qū)內(nèi)部又可分成很多頁Page。
上圖右側(cè)大矩形空間里是所有存儲器,存儲器以字節(jié)為單位,每個字節(jié)都有唯一的地址,W25Q64的地址寬度是24位(3個字節(jié)),最大尋址范圍是16MB,大矩形地址范圍是000000h~7FFFFFh(8MB),地址空間只用了一半。以64KB為一個基本單元分成了128個Block,注意觀察每一個Block里的地址規(guī)律xx0000~xxFFFFh。
左上角矩形就是還要再對每一塊進行更細的劃分,分為多個扇區(qū)Sector,如圖虛線指向了各個Block,意思是每一塊里面都是這個樣子。在一個Block里再以4KB為一個單元切分成16個Sector,每一個Sector里地址變化規(guī)律xxx000~xxxFFFh。
Sector里繼續(xù)分成若干Page,一個Page大小為256個字節(jié),即一個Sector可分為16個Page,每一個Page里地址變化規(guī)律xxxx00~xxxxFFh。即頁(Page)內(nèi)的地址變化僅限于最低一個字節(jié)!
控制邏輯&狀態(tài)寄存器:
左下角是SPI控制邏輯,即芯片內(nèi)部進行地址鎖存、數(shù)據(jù)讀寫等操作都可由其自動完成,就像整個芯片的管理員,需要操作什么告訴它就行了,它會自動操作內(nèi)部電路完成功能!左側(cè)為通信引腳。
控制上面有個狀態(tài)寄存器(Status Register),芯片是否處于忙狀態(tài)、是否寫使能、是否寫保護都可在此體現(xiàn)!
頁緩存區(qū):
256字節(jié)頁緩存區(qū)(256-Byte Page Buffer),其實是一個256字節(jié)的RAM存儲器,........。數(shù)據(jù)讀寫就是通過這個RAM緩存區(qū)進行的,寫入數(shù)據(jù)會先放在RAM緩存區(qū)里,然后時序結(jié)束后芯片再將緩存區(qū)的數(shù)據(jù)復(fù)制到對應(yīng)的Flash里,進行永久保存!為什么要這樣?因為SPI寫入的頻率是非常高的,而Flash的寫入由于需要掉電不丟失(留下刻骨銘心的變化)速度比較慢,而緩存區(qū)RAM速度非常快。但是因為緩存區(qū)只有256個字節(jié),所以寫入的一個時序,連續(xù)寫入的數(shù)據(jù)量不能超過256字節(jié)。由于數(shù)據(jù)從緩存區(qū)轉(zhuǎn)移到Flah存儲器里需要一定時間,所以在寫入時序結(jié)束后,芯片會進入一段忙的狀態(tài),如圖有條線通往狀態(tài)寄存器(Status Register),給其BUSY位置1,這時芯片不會響應(yīng)新的讀寫時序。
其他:
寫控制邏輯(Write Control Logic),和WP引腳相連,配合其完成硬件寫保護。高壓生成器(High Voltage Generators)是配合Flash進行編程的,要想實現(xiàn)Flash掉電不丟失就要在存儲器里產(chǎn)生”刻骨銘心“的變化,一般需要高電壓刺激。頁地址鎖存/計數(shù)器(Page Address Latch/Counter)和字節(jié)地址鎖存/計數(shù)器(Byte?Address Latch/Counter),這兩個是用來指定地址的:STM32通過SPI總共發(fā)過來3個字節(jié)的地址,因為1個Page是256字節(jié),所以一頁內(nèi)的字節(jié)地址取決于最低一個字節(jié)。發(fā)過來的高位2個字節(jié)(前2個)對應(yīng)的就是頁地址,它們會進入Page Address Latch/Counter,最后一個字節(jié)進入Byte?Address Latch/Counter。
然后頁地址通過寫保護和行解碼來選擇我們要操作哪一頁,字節(jié)地址通過列解碼和256字節(jié)緩存來進行指定地址的讀寫操作。此地址指針在讀寫之后可以自動+1,這樣就很容易實現(xiàn)從指定地址開始,連續(xù)讀寫多個字節(jié)的目的了。
4.Flash操作注意事項
為了保持Flash掉電不丟失、存儲容量大、成本足夠低的特性,它會在操作的便捷性等方面做出一些妥協(xié)和讓步,所以有很多注意事項。RAM則不同,指哪寫哪,想寫多少就多少,且可覆蓋寫入,后續(xù)來的數(shù)據(jù)可直接覆蓋原來的數(shù)據(jù)。
①寫入操作時:
- 寫入操作前必須先進行寫使能
- 每個數(shù)據(jù)位只能由1改寫為0,不能由0改寫為1
- 寫入數(shù)據(jù)前必須先擦除,擦除后所有數(shù)據(jù)位變?yōu)?。發(fā)出擦除指令后,芯片也會進入忙狀態(tài)。
- 擦除必須按最小擦除單元進行??蛇x擇整片芯片擦除、塊擦除、扇區(qū)擦除,沒有再小了。
- 連續(xù)寫入多個字節(jié)時,最多寫入一頁的數(shù)據(jù),超過頁尾位置的數(shù)據(jù)會回到頁首覆蓋寫入。在進行多字節(jié)寫入時,地址范圍不可跨越頁的邊沿,否則會地址錯亂。
- 寫入操作結(jié)束后,芯片會進入忙狀態(tài),不響應(yīng)新的讀寫操作
?②讀取操作時:
- 直接調(diào)用讀取時序,無需使能(1),無需額外操作(234),沒有頁的限制(5),讀取操作結(jié)束后不會進入忙狀態(tài),但不能在忙狀態(tài)下讀取。
續(xù)下篇(實操):
四、軟件SPI讀寫W25Q64
五、SPI通信外設(shè)
六、硬件SPI讀寫W25Q64
往期精彩:
STM32定時器輸入捕獲(IC)
STM32定時器輸出比較(PWM波)
STM32定時中斷
STM32外部中斷
STM32GPIO精講
…文章來源:http://www.zghlxwxcb.cn/news/detail-698069.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-698069.html
到了這里,關(guān)于【STM32學(xué)習(xí)】——SPI通信協(xié)議&SPI時序&W25Q64存儲芯片&軟件SPI讀寫的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!