Queued Synchronous Peripheral Interface (QSPI)

1. 介绍

SPI是一种主从的通讯接口,主机一般是MCU,从机可以是各种外设驱动芯片(也可以是MCU)。通过片选信号的激活,主机可以实现和不同从机之间的QSPI通讯。=

Queued Synchronous Peripheral Interface (QSPI),此处的Q是指Queued (队列),内部自带FIFO,需要注意此处的QSPI并不是Standard SPI里面的四线SPI(Qual SPI)。

具体可参考文章:SPI总结

2. Feature List

  • 支持全双工、半双工、单工
  • 支持四线、三线(缺片选)模式,半双工、单工模式下,仅两个线(时钟、数据线)
  • 支持灵活的数据格式,数据位数2~32bit可编程(加奇偶校验:3到33位);移位方向、时钟极性、相位可编程
  • 支持Tx\Rx,错误状态(接收、波特率、发送错误、奇偶校验错误),传输状态(帧的开始或结束…)中断
  • 支持DMA
  • 硬件支持奇偶校验:奇校验;偶校验;无校验位
  • 从模式下有7个从机片选输入SLSIB…H;
  • 主模式下有16个从机片选输出SLSO[15:0](主模式下最多可挂在16路从机)
  • Master模式下输出片选极性可配置(高 or 低电平有效)
  • Loop-Back mode(回环模式)
  • 高速输入捕获(HSIC)(部分型号没有该模块,具体见Part1手册,46页)
  • 最高通信速率50Mbps(仅部分QSPI支持,实测使用普通引脚的SPI最高20Mbps,大于20Mbps后需要使用LVDS引脚)

3. 概述

3.1 QSPI框图

在这里插入图片描述

3.2 操作模式

IP本身不区分全双工、半工、单工操作模式,半工和单工都是通过外部连线进行实现。

在这里插入图片描述

Ifx QSPI半双工实现方式与其他SPI半双工实现不太一样,普通SPI直接将MTSR和MRST在芯片内部合并为同一个Pin输入输出,而Ifx QSPI的仅部分的QSPI可以合并,大部分半双模式下都需要外部短接来实现。具体实现方式如下

Master与Slave的MTSR、MRST四个引脚全部连接,主、从的发送端都设置为开漏输出,总线外接上拉电阻,利用“线与”特性完成数据传输。

  • Master发,Slave收时:Slave会往DATAENTRY写0xFF,也就是Slave端的MRST会一直发送0xFF,总线处于“线与”状态,所以Slave收到的数据就是Master发送的数据
  • Master收,Slave发时:同上

根据Pin映射,可以分为两种连接方式

1、使用内部连接(对应半双工图中实线部分)

Ifx的内部连接只针对QSPI0\1设计了,其他几个QSPI未提供这样的功能,Mater和Slave的发送都必须配置为“开漏输出”,否则会烧坏GPIO,Master的数据数据采用MRSTA引脚输入(配置PISEL.MRIS = 0即可)
由于两个输出都设置为开漏输出,所以总线需要接上拉电阻才能正常输出高电平,上拉电阻可以通过外部连接的方式给入,也可以同时设置主从的数据输入引脚为上拉输入。
在这里插入图片描述
2、使用外部连接(对应半双工图中虚线部分)
Master和Slave的发送接收都连在一起(四个Pin都连到一根总线上),Mater和Slave的发送都配置为“开漏输出”。

TC37x LFBGA-292引脚统计如下:
在这里插入图片描述

  • 图中数字1表示对应Pin支持QSPI的某个功能,例如QSPI的P20.12行的1,表示该引脚支持Mater模式的输出(MTSR)、Master下的输入(MRSTA)和Slave模式下的输出(MRST)。
  • 仅黄色背景的两个引脚在半双工模式下可以走内部直接连接,不用额外占用其他引脚

3.3 三线模式

缺少片选信号,仅限定一对一通信。
在这里插入图片描述

3.4 时钟极性和时钟相位

CPH: 控制时钟相位
CPOL: 控制时钟极性
在这里插入图片描述

4. Master模式

4.1 状态机

Master模式下除发送数据以外,还需要提供串行时钟和片选信号。
一帧QSPI信号包含5个阶段:空闲延时、前置延时、数据阶段、尾随延时和一个可选的等待阶段,其中空闲延时阶段分为空闲A与空闲B。
在这里插入图片描述
相应时间计算公式如下:
在这里插入图片描述

4.2 采样点

类似CAN协议,此处可以通过配置ABC三个参数偏移采样点,一般普通的SPI,则使用其中一个边沿采样数据。
在这里插入图片描述

4.3 波特率

QSPI时钟除以大于4的整数,此处fPER时钟为200Mhz,故fSCLK时钟最大50Mhz(QSPI的时钟线)
在这里插入图片描述
计算公式如下:

