QSPI協議詳解(一)


1. QSPI是什么?
SPI協議其實是包括:Standard SPI、Dual SPI和Queued SPI三種協議接口,分別對應3-wire, 4-wire, 6-wire。
(1)通常我們說的SPI就是Standard SPI,有4根信號線,分別為CLK、CS、MOSI和MISO。數據線工作在全雙工。
(2)Dual SPI,它只是針對SPI Flash而言,不是針對所有SPI外設。對於SPI Flash,全雙工並不常用,因此擴展了mosi和miso的用法,讓它們工作在半雙工,用以加倍數據傳輸。也就是對於Dual SPI Flash,可以發送一個命令字節進入dual mode,這樣mosi變成SIO0(serial io 0),mosi變成SIO1(serial io 1),這樣一個時鍾周期內就能傳輸2個bit數據,加倍了數據傳輸。
(3)類似的,還可以擴展,與也是針對SPI Flash,Qual SPI Flash增加了兩根I/O線(SIO2,SIO3),目的是一個時鍾內傳輸4個bit,而QSPI就是Queued SPI的簡寫。
2. 接口問題

上圖是某SPI FLASH的引腳接口示意圖,它即支持SPI通信,也可以使用DSPI通信或者QSPI通信,
這塊芯片一共有8個有用的管腳,其每個管腳的功能定義如下:
每個引腳的詳細描述如下:

 1、Chip Select(/CS)
片選信號Chip Select(/CS)的作用是使能或者不使能設備的操作,當CS為高時,表示設備未被選中,串行數據輸出線(DO或IO0,IO1,IO2,IO3)均處於高阻態,當CS為低時,表示設備被選中,FPGA可以給QSPI Flash發送數據或從QSPI Flash接收數據。
 2、串行數據輸入信號DI以及串行輸出信號DO
標准的SPI協議在串行時鍾信號(SCLK)的上升沿把串行輸入信號DI上的數據存入QSPI Flash中,在串行時鍾信號(SCLK)的下降沿把QSPI Flash中的數據串行化通過單向的DO引腳輸出。而在Dual SPI與Quad SPI中,DI與DO均為雙向信號(既可以作為輸入,也可以作為輸出)。
 3、Write Project(/WP)
寫保護信號的作用是防止QSPI Flash的狀態寄存器被寫入錯誤的數據,WP信號低電平有效,但是當狀態寄存器2的QE位被置1時,WP信號失去寫保護功能,它變成Quad SPI的一個雙向數據傳輸信號。
 4、HOLD(/HOLD)
HOLD信號的作用是暫停QSPI Flash的操作。當HOLD信號為低,並且CS也為低時,串行輸出信號DO將處於高阻態,串行輸入信號DI與串行時鍾信號SCLK將被QSPI Flash忽略。當HOLD拉高以后,QSPI Flash的讀寫操作能繼續進行。當多個SPI設備共享同一組SPI總線相同的信號的時候,可以通過HOLD來切換信號的流向。和WP信號一樣,當狀態寄存器2的QE位被置1時,HOLD信號失去保持功能,它也變成Quad SPI的一個雙向數據傳輸信號。
 5、串行時鍾線
串行時鍾線用來提供串行輸入輸出操作的時鍾。
3. QSPI的使用
3.1 工作模式
該接口可以在以下三種模式下工作:
① 間接模式:使用 QSPI 寄存器執行全部操作
② 狀態輪詢模式:周期性讀取外部 Flash 狀態寄存器,而且標志位置 1 時會產生中斷(如擦除或燒寫完成,會產生中斷)
③ 內存映射模式:外部 Flash 映射到微控制器地址空間,從而系統將其視作內部存儲器
采用雙閃存模式時,將同時訪問兩個 Quad-SPI Flash,吞吐量和容量均可提高二倍。
QSPI功能框圖,雙閃存模式禁止:

