Zynq Qspi控制器應用筆記
1 Zynq Qspi控制器
Zynq Qspi控制器支援三種模式:I/O模式、線性地址模式和傳統SPI模式,其中線性地址模式雙片選支援最大的線性地址空間為32MB,可通過PS DMA讀取。
1.1 線性地址模式
線性地址模式只可從Qspi Flash中讀數。在配置QSPI BOOT時,BOOT ROM工作線上性地址模式,且訪問時鐘為ARM接入的晶振時鐘,因此在選用晶振時頻率不能大於Flash的最高訪問時鐘頻率。
線性地址模式下IO可以配置為單片選4bit介面、雙片選8bit並行介面和雙片選stacked 介面,單片器件時必須接到QSPI0上。單片QSPI Flash線性地址對映空間為0xFC00_0000~0xFCFF_FFFF,若採用兩片,必須是同一生產廠家,保證協議相同,在配置為雙片選8bit並行介面時,兩片Flash必須要是同樣容量同一廠家器件,保證訪問完全同步,定址空間為0xFC00_0000~0xFDFF_FFFF。
配置為雙片選stacked 介面時,容量可以不同,但必須是相同協議的器件。但第一片器件建議使用128Mb器件,這樣不會存在地址空區。線性地址模式的讀操作極為簡單,在確保TxFIFO和RxFIFO為空的情況下設定qspi.Config_reg[Man_start_en]和qspi.Config_reg[PCS]為0,qspi.LQSPI_CFG.[LQ_MODE]為1即可。
1.2 IO模式
在IO模式下,訪問QSPI Flash的命令、地址和資料都根據SPI Flash資料手冊的規定由使用者軟體組織寫到FIFO中,控制器負責將其序列化後從匯流排發出。在IO模式下,可選擇自動和手動兩種操作模式,手動模式下又有自動片選和手動片選兩種模式。自動模式由發資料轉為收資料時存在一定侷限,因此在實際使用中多為手動模式。
QSPI控制器提供了四個可將資料寫到FIFO的TXD暫存器,如下表1所示。
表1 TXD暫存器
暫存器 |
資料格式 |
功能 |
|||
[31:24] |
[23:16] |
[15:0] |
[7:0] |
||
TXD0 |
Data3 |
Data2 |
Data1 |
Data0/CMD |
傳輸1byte命令3byte資料或4byte資料 |
TXD1 |
保留 |
保留 |
保留 |
Data0/CMD |
傳輸1byte命令 |
TXD2 |
保留 |
保留 |
Data1 |
Data0/CMD |
傳輸1byte命令和1byte資料 |
TXD3 |
保留 |
Data2 |
Data1 |
Data0/CMD |
傳輸1byte命令和2byte資料 |
這樣就提供了豐富的選擇,無論是按字寫、按位元組、按雙位元組三位元組都可以,但需要注意的是在不同暫存器間切換時需要等待FIFO已經為空狀態。TxFIFO和RxFIFO使用同一個門時鐘,因此對於每一個位元組,包括命令和地址,每從TxFIFO取出一個位元組,一個自己的資料也會寫入到RxFIFO中。
為了從SPI Flash讀資料,軟體除了寫入相關的命令、地址、模式、dummy等外,還必須向TxFIFO寫和讀資料個數等額的Dummy資料,這樣才會有控制器寫RxFIFO的時鐘。
需要特別注意的是,在IO模式下,控制器自動識別使用者指令,在控制器使能,且片選有效的情況下寫入FIFO的第一條指令被控制器認為是命令,命令總是通過資料線D0發出,命令+資料最長為4位元組,也就是說在發出讀寫命令時,有效地址位總是3位元組,只能訪問16MB地址空間。
控制器自動識別含義的命令如表2所示。
表2 控制器自動識別含義的命令
命令 |
含義 |
描述 |
READ |
讀資料,CMD=0x03 |
命令通過D0發出;資料通過D0接收 |
FAST_READ |
快速讀資料,CMD=0xB |
命令通過D0發出;資料通過D0接收 |
DOR |
雙IO讀資料,CMD=0x3B |
命令通過D0發出;資料通過D[1:0]接收 |
QOR |
四IO線讀資料,CMD=0x6B |
命令通過D0發出;資料通過D[3:0]接收 |
DIOR |
雙IO命令,四IO資料,CMD=BB |
命令通過D[1:0]發出,資料通過D[3:0]接收 |
QIOR |
四IO命令,四IO資料,CMD=EB |
命令通過D[3:0]發出,資料通過D[3:0]接收 |
PP |
頁程式設計命令,CMD=02 |
命令通過D0發出,資料通過D0發出 |
QPP |
四IO頁程式設計命令,CMD=32或38 |
命令通過D0發出,資料通過D0[3:0]發出 |
無論是線性地址模式還是IO模式訪問QSPI,控制器均只支援表2所示的命令並自動切換控制器工作模式。在表2所列命令之外的,控制器均預設通過D0發出和接收。
2 QSPI Flash選擇
Zynq Qspi Flash控制器並不支援所有的Qspi Flash器件,因此在選擇Qspi Flash時必須滿足:
① 支援QOR命令:BootRom預設方式;
② 支援3位元組地址模式:預設最大支援16MB,超出16MB部分通過地址暫存器設定後仍可通過3位元組地址模式訪問的。
不支援Qspi Flash器件見UG585 12.2.6小節的描述。
2.1 QSPI Flash操作例項
以鎂光的N25Q512 Qspi Flash為例,簡要說明要點:
N25Q512 QspiFlash支援Extended、Dual和Quad三種SPI協議模式,預設為Extended模式,預設模式即和Zynq QSPI 控制器訪問協議匹配。
N25Q512 QspiFlash共512Mb的密度,分成4個BANK,每個BANK密度為16MB,可以通過Extended Address Register或者切換到4位元組地址模式來對16MB以上的空間進行訪問。因為Zynq Qspi Flash僅支援3位元組地址模式,因此訪問高地址空間時,通過切換Extended Address Register來實現。通過該方式存在一定的風險,那就是BootRom只能訪問低16MB空間,為避免映象寫到高地址空間去,在每次用Xilinx工具燒寫Flash前一定要重新斷電重啟,使Flash的Extended AddressRegister恢復到預設狀態。
N25Q512 QspiFlash在Erase、Program和訪問內部暫存器前一定要先發出寫使能命令(06H);Erase、Program命令發出後一定要讀FlagStatus暫存器。
N25Q512 QspiFlash,擦除可以是子頁擦除(4KB)、頁擦除(64KB)和Die擦除(32MB)。一頁大小為256B,因此每個Program命令只能寫256位元組的資料。
3 作為BOOT器件的考慮
在使用Qspi Flash需要注意:
① BootROM只能訪問低16M(單SS)或低32M(雙SS),因此映象必須儲存下可訪問空間內;
② 單SS時,啟動器件必須掛在QSPI控制0上;
③ 雙SS並行8bit模式時BootROM的搜尋步長是64KB,其模式為32KB,因此為減少搜尋時間,啟動映象最好從地址0開始。
4 資源
Xilinx提供裸機板級支援包、Uboot驅動和Linux驅動。
① Xilinx板級支援包例項:
/SDK/2015.2/data/embeddedsw/XilinxProcessorIPLib/drivers/qspips_v3_2/examples;
② Uboot驅動:/u-boot-xlnx-master/drivers/spi/zynq_qspi.c
③ Linux驅動:/dirvers/spi/zynq-qspi.c,說明文件在: