DWC SSI簡介

fflinx發表於2024-10-18

DWC SSI

1、簡介
DWC_ssi可配置為:

  • AHB slave
  • AHB slave 和 AXI master
  • AHB slave 和 AHB master
  • APB slave 和 AHB master
    1.2 特性
  • 支援 serail master / serial slave / programmable serial master or slave
  • 支援標準:
  • Motorola SPI
  • Standard/Dual/Quad/Octal SPI
  • JEDEC xSPI(JESD251)version 1.0
  • XccelaBus by Micron
  • Hyperbus by Cypress Semiconductors
  • Texas instruments Synchronous Serial Protocol(SSP)
  • National Semiconductors Microwire
  • 支援 Dynamic WaitState
  • 支援 Execute In Place(XIP)SPI讀、寫
  • 支援 增強(Dual/Quad/Octal)SPI
  • 支援 DMA
  • 支援FIFO深度8~256,固定寬度32位。AID mini深度為256
  • 支援中斷
  • 支援boot模式
  • 支援XIP
  • 支援Bridge功能

AID mini的SPI IP三種用途:

  • AHB SSI:作為普通的SPI傳輸資料
  • Boot SSI:啟動時讀取外部flash中的啟動程式
  • AHB MST SSI:接收相關指令和資料後轉換成對應的AHB匯流排讀寫,此裝置可以訪問整個晶片的地址空間
    2、架構
    2.3 傳輸模式 TMOD
    透過配置CTRLR0配置傳輸模式TMOD
  • 2'b00 收發,資料從TX FIFO透過txd線傳送到裝置,同時從目標裝置移位暫存器到rxd線返回資料到接收端FIFO
  • 2'b01 發,傳送端FIFO發資料,rxd回資料但移位暫存器不會載入資料到RX FIFO。應當遮蔽RX相關的中斷。
  • 2'b10 收,當配置為slave,TX FIFO不會出資料,資料接收從移位暫存器到RX FIFO。應當遮蔽TX相關的中斷。
  • 2'b11 EEPROM讀,傳送操作碼或地址到eeprom,在傳送期間,rxd線資料會被忽略;ssi會持續發資料直到傳送端FIFO空,之後rxd上的資料會被存到接收端FIFO上。
    2.4 介面
    2.4.1 摩托羅拉(SPI)
    極性/相位 4種模式(mode0~mode3),資料寬度4-32bit
    2.4.2 TI同步串列埠協議 SSP
    全雙工
    (未實現)
    2.4.3 國家半導體 Microwire
    半雙工
    (未實現)
    2.5 資料傳輸
  • DWC_ssi使能(SSI_EN=1)
  • 從裝置使能(SER)
  • 傳送端FIFO資料多於TXFTLR->TXFTHR
    傳送期間SR->BUSY置位,必須等到清空再進行下次傳送
    注意:資料寫到傳送端FIFO不置位BUSY,只有從裝置被片選並且資料在傳送的時候才置位BUSY。在輪詢BUSY前要先輪詢TFE
    2.8 master和slave操作(可程式設計模式)
    master和slave可以在ic配置。還有一種可程式設計模式,透過配置CTRLR0->SSIC_IS_MST配置master和slave。
    2.9 時鐘
    ssi工作在過取樣下。在master模式下sclk_out是ssi_clk的倍數。slave模式下,ssi使用同步過的外設時鐘接收或傳送資料。
    當ssi配置為master,ssi_out最大是ssi_clk的一半:Fsclk_out = Fssi_clk / SCKDV,(0<=SCKDK<=65534, 0: disable)
    sclk_out只在傳輸時翻轉。
    2.10 接收和傳送端FIFO buffer
    FIFO buffers是由D型觸發器組成,可以配成8-256深度(AID 固定256)。收發端FIFO固定寬度32bit。序列傳輸時資料幀可配置為4到32bit,資料幀小於32bit必須右對齊寫入到傳送端FIFO,移位控制邏輯自動將接收到的資料在接收端FIFO右對齊。
    FIFO每個位置儲存單個資料幀,一個位置不能儲存多個資料幀
    注意:當ssi disable或者reset後收發端FIFO都被清空

AHB SSI、Boot SSI資料幀長度32bit
AHB MST SSI資料幀長度8bit
2.10.1 接收/傳送端FIFO描述

  • 傳送端FIFO透過AHB寫命令載入到ssi 資料暫存器(DR),資料被移位控制邏輯從TX FIFO放到傳送端移位暫存器。TX FIFO當資料小於等於一個閾值,會產生一個FIFO空中斷。TXFTLR決定這個閾值,可以用來通知處理器傳送端FIFO快空。。
  • 在已滿的TX FIFO寫資料會產生FIFO溢位中斷。
  • AHB讀命令將TX FIFO資料讀到DR暫存器,RX FIFO透過移位暫存器載入資料。RX FIFO在資料達到一個閾值之後會產生一個FIFO滿中斷,閾值為RXFTLR+1。可以用來通知處理器資料要滿。當移位邏輯嘗試載入資料到已滿的FIFO時會產生FIFO滿中斷,但是這個新資料會被丟掉。
  • 當嘗試讀一個空的RX FIFO時,會產生一個下溢(underflow)中斷
    2.10.3 FIFO buffer深度
    8/16/32/64/128/256(AID 固定256)
    2.10.4 相關FIFO暫存器
  • RXFTLR
  • TXFTLR
  • TXFLR
  • RXFLR
    2.11 RXD取樣延遲
    ssi master的rxd取樣延遲可調,為了保證在取樣時rxd資料穩定,增加rxd取樣延遲。軟體可程式設計延時值(RX_SAMPLE_DLY)
    2.12 DMA控制介面
    透過AHB匯流排和DMA傳輸資料,ssi使用一收一發兩個DMA通道。DMACR->TDMAE使能傳送握手,DMACR->RDMAE使能接收握手。
    2.12.1.1 操作概述
    ssi dma控制器可配置資料的block size透過DMA->CTLx->BLOCK_TS
    每次burst大小,DMA.CTLx.SRC_MSIZE = 4
    SSI.DMARDLR + 1 = DMA.CTLx.SRC_MSIZE = 4
    2.13 內部DMA特性
    2.14 SSI中斷
    IC設計 支援常規獨立中斷,或僅組合中斷,均支援mask
  • 傳送FIFO空中斷:傳送端FIFO小於等於一個閾值產生中斷,寫FIFO直到大於閾值時硬體清中斷
  • 傳送FIFO溢位中斷:APB嘗試寫一個滿的傳送FIFO時產生中斷,讀TXEICR清中斷
  • 傳送FIFO下溢中斷:內部DMA模式/SPI bridge模式/XIP write,當FIFO空時產生中斷,讀TXEICR清中斷
  • 接收FIFO滿中斷:接收FIFO大於等於閾值時產生,讀接收FIFO直到資料小於閾值硬體自動清中斷
  • 接收FIFO溢位中斷:接收邏輯嘗試在滿的FIFO裡放資料時產生中斷,新資料會丟掉,讀RXOICR清中斷
  • 接收FIFO下溢中斷:AHB嘗試從空的接收FIFO讀會產生中斷,讀RXUICR清中斷
  • 多主機內容中斷:ssi作為master時,被其他序列master認作為slave,並被傳輸資料時產生中斷,讀MSTICR清中斷
  • SPI傳輸錯誤中斷:動態等待狀態特性使能。
  • SPI主機錯誤中斷:僅當SPI Bridge模式支援,當master發起了slave不能處理的傳輸時生效。讀SPIMECR清中斷
  • AHB錯誤中斷:僅當SPI Bridge模式支援,當AHB master接收到error response時置位。讀AHBECR清中斷
  • SSI完成中斷:開啟內部DMA功能才有效,當DMA傳輸完成後置位。讀DONECR清除中斷。(AID mini不支援內部DMA)
  • AXI錯誤中斷:開啟內部DMA功能才有效,當AXI master接收到error response時置位。讀AXIECR清中斷。(AID mini不支援內部DMA)
  • 組合中斷請求:以上所有中斷請求遮蔽後的OR結果,如果想遮蔽這個中斷,必須遮蔽所有DWC_ssi的所有中斷
    2.15 Boot模式
    SSIC_BOOT_MODE_EN=1,配置為復位後立刻啟動。DWC_ssi接收資料暫存器上的寫命令,不需要對DWC_ssi程式設計。
    引數設定完成後,DWC_ssi復位後立刻寫到資料暫存器,一旦DWC_ssi接收到需要的資料量,DWC_ssi開始寫slave 0.
    2.16 SPI增強模式
    DWC_ssi支援雙線/四線/八線SPI模式,對應訊號txd,rxd和ssi_oe_n的位寬為2,4,8。序列時鐘/相位4種組合在該模式下有效,與標準spi不一致。暫存器CTRLR0.TMOD選擇讀/寫操作。
    2.16.1 增強模式寫操作
  • 指令階段
  • 資料階段
  • 地址階段
    CTRLR0.SPI_FRF:定義傳輸的幀格式
    SPI_CTRLR0:定義指令、資料、地址的長度
    SPI_CTRLR0.INST_L:定義指令長度(0/4/8/16bits)
    SPI_CTRLR0.ADDR_L:定義地址長度
    CTRLR0.DFS:定義資料長度
    2.16.2 增強模式讀操作
    dual/quad/octal spi讀操作分為4個階段
  • 指令階段
  • 地址階段
  • 等待週期
  • 資料階段
    等待週期可以透過SPIC_CTRLR0.WAIT_CYCLES控制,等待週期是讓slave從輸入切換到輸出。
    對於讀操作,DWC_ssi一次性傳送指令和控制資料,等待直到NDF個資料後
    2.17 Slave模式的SPI增強操作
    訊號txd/rxd/ssi_oe_n寬度可配置為2,4,8,CTRLR0.TMOD可配置write/read
    2.17.1 寫操作
    如果TMOD=2'b01,接收資料無效,且資料不會儲存到接收FIFO。資料傳輸基於CTRLR0.SPI_FRF中設定的幀格式
    DWC_ssi不期望從SPI master讀任何資料,不像dual/quad/octal memory裝置從它們讀取資料需要指令和地址。資料傳輸從他的第一個時鐘沿開始,提高了系統的整體效能。
    2.17.2 讀操作
    如果TMOD=2'b10,傳送資料無效,資料傳輸依據SPI_FRF幀格式
    2.18 增強模式時鐘擴充(stretching)
    增強SPI模式支援時鐘擴充特性:可以在傳輸資料過程中保護FIFO的溢位/下溢。如果TX FIFO為空,DWC_ssi master會遮蔽 sclk_out 然後當非空時恢復。同樣的在接收業務上,RX FIFO滿後遮蔽時鐘 直到軟體讀取RX FIFO的資料(水位由RXFTLR控制)
    SPI_CTRLR0.SPI_CLOCK_STRETCH_EN控制使能時鐘擴充特性
    2.19 動態等待狀態 特性
    傳統SPI裝置不支援流控。DWC_ssi支援 動態等待狀態 特性:定義了一個協議,SPI slave在傳輸過程可以進行流控。
    2.20 Dual-Data-Rate(DDR支援)
    標準操作下,資料在spi上的傳輸發生在時鐘上升沿或下降沿。DDR特性支援資料在上升沿和下降沿傳輸。只支援master,需要有對應的memory器件。
    DDR特性在以下mode得到支援:
  • mode 0:SCPH=0 && SCPOL=0
  • mode 3:SCPH=1 && SCPOL=1
    2.20.1 DDR描述
    DDR commands:
  • 地址和資料傳輸使用DDR格式,指令傳輸用標準格式
  • 指令/地址/資料傳輸都用DDR格式
    SPI_DDR_EN:決定地址/資料使用DDR格式
    INST_DDR_EN:決定指令用DDR格式
    只在增強模式下有效
    2.21 Read Data Strobe Signal
    支援讀資料選通訊號
    當SSIC_HAS_RXDS=1 同時 SPI_CTRLR0.SPI_RXDS_EN=1,支援rxds訊號,他決定輸出訊號的有效視窗
    僅當:spi mode 0
    2.22 Data Mask
    SSIC_SPI_DM_EN=1 和 SPI_CTRLR0.SPI_DM_EN=1支援資料遮蔽。僅當增強SPI模式的DDR操作的寫操作下有效。
    資料傳輸時,如果想上傳選擇性的資料到memory,txd_dm訊號可以遮蔽txd上的資料
    2.23 Hyperbus Protocol Support
    (未實現)
    2.24 JEDEC xSPI Protocol Support
    expanded SPI是非易失性儲存裝置的一個標準。支援單線命令和多線命令。
    2.25 SPI Bridge Feature
    DWC_ssi支援將spi所有的傳輸轉換到AHB傳輸,因此外部的master可以直接訪問內部的memory而無需cpu的干預。
    DWC_ssi可以在boot模式下,復位後從外部的master載入boot程式。
    (貼圖)
    所有的SPI傳輸都有以下階段:
  • 指令階段:8bit,決定資料傳輸型別和接下來的傳輸過程
  • 地址階段:僅支援24bit地址
  • 資料階段:接收/傳送資料長度在指令階段配置
    2.26 XIP模式
    DWC_ssi支援透過AHB transaction直接執行SPI memory讀。AHB增加xip_en,該訊號決定AHB是讀寫暫存器還是XIP傳輸。
    當xip_en=1,DWC_ssi等待AHB發出的讀請求,這個請求被轉換成SPI在序列匯流排上的讀操作。當資料由串列埠收到後返回給AHB transaction。地址透過haddr訊號傳送給SPI介面。
    注意:AIDmini中Boot SSI採用此功能,且為master模式。
    2.26.1 XIP讀 應用模型
    XIP僅支援在dual/quad/octal增強spi下使用,因此CTRLR0.SPI_FRF不能配置為0。
    通常XIP操作包含地址和資料,程式設計flow:
    1.配置CTRLR0.SPI_FRF
    2.設定地址長度,等待週期,和transaction type(SPI_CTRLR0.TRANS_TYPE:收/發各自線數)。注意:最大地址長度為32
    XIP傳輸可以包含指令段(SPI_CTRLR0.XIP_INST_EN=1):
    1.設定指令長度(SPI_CTRLR0)
    2.寫指令操作碼(XIP_INCR_INST,XIP_WRAP_INST)
    程式設計做好後,在AHB介面上發起讀transaction會被傳輸到SPI外設。
    配置SPI_CTRLR0.XIP_DFS_HC=0後,AHB的hsize、hburst用於控制資料幀大小和資料幀數目。
    2.26.2 XIP傳輸
    當CTRLR0和SPI_CTRLR0暫存器配置好後,拉高xip_en開啟XIP傳輸(向AHB匯流排發起讀請求)。
    例如從0x0地址開啟4拍xip傳輸:
  • DWC_ssi工作在Octal SPI模式
  • 資料幀長度由hsize訊號控制,32bit
  • burst的地址階段種xip_en必須有效
  • AHB介面傳送的地址與AHB SPI線上傳送的一致,SPI_CTRLR0.ADDR_L決定了SPI線上傳送的地址位數
    DWC_ssi首次接收到所有資料並傳輸到AHB介面上,一旦取得burst所需的資料量,slave片選釋放。每次發起burst請求要向AHB介面傳送地址。
    (貼圖)
    DWC_ssi支援以下兩種AHB傳輸:
    case A:Fixed INCR/WRAP Burst Transfer
    DWC_ssi收到固定的burst請求時,從SPI裝置中取固定數量的資料。hburst決定了幀的數量(NDF),hsize決定了資料幀的大小,上圖是固定增量的INCR4 burst。
    對於WRAP請求,SPI從裝置必須傳送正確的資料,然後DWC_ssi把資料送到AHB介面。
    case B: Undefined Incrementing Burst (INCR)
    DWC_ssi一直從SPI裝置取資料,除非在slave介面上檢測到burst結束(IDLE傳輸),最大可以從SPI裝置中取1KB的資料。如下圖,當htrans訊號上為IDLE傳輸時,DWC_ssi將他看作INCE burst的結束,釋放slave選擇線,傳輸最後一個資料到AHB介面完成burst傳輸。
    (貼圖)
    2.26.3 AHB 等待傳輸
    XIP傳輸時,AHB master有可能傳輸期間插入等待狀態。此時,DWC_ssi不會中斷spi介面上的傳輸,繼續從spi slave上取資料,直到當前burst傳輸結束。
    中間資料儲存在DWC_ssi的RX FIFO中,等待週期結束後再傳送到AHB介面。
    下圖為AHB上有busy週期的傳輸過程。AHB master收到D-1data,AHB插入busy週期。期間,沒有資料會被髮送到AHB master。當AHB恢復傳輸,DWC_ssi繼續傳送從SPI device收到的資料。
    (貼圖)
    中間資料幀存到RX FIFO,可能導致FIFO溢位,所以RX FIFO深度必須考慮在內,如果RX FIFO溢位中斷,必須嘗試資料重傳。(IC)
    2.26.4 Burst提前結束
    在AHB傳輸時可能發生Early burst termination(EBT),AHB檢測到IDLE狀態時,DWC_ssi完成當前SPI線上的傳輸,將最後一個資料發到AHB上。AHB master可以從最後一個地址重新開始burst傳輸,再次傳送地址到SPI slave上。(類似caseB)
    注意:XIP模式下,AHBmaster BUSY時,DWC_ssi不支援EBT。
    2.26.6 支援Mode Bits
    序列傳輸時,裝置可以額外傳送Mode Bits,DWC_ssi設定SPI_CTRLR0.XIP_MD_BIT_EN支援該功能。把要傳送的mode bits值寫入XIP_MODE_BITS暫存器,在暫存器為SPI_CTRLR0.XIP_MBL或XIP_CTRL.XIP_MBL中設定mode bits的長度,在地址階段完成後傳送mode bits,傳送方式與地址一致。
    (作用?)
    2.26.9 Hyperbus模式的XIP傳輸
    從haddr收到的32bit地址打包成hypterbus裝置需要的48bit的CA幀格式。因為Hyperbus裝置16bit定址,包成48bit地址時忽略addr的最低有效位。
    2.27 Concurrent XIP 和 Non-XIP 操作
    XIP和Non-XIP是互斥的,因此當新的XIP或Non-XIP傳輸時,RX和TX FIFO應該為空。兩種傳輸要序列,保證沒有資料交叉或丟失。因為複雜度增加因此一些系統不會有這種需求。
    DWC_ssi提供一種配置,可以並行處理XIP和non-XIP傳輸。DWC_ssi為XIP傳輸資料提供一個單獨的FIFO,因此在開始新的XIP傳輸前不用保證RX和TX FIFO為空。
    2.27.1 操作描述
    配置引數SSIC_CONCURRENT_XIP_EN=1支援該功能。
  • 可以並行處理XIP和Non-XIP(read / write),在序列介面上同一時間只能有一個transaction。DWC_ssi按照先到線服務的原則:當non-XIP正在SPI介面上傳輸,直到完成當前傳輸才可以進行XIP傳輸,反之亦然。
  • 增加獨立的XIP配置暫存器XIP_CTRL和slave選擇暫存器XIP_SER,使用XIP_CTRL中定義的特性進行傳輸,對於non-XIP傳輸,使用CTRLR0,SPI_CTRLR0暫存器定義的特性進行SPI序列傳輸。
    當DWC_ssi連線到多個master,master-A需要DMA transaction,但是master-B需要XIP傳輸時,兩個master可能在任何時間發起請求。
    SSIC_CONCURRENT_XIP_EN=0
    此時,DWC_ssi處理master-A的DMA請求時,不會處理任何master-B的XIP傳輸請求,DWC_ssi返回ERROR響應,只有當DMA請求在對應序列介面上全部完成後才處理XIP請求,但是CPU也可以透過以下步驟產生中斷進行XIP傳輸:
    1.停止當前的DMA傳輸
    2.清空TX RX FIFO
    3.(可選)傳送SPI suspend命令
    4.保證SPI裝置完成其內部操作(輪詢裝置的狀態位)
    5.允許XIP傳輸進行
    6.如果(3)發起了SPI suspend命令,則傳送SPI重發命令
    7.檢查SPI裝置是否準備好重發DMA transaction(輪詢裝置狀態位)
    8.重新傳送剩餘資料的命令和地址
    這個過程嚴重影響整體效能,因此最好分開進行dma和xip傳輸。
    SSIC_CONCURRENT_XIP_EN=1
    此時不需要上述步驟,只需要按規則進行以下程式設計:
  • 設定DWC_ssi中的DMA控制和DMA閾值暫存器
  • 設定SER暫存器中的slave
  • 設定XIP_SER暫存器的slave
  • 保證DMA transaction的長度等於TXFTLR.TXFTHR中的值
    這種方式提高了整體效能,配置好DWC_ssi後,CPU參與很少
    2.28 XIP連續傳輸模式
    DWC_ssi接收到XIP請求後,將來自AHB介面的地址傳送到SPI介面,每個新的XIP讀傳輸都是一樣的處理方式。因此對於每個請求都要傳送地址,導致了系統的延遲。
    若memory裝置允許在XIP傳輸之間保持slave選擇訊號不i按,DWC_ssi可以配置成連續XIP模式,提高效能。此時主機的2個或更多的AHB burst請求轉為single SPI命令,透過確保命令和地址不重發,並且主機在這些burst期間不需要等待dummy週期。
    2.28.1 描述
    設定SPI_CTRLR0.XIP_CONT_XFER_EN=1使能該特性,此時收到第一個XIP命令後,DWC_ssi工作在連續XIP模式。對於第一個XIP傳輸,地址傳送到SPI介面上(SPI_CTRLR0.XIP_INST_EN=1時增加指令)。接收到資料後,DWC_ssi保持slave選擇線和時鐘(sclk_out)到預設狀態。對於後續AHB介面上的XIP傳輸,DWC_ssi重發時鐘sclk_out,無需傳送命令和地址到SPI介面上,資料直接從裝置上取回,沒有dummy週期。
    以下兩種情況DWC_ssi會退出連續模式:
  • XIP介面上收到了non-XIP命令(xip_en=0時任何AHB transaction)
  • 當AHB transaction處理非連續的地址時,slave選擇線移走,DWC_ssi開始新的XIP請求
    DWC_ssi支援以下兩種連續傳輸的方式:
  • continuous incremental transfer
  • continuous WRAP transfer
    2.28.2 Continuous Incremental Transfer
    連續的XIP模式下,收到的第一個命令為INCR(hburst = 011/101/111)時,該傳輸定義為連續增量。該模式下,這次傳輸完成後,下一個命令也必須是增量的,地址必須與上一個burst連續。
    如果收到的第一個transaction有以下特性,那麼下個連續的地址從0x00001010開始:
    HADDR = 0x00001000;HSIZE = 3'b010(32bits)and HBURST = 011(INCR4)
    若此時AHB transaction(xip_en=1)的地址不是0x00001010,或者檢測到WRAP傳輸,那麼一開slave選擇線,DWC_ssi發起新的XIP請求。
    連續讀模式下不支援未定義的INCR burst(hburst=001)
    2.28.3 Continuous WRAP Transfer
    連續的XIP模式下,收到的第一個命令為WRAP(hburst = 010/100/110)時,該傳輸定義為連續WRAP。該模式下,這次傳輸完成後,下一個命令的地址必須衝上一個burst地址的邊界開始。
    如果收到的第一個transaction有以下特性,那麼下個連續的地址從0x00001010開始:
    HADDR = 0x0000100c;HSIZE = 3'b010(32bits)and HBURST = 010(WRAP4)
    若此時AHB transaction(xip_en=1)的地址不是0x00001010,那麼移開slave選擇線,DWC_ssi發起新的XIP請求。
    2.29 XIP資料預取
    對於AHB介面上的每個XIP請求,DWC_ssi傳送指令和地址到終端裝置,一段時間後,裝置返回資料,在傳送到AHB介面上,當讀一大塊的資料時,分成幾個burst傳輸,每個傳輸所需時間相同,控制器必須要等待指令和地址階段後才能得到資料。
    使用DWC_ssi的資料預取功能時,控制器在當前XIP transaction時預取線序burst的資料。如果下一個transaction請求連續的地址,可以直接從RX FIFO中讀走,而不是等待一個新的地址和資料階段,提高了系統整體效能。
    2.29.1 描述
    預取的資料量要等與上一個AHB傳輸的burst長度或FIFO深度(兩者取最小)。
    例如,AHB定義burst長度為16,從0x00地址開始,DWC_ssi完成當前的16拍取資料後,接著再取16個資料放到資料暫存器。·如果AHB匯流排在此請求資料,地址從上一個傳輸結束的未知開始,此時資料從RX FIFO直接放回到AHB介面上。同時,DWC_ssi在此開始XIP傳輸,預取下一塊資料。如果AHB master傳送的不是連續的地址,RX FIFO中的資料重新整理,並且開始一個新的transaction。
    以下為應用場景:
    case A:Transfer Request for the Contigous Address
    此時,DWC_ssi返回FIFO中的所有資料,然後再取剩下的資料完成當前傳輸。完成後,DWC_ssi按照同樣的方式,為下次傳輸預取資料。
    例如:
    1.T-0時刻,DWC_ssi收到burst為16的XIP請求
    2.T-1時刻,DWC_ssi完成當前的XIP傳輸,繼續再取16個資料幀
    3.當DWC_ssi預取下一個16拍資料時,收到了另一個burst長度為16的XIP請求
    4.此時,DWC_ssi用FIFO終端資料處理第二次burst請求
    5.一旦但概念傳輸完成,DWC_ssi繼續取16個資料幀完成預取
    如果DWC_ssi一直收到XIP請求,這個處理過程就會一直執行預取,該功能可以用於擴充當前XIP傳輸,可以取任意量的資料。
    (貼圖)
    case B:Transfer Request for the Non-Contiguous Address
    此時,當前的序列傳輸結束後RX FIFO重新整理,在序列線上開始新的傳輸
    (貼圖)
    如果連續傳輸模式和預取模式都使能,從裝置中預取資料,slave選擇線一直置位。連續地址請求時,資料從RX FIFO中讀出,同時DWC_ssi從連續地址預取資料。這個過程會一直持續,直到接收到一個非連續的地址,或AHB介面上的non-XIP transaction,此時,預取的資料從FIFO中刷掉,開始新的傳輸。
    對於非連續的地址,或AHB介面上的non-XIP transaction,此時,預取的資料從FIFO中刷掉,開始新的傳輸。
    對於非連續的模式,一旦預取完成後,就會釋放slave選擇線,發起新的XIP讀請求時,再次置位slave選擇線可以進行下一步預取。因此對於連續讀模式,無需再次傳送指令和地址到裝置,資料可以很快取回,延遲相對較少。
    僅在連續XIP模式下,支援WRAP涮熟型別,此時會預取增量地址的資料,若完成此時WRAP傳輸後,另一個WRAP傳輸產生,刷掉FIFO中預取的資料,重新開始新的傳輸。
    若預取功能使能,不支援AHB未定義長度的增量傳輸(hburst=3'b001)

DWC-ssi響應以下應用場景的新傳輸請求:
Case1:The Next Burst Length Smaller than the Pref-Fetched Data
此時,DWC_ssi透過FIFO中資料響應burst請求,若RX FIFO中有足夠的資料完成2個但概念burst長度的傳輸,則不會預取資料。
例如,初始的XIP請求為INCR16,DWC_ssi取16個資料幀來響應該請求,並再預取16個資料幀放入RX FIFO中,若下一個XIP請求為INCR4,DWC_ssi立刻響應,不會進行新的SPI傳輸,因為對於下一次預取來說,RX FIFO中有足夠的資料(burst length2 = 42 = 8)
Case2:The Burst Length Larger than the Data Stored in RX FIFO
此時,DWC_ssi透過RX FIFO中的所有資料響應,同時開始XIP burst,渠道資料後完成剩下的burst。
DWC_ssi也會預取下一個burst長度的資料,放入RX FIFO。
例如,初始的XIP請求為INCR4,DWC_ssi取4個資料幀來響應請求,並再預取4個資料幀放入RX FIFO中,若下一個XIP請求為INCR16,DWC_ssi離婚可用4個資料幀響應,並再開始取28個資料幀(12個響應當前burst+預取16個)
Case3:AHB Master with New Transfer request in Middle of Pre-fetch
當預取還未完成的時候,AHB master發起了新的連續XIP傳輸請求時,DWC_ssi用取得的資料響應,並進行下一步的預取,類似上述case2.
AHB master發起了非連續地址的新的XIP涮熟是,正在進行的預取停止,並再SPI上開始新的XIP傳輸,當DWC_ssi關閉時,預取的資料沖刷掉。
如果想知道DWC-ssi是否正在預取連續地址的資料,軟體可以輪詢SR暫存器中的SSI busy狀態,busy拉低時,開始non-XIP的操作。
5、暫存器
Block1:

  • CTRL0
  • CTRL1
  • SSIENR
  • MWCR
  • SER
  • BAUDR
  • TXFTLR
  • RXFTLR
  • TXFLR
  • RXFLR
  • SR
  • IMR
  • ISR
  • RISR
  • TXEICR
  • RXOICR
  • RXUICR:接收FIFO溢位中斷清除暫存器
  • RXUICR
  • MSTICR
  • ICR
  • DMACR
  • DMATDLR
  • AXIAWLEN
  • DMARDLR
  • AXIARLEN
  • IDR
  • SSIC_VERSION_ID
  • DRx
  • RX_SAMPLE_DELAY
  • SPI_CTRLR0
  • DDR_DRIVE_EDGE
  • XPI_MODE_BITS
    Bridge
  • CTRLR0
  • SSIENR
  • RXFBTR
  • TXFTLR
  • RXFTLR
  • SR
  • IMR
  • ISR
  • RISR
  • TXUICR
  • RXOICR
  • SPIMECR
  • AHBECR
  • ICR
  • IDR
  • SSIC_VERSION_ID
    Block2:
  • XIP_INCR_INST
  • XPI_WRAP_INST
  • XIP_CTRL
  • XIP_SER
  • XRXOICR
  • XIP_CNT_TIME_OUT
  • SPI_CTRLR1
  • SPITECR
  • SPIDR
  • SPIAR
  • AXIAR0
  • AXIAR1
  • AXIECR
  • DONECR
  • XIP_WRITE_INCR_INST
  • XPI_WRITE_WRAP_INST
  • XIP_WRITE_CTRL