备注:
1、QSPI模块有两个时钟输入,一个是fSPB用来驱动寄存器读写,一个fPER,用来生成QSPI波特率时钟。
2、时钟可参考(CCU输出时钟命名为fQSPI):Clocking System

4.4 通信模式

所有模式总结:

在这里插入图片描述
注意:用户并不能直接操作控制寄存器和移位寄存器的,通过其他接口进行间接操作。

  • 发送数据时,用户数据都是先写入xxx_ENTRY寄存器中,硬件自动搬运到Tx FIFO中,其中传输后,硬件在从FIFO中搬配置到配置寄存器(BACON)或搬数据到移位寄存器中。
  • 读取数据时,将移位寄存器的数据或状态寄存器(STATUS)内容搬到Rx FIFO中,用户通过RX_EXIT寄存器进行读取。
    在这里插入图片描述

4.4.1 短数据模式

以bit为单位传输,一次可传输2~32bit数据,每次传输前都需要先写一次配置在写数据。配置中BACON.BYTE固定为0,BACON.LAST = 1固定为1
在这里插入图片描述

4.4.2 长数据模式

以Byte为单位传输,一次可传输2~32Byte数据,此处框图只是示意图,实际写一个配置后,后续最大可写入8个DATA块,一个DATA块最大32bit。
配置中BACON.BYTE = 1,BACON.LAST = 1
在这里插入图片描述
备注:代码中限定一个配置之后,最大跟4个DATA,可能是因为FIFO的深度为4导致,实测跟8个也能正常通信。
在这里插入图片描述

4.4.3 短连续模式

在短数据的基础上,传输多个短数据块,只需要在首尾各写一次配置。
第一次配置:BACON.BYTE=0,BACON.LAST = 0,开始发起通信
最后一次配置:BACON.BYTE=0,BACON.LAST = 1,在发一笔数据后,结束通信
在这里插入图片描述
备注:驱动代码中单独区分了短模式和短连续模式,但IfxQspi_SpiMaster_exchange接口中,会自动根据形参count进行切换,当count为1时,短数据模式,大于1时,短连续模式。

4.4.4 长连续模式

在长数据的基础上,传输多个长数据块,一个配置后面跟多少DATA,由BACON.DL参数决定,前面n-1个配置的LAST = 0,仅最后一次时,将LAST配置为1。
在这里插入图片描述

4.4.5 单配置多帧模式

只需要写入一次BACON寄存器值,就可以发送多帧数据,避免连续模式,发送的多个配置。单次传输数据长度最大16bit。
在这里插入图片描述
备注:
1、该模式下所有的配置和数据都写到MIX_ENTRY中,根据高16bit数据进行区分,高16bit非0,则认为是配置,否则是数据。
2、实际该模式为短数据模式的扩展,可以看成多个短数据拼接而成,只是数据和配置都往MIX_ENTRY写,数据长度最大16bit而已。
3、传输过程中,若修改其中的配置,,例如BYTE = 1,LAST = 1,会自动切换到长数据模式进行传输。

4.4.6 XXL模式

长数据模式的一种扩展模式,长数据模式最大可传输2 ~ 32byte,使用XLL模式可以传输2~65536byte。
使用方法
设置BACON.DL = 0,,BACON.BYTE = 1,设置XXLCON.XDL位域值(数据传输长度);
另外XXLCON.BYTECOUNT:可以显示剩余需要发送的字节数。

4.4.7 Move Count 模式

可以传输8192个短数据帧。
使用方法:MCCON.MCEN = 1;BACON.BYTE = 0;BACON.LAST = 0;
待传输数据长度通过MC.COUNT设置(1 ~ 8191),MC. MCOUNT显示还剩传输的数据块。
在这里插入图片描述
备注:这里的两个中断是路由到User Interrupt。

4.4.8 总结

在Ifx手册中定义了非常多的模式,这些模式都是围绕BYTE、LAST、DL三个参数进行展开的,了解这些参数后,直接操作寄存器也可以完成数据发送,注意BACON配置寄存器都是只读属性的,只能通过BACON_ENTRY或MIX_ENTRY寄存器间接写入。
在这里插入图片描述
DL:数据长度,可以是bits也可以是Bytes,由BYTE位控制。当DL非 0时,组成短、短连续、长、长连续模式,等于0时,组合为XXL模式
BYTE:数据传输单位,等于0,DL表示传输多少bits,等于1,DL表示传输多少Bytes
LAST:表示当前配置是否为最后一个配置,如果是,则为配置为1,不是则配置为0。硬件会根据该配置,决定数据发送完成后,是否拉高片选,所有的模式,其实都是围绕该配置进行实现的。例如单配置多帧时,LAST固定为1,每次发送完成后,拉高片选,下次发起传输后,重新拉低片选。