QSPI 使用 6 個信號連接Flash,分別是四個數據線BK1_IO0~BK1_IO3,一個時鍾輸出CLK,一個片選輸出(低電平有效)BK1_nCS,它們的作用介紹如下:
BK1_nCS:片選輸出(低電平有效),適用於 FLASH 1。如果 QSPI 始終在雙閃存模式下工作,則其也可用於 FLASH 2從設備選擇信號線。QSPI通訊以BK1_nCS線置低電平為開始信號,以BK1_nCS線被拉高作為結束信號。
CLK:時鍾輸出,適用於兩個存儲器,用於通訊數據同步。它由通訊主機產生,決定了通訊的速率,不同的設備支持的最高時鍾頻率不一樣,如STM32的QSPI時鍾頻率最大為fpclk/2,兩個設備之間通訊時,通訊速率受限於低速設備。
BK1_IO0:在雙線 / 四線模式中為雙向 IO,單線模式中為串行輸出,適用於FLASH 1。
BK1_IO1:在雙線 / 四線模式中為雙向 IO,單線模式中為串行輸入,適用於FLASH 1。
BK1_IO2:在四線模式中為雙向 IO,適用於 FLASH 1。
BK1_IO3:在四線模式中為雙向 IO,適用於 FLASH 1。
3.2 狀態
我們可以通過配置,選擇到底使用哪種方式與其進行通信傳輸。在進行四線讀寫操作(QSPI)之前一定要把寄存器中的QE(Quad Enable)位置為1,除此以外,四線讀操作還需要在讀數據之前等待8個dummy clock用來加快讀數據的速度(詳細內容請閱讀芯片手冊)。所以,四線操作相對於單線操作而言除了要增加四線模式讀寫數據的狀態以外還要增加一個寫狀態寄存器的功能用來開啟QE(Quad Enable)位以及一個dummy用來等待8個clock。
  四線模式的狀態為以下幾個:
    1、空閑狀態:用來初始化各個寄存器的值
    2、發送命令狀態:用來發送8-bit的命令碼
    3、發送地址狀態:用來發送24-bit的地址碼
    4、讀等待狀態(單線模式):當讀數據操作正在進行的時候進入此狀態等待讀數據完畢
    5、寫數據狀態(單線模式):在這個狀態FPGA往QSPI Flash里面寫數據
    6、寫狀態寄存器狀態:用來把狀態寄存器的QE(Quad Enable)置1
    7、Dummy Clock狀態:四線讀數據之前需要等待8個dummy clock
    8、寫數據狀態(四線模式):在這個狀態FPGA往QSPI Flash里面通過四線模式寫數據
    9、讀等待狀態(四線模式):在這個狀態等待FPGA從QSPI Flash里面通過四線模式讀數據完成
    10、結束狀態:一條指令操作結束,並給出一個結束標志
  其中6-9的狀態是四線模式的代碼在單線模式代碼的基礎上增加的四個狀態。
3.3 命令序列
QSPI通過命令與Flash通信,每條命令包括指令、地址、交替(復用)字節、空指令和數據共五個階段,而這五個階段任一階段均可跳過,但至少要包含指令、地址、交替字節或數據階段之一。nCS在每條指令開始前下降,在每條指令完成后再次上升。QSPI四線模式下的讀命令時序如下圖所示。

