本文整理自22. FlexSPI—讀寫外部SPI NorFlash — [野火]i.MX RT庫開發實戰指南——基于i.MXRT1052 文檔
用作個人學習和分享
指令查找表LUT
訪問FLASH存儲器通常包含一些讀寫功能的的控制指令,主控設備可通過這些指令訪問FLASH存儲器。
為了適應這種需求,FlexSPI外設中包含有一個指令查找表LUT(Look Up Table),即圖 22?5中第②部分SEQ_CTL(序列控制邏輯)的主要內容,它用來預存儲訪問外部設備時可能使用到的指令,需要對FLASH進行訪問時,FlexSPI會從查找表LUT中獲取相應的指令然后通過SPI接口對FLASH發起通訊。
該表使用序列的形式緩存指令,最多支持16個指令序列,每個序列最多支持8個指令。例如,在某序列中緩存指令C1、C2、C3…,當控制執行該序列時,指令C1、C2、C3…會被按順序執行。
查找表LUT的構成
查找表LUT的構成具體見圖?
該圖中的第①部分是查找表LUT視圖,它表示查找表LUT有0~N個序列;第②部分是序列視圖,它表示1個序列中包含有8個指令;第③部分是指令視圖,表示指令由opcode(指令編碼)、num_pads(數據線的數目)、operand(指令參數)三個寄存器域構成。這些指令的存儲位置是FlexSPI外設中的寄存器LUT0~LUT63,每個LUT寄存器可以緩存2個指令,即1個指令序列(8個指令)由4個寄存器構成,這些寄存器構成了一個完整的LUT表。
LUT寄存器的構成
LUT寄存器的構成具體
LUT寄存器的各個域說明如下:
-
OPCODE:指令編碼,這是由FlexSPI定義的一些基本指令碼,如向FLASH發送控制命令的CMD_SDR指令OPCODE為0x01;發送行地址到FLASH的指令OPCODE為0x02,諸如此類。
-
NUM_PADS:進行SPI通訊時使用的數據線的數目,它的可用參數為:
-
0x0:Single模式
-
0x1:Dual模式
-
0x2:Quad模式
-
0x3:Octal模式
-
OPERAND:指令參數,部分OPCODE指令包含參數,這些參數就由OPERAND設定,參數的具體作用由相應的OPCODE決定。
常用指令說明
指令名稱 | OPCODE | NUM_PADS | SPI接口發送的內容 | Bits/Bytes/ Cycle的數目 |
---|---|---|---|---|
CMD_SDR/ CMD_DDR | 0x01/0x21 | 0:Single模式 1:Dual模式 2:Quad模式 3:Octal模式 | 發送控制FLASH的命 令代碼到FLASH存儲 器,即OPERAND [7:0]的內容 | Bits數目:固定為8 |
RADDR_SDR /RADDR_DDR | 0x02/0x22 | 發送行地址到FLASH , AHB命令模式: 由訪問的AHB 地址決定; IP命令模式: 由IPCR0寄存器決定 | Bits數目:OPER AND [7:0],即由它指定 地址的位數 | |
WRITE_SDR/ WRITE_DDR | 0x08/0x28 | 發送要寫入的數據到FL ASH, 即AHB_TX_BUF 或IP_TX_FIFO 的數據 | Bytes數目,即要傳 輸的字節數: AHB命令模式: 由AHB突發大小和突發 類型決定 IP命令模式: 由IPCR1.DATS Z寄存器域決定 | |
READ_SDR/ READ_DDR | 0x09/0x29 | 從FLASH接收數據, 收到的數據會被存儲到A HB_RX_BUF或I P_RX_FIFO | ||
DUMMY_SDR/ DUMMY_DDR | 0x0C/0x2C | FlexSPI釋放對數 據線的控制,時鐘信號正 常驅動。這種指令通常是 FLASH設備要求的空 操作等待 | Cycle數目,即DU MMY周期的個數(即S CK的周期數): OPERAND [7:0],由它指定發 送多少個DUMMY周期 | |
STOP | 0x00 | 固定為0,即Singl e模式 | 停止執行,釋放CS片選 信號,不發送內容 | SPI接口無數據傳輸 |
此處對該表中特別值得注意的內容說明如下:
-
查找表支持兩套有同功能不同模式的指令。例如CMD_SDR和CMD_DDR的OPCODE為0x01和0x21,它們分別表示使用SDR模式和DDR模式的CMD指令,它們的功能一樣,都是向FLASH發送命令代碼。其它指令類似,大都有SDR和DDR模式。
-
數據線的數目由NUM_PADS指定。不同的指令可以通過它自身的NUM_PADS域來指定,因此不同指令可以使用不同的數據線數目。在應用中一些FLASH存儲器的命令只使用一根數據線(Single模式),而快速讀寫的命令則可支持Dual、Quad模式,此時針對命令使用不同的NUM_PADS進行定制即可。
-
OPERAND參數在不同指令下作用不同:
-
對于CMD_SDR指令,它的功能是向FLASH發送命令代碼,此時要發送的FLASH命令代碼就是CMD_SDR指令的參數,即由OPERAND域指定(請注意區分FLASH命令和OPCODE)。例如W25Q256型號的FLASH的讀取ID命令代碼為0xAB,當RT1052要讀取FLASH的ID時,利用CMD_SDR指令同時把命令代碼0xAB賦予到OPERAND域,這樣FlexSPI控制的時候就會通過SPI接口把FLASH命令0xAB發送出去了。
-
對于RADDR_SDR指令,它的功能是向FLASH發送要讀寫的存儲單元地址,該地址由IPCR0寄存器指定,同時OPERAND域用于指定地址的長度。例如部分FLASH的空間比較小,只使用16位來表示地址,那么該命令的OPERAND域的值就應為16,對于W25Q256這種地址為24或32位的存儲器,OPERAND域的值就應設置為24或32。
-
對于DUMMY_SDR指令,它的功能是釋放FlexSPI對數據線的控制,而時鐘正常運行,該指令是針對FLASH存儲器的部分時序要求,這時FLASH存儲器會忽略數據線上的內容,實質它是要求主機進行等待,在這種情況下可通過OPERAND指定該過程要占多少個SCK的周期數。
-
數據傳輸指令的數據緩沖區位置分兩種情況。WRITE_SDR和READ_SDR指令分別用于向FLASH寫入和讀取數據,這些指令傳輸的數據緩沖位置如下:
-
在AHB命令模式下:數據緩存在AHB_TX_BUF(發送緩沖區)以及AHB_RX_BUF(接收緩沖區)中,此時要傳輸的字節數由AHB突發傳輸的大小和類型決定。
-
在IP命令模式下:數據緩存在IP_TX_FIFO(發送緩沖區)以及IP_RX_FIFO(接收緩沖區)中,此時要傳輸的字節數可通過寄存器IPCR1的DATSZ域指定。
-
操作通常使用序列的形式并配合STOP指令(停止指令)使用:以上說明的各個指令通常不會單獨執行,而是組成一個指令序列,對于指令數不滿8個的序列,需要使用STOP指令表示結束。例如一個使用IP命令模式的讀取操作中,通常會使用以下的指令序列:
-
使用CMD_SDR指令向發送FLASH的讀取命令,如W25Q256的Quad模式讀取命令編碼為0x6B,此時CMD_SDR指令的OPERAND域為0x6B;
-
使用RADDR_SDR指令發送要讀取的FLASH存儲單元地址,OPERAND域的值為24表示使用24位的地址,而地址具體的值由寄存器IPCR0設定;
-
按照FLASH的Quad模式讀取命令的要求發送占8個SCK時鐘的DUMMY操作,此時使用DUMMY_SDR指令且OPERAND域的值設置為8;
-
使用READ_SDR指令,開始接收FLASH的數據到IP_RX_FIFO中,要讀取的字節數由寄存器IPCR1的DATSZ域指定;
-
由于使用的指令不足8個字節,在該序列的最后使用STOP指令表示停止,當FlexSPI執行到STOP指令時,會釋放SPI的片選信號CS,結束通訊。