做學(xué)校網(wǎng)站導(dǎo)航條應(yīng)該有哪些知乎關(guān)鍵詞排名優(yōu)化工具
SPI 是英語 Serial Peripheral interface 的縮寫,顧名思義就是串行外圍設(shè)備接口,一種高速的,全雙工,同步的通信總線,并且在芯片的管腳上只占用四根線,節(jié)約了芯片的管腳,為?PCB?的布局上節(jié)省空間,提供方便,主要應(yīng)用在 EEPROM,Flash,RTC,AD轉(zhuǎn)換,傳感器等設(shè)備上。
SPI 的四根信號(hào)線:
CS
片選信號(hào)線,每個(gè)設(shè)備都占用一個(gè)片選信號(hào)線,當(dāng) CS 信號(hào)線顯低電平時(shí),表示該設(shè)備被選中,則 SCK,MOSI 和 MISO 信號(hào)有效。每個(gè)設(shè)備都擁有屬于自己的 CS 信號(hào)線,主機(jī)選中設(shè)備時(shí),會(huì)拉低指定設(shè)備的 CS 線電平。使用 CS 信號(hào)線,可以使多個(gè)設(shè)備共同使用同一份 SCK,MOSI 和 MISO 信號(hào)線,減少引腳數(shù)量,也可以告訴設(shè)備本次訪問已結(jié)束,方便下次重新發(fā)起訪問請求。
SCK
時(shí)鐘信號(hào)線,為 SPI 通信過程中提供時(shí)鐘信號(hào),當(dāng) SCK 每次產(chǎn)生上升沿或下降沿時(shí),MOSI 和 MISO 傳輸一比特?cái)?shù)據(jù)。
MOSI
主機(jī)發(fā)送,從機(jī)接收信號(hào)線,主機(jī)通過該信號(hào)線發(fā)送數(shù)據(jù),從機(jī)從該信號(hào)線接收到數(shù)據(jù)。
MISO
主機(jī)接收,從機(jī)發(fā)送信號(hào)線,與 MOSI 相反,這里主機(jī)要接收數(shù)據(jù),從機(jī)要發(fā)送數(shù)據(jù)。兩根串行數(shù)據(jù)信號(hào)線保證了主從機(jī)之間可以全雙工通信。
SPI 可以實(shí)現(xiàn)全雙工通信,但與 SPI Flash 通信的時(shí)候反而不需要進(jìn)行全雙工通信:在 Host 不把指令和地址發(fā)送完之前,SPI Flash 不會(huì)知道 Host 要干嘛,自然不會(huì)主動(dòng)向 Host 發(fā)送數(shù)據(jù);在 SPI Flash 向 Host 發(fā)送數(shù)據(jù)的時(shí)候,Host 也沒有必要發(fā)送任何數(shù)據(jù),因此,當(dāng) Host 與 SPI Flash 通信時(shí),總是處于半雙工狀態(tài),也總有一根數(shù)據(jù)信號(hào)線處于空閑狀態(tài)。如圖 1 所示。
為了把這跟信號(hào)線充分利用起來,從而發(fā)明了 DSPI 。
當(dāng) SPI Flash 準(zhǔn)備給 Host 發(fā)送數(shù)據(jù)的時(shí)候,如果把 MOSI 也作為 SPI Flash 給 Host 發(fā)送數(shù)據(jù)的數(shù)據(jù)信號(hào)線使用,則每個(gè) SCK 時(shí)鐘可以發(fā)送兩比特的數(shù)據(jù):原來的MOSI (現(xiàn)在稱之為 D0)發(fā)送第一個(gè)比特,MISO(現(xiàn)在稱之為 D1)發(fā)送第二個(gè)比特,在不增加信號(hào)線的基礎(chǔ)上,一個(gè)時(shí)鐘發(fā)送兩個(gè)比特?cái)?shù)據(jù),相當(dāng)于傳輸速率提升了一倍!這就叫做 DSPI,D 是 Dual 的意思。如圖 2 所示。
但 DSPI 的速度好像還是有些慢,如果再增加兩條數(shù)據(jù)線(D3 和 D4),讓傳輸速度提升到 DSPI 的兩倍,那么 DSPI 就變成了 QSPI,Q 是 Quad 的縮寫。
相比較于 SPI,QSPI 在數(shù)據(jù)傳輸?shù)臅r(shí)候,一個(gè) SCK 時(shí)鐘能傳輸 4 比特?cái)?shù)據(jù),兩個(gè) SCK 時(shí)鐘就能傳輸一字節(jié)的數(shù)據(jù),性能提升,讓 CPU 直接執(zhí)行存儲(chǔ)在 SPI Flash 的程序變成了可能。如圖 3 所示。
能否再讓數(shù)據(jù)引腳增加一倍,8 根數(shù)據(jù)線豈不是速度更快,那就了解下 FSMC 吧,直接 16 根數(shù)據(jù)信號(hào)線,速度自然變得更快了,但使用 SPI FLash,不就是圖一個(gè)線少嘛。
為了方便描述,我們將使用 QSPI 接口連接的 SPI Flash 稱之為 QSPI Flash。一般來說,在與 QSPI Flash 通信時(shí),并不是全程都是四根數(shù)據(jù)信號(hào)線傳輸數(shù)據(jù),當(dāng)同一時(shí)間只有一根數(shù)據(jù)線在傳輸數(shù)據(jù)的模式可稱為單線模式,兩根數(shù)據(jù)線可稱為雙線模式,四根數(shù)據(jù)線可稱為四線模式。
通信過程
在使用 QSPI 與 QSPI Flash 通信的過程中,可分為五個(gè)階段:
指令階段
傳輸方向?yàn)?Host 發(fā)送給 QSPI Flash,目的是告訴 QSPI Flash 接下來要做什么事情,其長度只能為 8 bit。
地址階段
傳輸方向?yàn)?Host 發(fā)送給 QSPI Flash,目的是告訴 QSPI Flash 要從哪個(gè)地址開始讀或?qū)憯?shù)據(jù),其長度可能為 8 bit,16 bit,24 bit 和 32 bit。
交替字節(jié)階段:
傳輸方向?yàn)?Host 發(fā)送給 QSPI Flash,具體用法需參考所使用的 QSPI Flash 手冊,傳輸方向由 Host 發(fā)送給 QSPI Flash,其長度可能為 8 bit,16 bit,24 bit 和 32 bit。
空指令周期階段
給 QSPI Flash 緩沖時(shí)間準(zhǔn)備數(shù)據(jù),等待 n 個(gè) SCK 周期,n 取值范圍 0 ~ 31,具體值需參考所使用 QSPI Flash 手冊。這段時(shí)間 Host 只產(chǎn)生特定數(shù)量的 SCK 時(shí)鐘,不從數(shù)據(jù)信號(hào)線中讀取或發(fā)送任何內(nèi)容。
數(shù)據(jù)階段
讀數(shù)據(jù)或?qū)憯?shù)據(jù),長度不定,由主機(jī)決定發(fā)送或接收多少數(shù)據(jù)。
????????在與 QSPI Flash 通信時(shí),其通信過程如圖 4 所示:
CS(NSS)信號(hào)線拉低,表示 QSPI Flash 器件被微控制器選中,然后發(fā)送一個(gè)字節(jié)大小的指令,緊接著發(fā)送地址,然后是交替字節(jié),空指令周期,最后是數(shù)據(jù),任意兩個(gè)階段之間都是緊挨著的。
一般來說,每次與 QSPI Flash 通信都至少包含指令階段,其余的階段都是可選的,例如讀寫 QSPI Flash 的寄存器值,只需要指令階段和數(shù)據(jù)階段;寫使能和寫失能,只需要指令階段;讀寫數(shù)據(jù),需要指令,地址,數(shù)據(jù)階段,可能還有空指令周期階段。
但有一種情況下,可能會(huì)省略掉指令階段,部分 QSPI Flash 支持僅在第一次讀數(shù)據(jù)的時(shí)候,需要指令階段,下一次讀數(shù)據(jù)的時(shí)候,直接由地址階段開始,無需指令階段。
一般 QSPI Flash 還支持一種叫做 QPI 模式的通信方式,當(dāng) QSPI Flash 進(jìn)入 QPI 模式后,所有的階段都只能使用四線模式通信,包括指令階段,通過這種方式,能夠極大減少指令階段和地址階段花費(fèi)的 SCK 時(shí)鐘數(shù)。
通信實(shí)例
圖 5 是一款型號(hào)為 FM25Q16A QSPI Flash 的 Fast Read Quad Output 的傳輸波形示意圖:
從圖中可以看到,四線快讀數(shù)據(jù)的過程中分為四個(gè)步驟:
指令階段
Host 發(fā)送了一個(gè) 8 bit 長度的指令 0x6B,使用單線模式。
地址階段
一段 24bit 長度的地址,使用單線模式。
空指令周期
8 bit 的空指令周期。
數(shù)據(jù)階段
以四線模式連續(xù)讀取存儲(chǔ)在 QSPI Flash 指定位置的數(shù)據(jù)。
可以發(fā)現(xiàn),除了數(shù)據(jù)階段,其它階段均以單線模式工作,數(shù)據(jù)階段則是四線模式,每兩個(gè)時(shí)鐘讀取一個(gè)字節(jié)的數(shù)據(jù)。當(dāng)讀取一個(gè)四字節(jié)數(shù)據(jù)時(shí),總共花費(fèi)了 48 個(gè) SCK 時(shí)鐘。
通過內(nèi)存地址訪問 QSPI Flash
前文中了解了如何通過 QSPI 接口訪問 QSPI Flash,但如果每次通信都要配置 QSPI 外設(shè)的寄存器,再通過 QSPI 的數(shù)據(jù)寄存器獲取數(shù)據(jù)的話,則無法讓微控制器直接執(zhí)行存儲(chǔ)在 QSPI Flash 中的程序(XIP)。
因此,可以將 QSPI Flash 映射到一段指定的內(nèi)存地址空間內(nèi),例如,指定到 0x90000000 ~ 0x9FFFFFFF 這段 256MB 大小的空間內(nèi),當(dāng) CPU 訪問 0x90000008 這段地址時(shí),QSPI 模塊將會(huì)讀取 QSPI Flash 中 0x00000008 的數(shù)據(jù),如果 CPU 繼續(xù)訪問 0x9000000C 的數(shù)據(jù)時(shí),QSPI 模塊將會(huì)讀取 QSPI Flash 中 0x0000000C 的數(shù)據(jù)。對 CPU 而言,訪問存儲(chǔ)在 QSPI Flash 中的數(shù)據(jù),就只是訪問某一段地址空間的數(shù)據(jù)。這種讀數(shù)據(jù)的方式稱為 QSPI 的直接讀模式,如圖 6 所示。
值得注意的是,32 位的 CPU 一般會(huì)連續(xù)讀取 4 字節(jié)的數(shù)據(jù),當(dāng) CPU 讀取 0x90000008 這段地址時(shí),實(shí)際讀取了 0x90000008 ~ 0x9000000B 四個(gè)字節(jié)的數(shù)據(jù),但 QSPI 不會(huì)每讀取一字節(jié)數(shù)據(jù),就發(fā)起一次指令階段+地址階段+數(shù)據(jù)階段的過程,而是以指令階段+地址階段+數(shù)據(jù)階段讀一字節(jié),再讀一字節(jié),再讀一字節(jié)……的方式讀數(shù)據(jù),當(dāng)后面 CPU 繼續(xù)訪問 0x0000000C 時(shí),就會(huì)跳過指令階段和地址階段,直接繼續(xù)數(shù)據(jù)階段再讀一字節(jié),再讀一字節(jié)……直到微控制器訪問了一個(gè)不連續(xù)的地址時(shí),QSPI 才會(huì)重新發(fā)起指令階段和地址階段。
因?yàn)榈刂愤B續(xù)的訪問 QSPI Flash,QSPI 無需再次發(fā)起指令和地址階段,所以其訪問速度會(huì)比地址不連續(xù)的訪問速度要快。
計(jì)算機(jī)程序有一個(gè)特點(diǎn),叫做時(shí)間局限性和空間局限性:
時(shí)間局限性
最近被訪問的單元,很可能在不久的將來還要被訪問。
空間局限性
最近被訪問的單元,很可能它附近的單元也即將被訪問。
基于上述的特點(diǎn),一般支持 QSPI 擴(kuò)展 Flash 的微控制器會(huì)使用 CACHE 來暫存 QSPI Flash 中的內(nèi)容,當(dāng) CPU 再次訪問 QSPI Flash 前一段時(shí)間曾訪問過的地址時(shí),實(shí)際上訪問的是暫存在 CACHE 中的數(shù)據(jù),以此來減少訪問 QSPI Flash 所花費(fèi)的時(shí)間,加快程序執(zhí)行的速度。在實(shí)際使用 QSPI Flash 存儲(chǔ)應(yīng)用程序的時(shí)候,效果可能不比片內(nèi) Flash 差多少。
直接讀模式能夠讀取 QSPI Flash 中的數(shù)據(jù),但 QSPI Flash 中的程序不是一直不變的,不管程序員調(diào)試代碼,還是 OTA 升級(jí),都需要讀數(shù)據(jù)之外的操作,這時(shí)候,如果還使用直接讀模式訪問 QSPI Flash 的話,就顯得不太合適了:直接模式下,我們只需要配置一次 QSPI 訪問 QSPI Flash 各階段的配置,就能不斷讀取 QSPI Flash 中的數(shù)據(jù),雖然方便,但缺少一定的自由度,例如無法實(shí)現(xiàn)寫操作等過程。
因此,QSPI 還提供了間接模式,間接模式下,需要指定每一次數(shù)據(jù)傳輸過程的每一個(gè)細(xì)節(jié):如指令階段的參數(shù)是什么,地址階段的具體地址值是多少等,雖然復(fù)雜,但給了我們充分通過 QSPI 訪問 QSPI Flash 的方法,例如,當(dāng)我們希望寫修改 QSPI Flash 中的數(shù)據(jù)時(shí),就可以使用間接寫模式,將數(shù)據(jù)階段的傳輸方向由 QSPI Flash 到 Host 轉(zhuǎn)變?yōu)?Host 到 QSPI Flash,而在直接模式下,數(shù)據(jù)階段只能是由 QSPI Flash 到 Host。
總結(jié)
在本章中,介紹了 SPI,DSPI,QSPI的區(qū)別,訪問 QSPI Flash 的過程,以及微控制器如何通過 QSPI 的直接讀模式訪問 QSPI Flash。
微控制器通過 QSPI 的直接讀模式訪問 QSPI Flash,為直接執(zhí)行存儲(chǔ)在 QSPI Flash 中的應(yīng)用程序提供了可能,這也是 2nd Bootloader 的目的所在。