1)指令階段
這一階段,將在QSPI_CCR[7:0]寄存器的instruction字段中配置的一條8位指令發送到Flash,指定待執行操作的類型。
盡管大多數Flash從IO0/SO信號(單線SPI模式)只能以一次1位的方式接收指令,但指令階段可選擇一次發送2位(在雙線SPI模式中通過IO0/IO1)或一次發送4位(在四線SPI模式中通過IO0/IO1/IO2/IO3)。這可通過QSPI_CCR[9:8]寄存器中的IMODE[1:0]字段進行配置。若IMODE = 00,則跳過指令階段,命令序列從地址階段(如果存在)開始。
2)地址階段
在地址階段,將1-4字節發送到Flash,指示操作地址。待發送的地址字節數在QSPI_CCR[13:12]寄存器的ADSIZE[1:0]字段中進行配置。在間接模式和自動輪詢模式下,待發送的地址字節在QSPI_AR寄存器的ADDRESS[31:0]中指定;在內存映射模式下,則通過AHB(來自於內核或DMA)直接給出地址。地址階段可一次發送1位(單線SPI模式通過SO)、2位(雙線SPI模式中通過IO0/IO1)或4位(在四線SPI模式中通過IO0/IO1/IO2/IO3)。這可通過QUADSPI_CCR[11:10]寄存器中的ADMODE[1:0]字段進行配置。若ADMODE = 00,則跳過地址階段,命令序列直接進入下一階段(如果存在)。
3)交替字節階段
在交替字節階段,將1-4字節發送到Flash,一般用於控制操作模式。待發送的交替字節數在QSPI_CCR[17:16]寄存器的ABSIZE[1:0]字段中進行配置。待發送的字節在QSPI_ABR寄存器中指定。
交替字節階段可一次發送1位(在單線SPI模式中通過SO)、2位(在雙線SPI模式中通過IO0/IO1)或4位(在四線SPI模式中通過IO0/IO1/IO2/IO3)。這可通過QSPI_CCR[15:14]寄存器中的ABMODE[1:0]字段進行配置。若ABMODE = 00,則跳過交替字節階段,命令序列直接進入下一階段(如果存在)。
交替字節階段存在僅需發送單個半字節而不是一個全字節的情況,比如采用雙線模式並且僅使用兩個周期發送交替字節時。在這種情況下,固件可采用四線模式(ABMODE = 11)並發送一個字節,方法是ALTERNATE的位7和3置“1”(IO3保持高電平)且位6和2置“0”(IO2線保持低電平)。此時,半字節的高2位存放在ALTERNATE的位4:3,低2位存放在位1和0中。例如,如果半字節2 (0010)通過IO0/IO1發送,則ALTERNATE應設置為0x8A (1000_1010)。
4)空指令周期階段
在空指令周期階段,給定的1-31個周期內不發送或接收任何數據,目的是當采用更高的時鍾頻率時,給Flash留出准備數據階段的時間。這一階段中給定的周期數在QSPI_CCR[22:18]寄存器的DCYC[4:0]字段中指定。在SDR和DDR模式下,持續時間被指定為一定個數的全時鍾周期。若DCYC為零,則跳過空指令周期階段,命令序列直接進入數據階段(如果存在)。空指令周期階段的操作模式由DMODE確定。為確保數據信號從輸出模式轉變為輸入模式有足夠的“周轉”時間,使用雙線和四線模式從Flash接收數據時,至少需要指定一個空指令周期。
5)數據階段
在數據階段,可從Flash接收或向其發送任意數量的字節。在間接模式和自動輪詢模式下,待發送/接收的字節數在QSPI_DLR寄存器中指定。在間接寫入模式下,發送到Flash的數據必須寫入QSPI_DR寄存器。在間接讀取模式下,通過讀取QSPI_DR寄存器獲得從Flash接收的數據。在內存映射模式下,讀取的數據通過AHB直接發送回Cortex或DMA。數據階段可一次發送/接收1位(在單線SPI模式中通過SO)、2位(在雙線SPI模式中通過IO0/IO1)或4位(在四線SPI模式中通過IO0/IO1/IO2/IO3)。這可通過QUADSPI_CCR[15:14]寄存器中的ABMODE[1:0] 字段進行配置。若DMODE = 00,則跳過數據階段,命令序列在拉高nCS時立即完成。這一配置僅可用於僅間接寫入模式。

原文地址:https://mp.weixin.qq.com/s/Z5jWix_8ho33StzaKR3rkQ


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM