1. 程式人生 > >Zynq Qspi控制器應用筆記

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,說明文件在: