DWC SSI简介

fflinx / 2024-10-23 / 原文

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