调用Ifx接口,初始化完成后,直接操作寄存器实现长数据传输:

    Ifx_QSPI_BACON bcfgVal;
    Ifx_QSPI *qspiPtr;
    qspiPtr = &MODULE_QSPI2;
    printf("QSPI%d longContinue mode test\t", 0);
    bcfgVal.B.CS = 1;
    bcfgVal.B.DL = 11;
    bcfgVal.B.BYTE = 1;   /*长数据模式下BYTE = 1 */
    bcfgVal.B.MSB = 1;
    bcfgVal.B.PARTYP = 0;
    bcfgVal.B.TRAIL = 7;
    bcfgVal.B.TPRE = 0;
    bcfgVal.B.LEAD = 7;
    bcfgVal.B.LPRE = 0;
    bcfgVal.B.IDLE = 7;
    bcfgVal.B.IPRE = 0;
    bcfgVal.B.LAST = 0;    /* 先发送12byte数据,在发送last = 1命令,结束数据传输 */
    qspiPtr->MIXENTRY.U = bcfgVal.U;
    qspiPtr->MIXENTRY.U = 0xAA535251;
    qspiPtr->MIXENTRY.U = 0xAA535252;
    qspiPtr->MIXENTRY.U = 0xAA535253;
    Qspi_ldelay();
    IfxQspi_read32(qspiPtr, &g_qspi.spiBuffers.spiMasterRxBuffer[0], 3);

    bcfgVal.B.DL = 3;
    bcfgVal.B.LAST = 1;    /* 在发送last = 1命令,结束数据传输 */
    qspiPtr->MIXENTRY.U = bcfgVal.U;
    qspiPtr->MIXENTRY.U = 0xAA535254;
    Qspi_ldelay();
    IfxQspi_read32(qspiPtr, &g_qspi.spiBuffers.spiMasterRxBuffer[3], 1);

备注:由于QSPI发送数据的同时也会接收数据到Rx FIFO中,故发送数据时也要考虑将Rx FIFO数据读出,否则会造成Rx FIFO下溢。

5. Slave模式

基本功能与Master一致,在从模式下,模块简单地立即响应外部时钟沿。因此,对leading、trailing、idle延迟、占空比和采样点的设置并不关心,只关心数据长度和波特率分频设置。
注意以下几点即可:

  • 从模式下的数据长度设置限制在2 ~ 32位。BACON.BYTE将固定设置为0,Ifx驱动代码中,仅在初始化时写一次BACON,后续不在写配置
  • 移位时钟的相位和极性被固定为CPH=1和CPOL=0(根据BACON.CS选择的ECONz (z=0-7)寄存器进行配置)
  • 支持波特率错误和尖峰错误检测,在GLOBALCON.AREN = 0的情况下,忽略错误,数据正常发送,配置为1时,若出现错误,Slave发送全1,不接收后续数据。

6. Tx\Rx中断

QSPI TXFIFO与RXFIFO可以配置为单步移动、批量移动、组合移动三种不同的工作模式。

6.1 单步移动模式

目的是保持TXFIFO尽可能满,尽可能写入一个自由的元素来重新填充TXFIFO
TXFIFO中断:软件对TXFIFO写入产生中断,TXFIFO往移位配置寄存器写入数据产生
RXFIFO中断:移位寄存器(或STATUS) 将新元素写入空的RXFIFO时产生,用户通过SPB总线读取时(RXEXIT/RXEXITD)
DMA请求源:软件对TXFIFO写入(写入BACONENTRY/DATAENTRY/MIXENTRY)

6.2 批量移动模式

TXFIFO中断:当FIFO层级低于GLOBALCON1.TXFIFOINT时才产生中断,优点是减少CPU中断次数
RXFIFO中断:当填充级别上升到编程阈值时,就会产生RXFIFO中断(默认配置为0,有多少个数据,进多少次接收中断)

6.3 合并移动模式

TXFIFO中断:结合①②,低于GLOBALCON1.TXFIFOINT时才产生中断,区别是在低于该FIFO时,发送BACON/DATA时也会产生中断。
RXFIFO中断:结合①②,高于GLOBALCON1.RXFIFOINT时才产生中断,区别是在高于该FIFO时,接受到数据也会产生中断。

7. 测试记录

7.1 线模式

初始化引脚时,不配置CS引脚,参数设置为NULL_PTR,就对应三线模式。
在这里插入图片描述
在这里插入图片描述

7.2 最高波特率测试

最高波特率50Mbps,40Mbps可以逻辑分析仪可以正确解析,但50M无法解析,通过物理波形可以得知,数据传输正确。
无法解析原因:猜测是频率过高,由于线电容影响,导致数据解析异常。
注意事项:20M以上需要使用支持LVDS pad的引脚,否则引脚的物理特性会导致波特率达不到,这里使用QSPI4的P21.1作为时钟输出口
40M测试结果如下:
在这里插入图片描述
50M测试结果如下,通过轮廓可以得知数据正确:
发送4个字节的0xf0
在这里插入图片描述
发送4个字节的0x55 0xF0 0xF0 0xF0
在这里插入图片描述

8. 其他

Ifx Qspi长数据/长连续模式使用问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值