adi21593的spi2的memerymap模式有SPI_CTL.MMSE位使能控制,memerymap read header reister (SPI_MMRDH)设置模式配置。
在非内存器映射模式中,读取数据的命令和需求dummy字由软件控制,在内存映射模式中,这些需求由硬件实现。spi的memerymap模式只支持读,不支持任何形式写到flash的操作。
内存系统控制器发送一个read请求到fabric,然后fabric规划路径到spi设备,控制器解读一些列的通讯参数,包括起始地址,转换大小以及中断类型等,spi开始接受读取数据请求并未下一次的重新传输准备。将操作码,地址字节数,操作模式等传入FIFO。SPI传输和接收通道使能后spi内存状态机开始工作。
spi的读序列在spi_sel断言后开始。一旦spi内存状态机处于重置状态,便开始寻求指令,spi的硬件开始发送8bit的读指令,并且后续跟着spi读内存的地址。上述操作完成后,插入一个dummy周期,在此周期内,发送一个模式字节,引脚被held或者处于第三态。
当I/O口数据引脚处于three-satate时,spi的时钟继续工作驱动数据继续传输直到接收到最后一个数据。SPI_CTL.MIOM位配置spi硬件为读数据模式,直到接收到所有的数据之后,SPI_SEL取消断言为下一次read header准备。
memerymap通讯除了spi_ctr寄存器之外最重要的就是SPI_MMRDH寄存器,其寄存器位定义如下:
OPCODE:SPI内存读请求响应的初始位传输字节,0x03,0x0b,0x6b等使用最多
ADRSIZE:读取地址的字节数,地址位能够被发送到单个或者多个pin,SPI_MMRDH.ADRPINS 决定地址发送的pin引脚。
ADRPINS:地址发送到的引脚数使能,0是单引脚1是多引脚,具体发送到那些引脚spi_ctr.miom 决定。
DMYSIZE:dummy字节数,也就是发送地址与读取返回数据之间的字节数。
MODE:dummy字节期间最大的leading字节数
TRIDMY:在dummy期间输出pin是否或者何时转换为three-state
MERGE:该位控制两条转换的merge使能
WRAP:wrap模式下该位需由软件设置。当spi服务于非线性缓存填充请求,该位设置为1,SPI不 需要deassertSPI的从选择信号并且发送readheader。
CMDSKIP:skip模式使能,用于支持XIP操作模式,该操作下spi只发送地址,而采用相同的read 指令。
CMDPINS:指定用于command传输的引脚数量。
dummy周期:
在多IO模式下,大部分的设备都要求在地址后拥有dummy时钟周期,在此时钟周期内,设备能够完成一些初始化操作例如地址的初始化操作过程。硬件控制中SPI_MMRDH.DMYSIZE设置dummy的循环。dummy时钟周能够进行以下操作:发送模式位,将pin转为three-state,翻转引脚为接收数据准备。dummy周期与SPI通讯引脚数之间的关系(MIOM表示spi的dual,qual等模式):
以下是spi memerymap配置流程图:
spi memerymap方式从flash中读取数据的整个工作时序(SPI FAST READ sequence):
通过spi读取flash数据可以通过MDA的方式取出并进行并存在制定的位置。
memerymap操作模式下,SPI_MMRDH.OPCODE在断言SPI_SEL信号后发送,SPI内存解析8bit数据作为读指令,最常见的8bit读取操作码如下:
adi为spi通讯提供了完整参数结构体以及控制函数,我们在使用spi通讯中memeryma模式时,只需要根据具体的要求选择相应的配置,包括spi基础init配置(包括模式,片选等),memerymap模式配置,并最终使能memerymap模式。