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,就对应三线模式。
该模式下,从机在时钟上升沿时发送数据,下降沿时接收数据,接收数据个数到达BACON.DL后,停止收发数据,若还收到数据(CLK还有脉冲),则产生波特率错误
在这里插入图片描述
在这里插入图片描述

7.2 最高波特率测试

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

7.3 高阻态

在时序图中,高电平在上,低电平在下,高阻态在中间。
在这里插入图片描述
所以,Ifx的MRST引脚在片选无效时,该总线状态为高阻态。
在这里插入图片描述

7.4 片选

QSPI输出片选有两种模式(GLOBALCON.DEL0控制),正常模式(DEL0 =0),外部扩展模式(DEL0=1),正常模式下,主机片选通过SLSO0…15输出,扩展模式下,只输出SLSO0…4,其中SLSO1…4输出到外部的数据分配器(4转16),SLSO0输出一个同步信号,选中片选。
注意这里SLSO1…4也可以不接数据分配器,直接接四个不同的从机,并且可以同时选中,达到广播的目的。
外部扩展框图如下:
在这里插入图片描述

7.5 采样点与占空比

Ifx支持对时钟信号的占空比和采样点进行控制(普通SPI,50%占空比,边沿进行采样),在时钟不对称和环路延时场景下可以提高传输波特率(来源Ifx手册,具体如何提高TBD)。
采样点:B和C之间
在这里插入图片描述
占空比:A/(A+B+C) or(B+C)/(A+B+C)
在这里插入图片描述

7.6 ABC参数最大、最小为多少?

最小:B\C同时为0时,硬件会把C设置为1,A至少也为1(若A为0,时钟就没有高低电平了)
注意(Qz+1)(A+1+B+C)最小值为4,通过软件去限制,寄存器处未写明相关的要求。
在这里插入图片描述
在这里插入图片描述
最大值:根据寄存器配置,最大ABC可以取到10,但是Ifx自己的这套算法,如果取到9、10,A计算出来是4,超过了对应位域
在这里插入图片描述
注意:TC3xx转int时,是向下取整。

7.7 单配置多帧模式

①单配置模式下什么时候数据传输完毕?不需要发送结束位么
经测试,不需要
②MIXENTRY寄存器是32bit的,这个模式下,高16bit会发送出去么
不会,会通过DL的配置去限制
③如何切换到其他模式
答:单配置多帧模式下,传输过程中可以接收其他配置,如果无效配置,则中止后续数据发送,若配置有效;按照最新的配置进行发送,无论该配置对应是长连续模式,还是短数据模式

7.7.1 正常使用场景 - last = 1

每发送完一个数据块后,CS会拉起,下一个数据块写入后,正常拉低片选传输,与Ifx框图保持一致。
在这里插入图片描述

7.7.2 正常使用场景 - last = 0

相当于使用MIXENTRY实现短连续模式的功能,注意连续短模式下是使用BACON+DATAENTRY实现的,是不支持MIXENTRY的。
由于未发last = 1,所以最终片选未拉低,并出现超时错误。
在这里插入图片描述

7.7.3 单配置多帧 + 短连续(未发last = 1)

未发last = 1,所以最终片选未拉低,并出现超时错误(正常现象)
在这里插入图片描述

7.7.4 单配置多帧 + 短连续(发last = 1)

在这里插入图片描述

7.7.5 单配置多帧 + 长连续模式

在这里插入图片描述

7.7.6 单配置多帧 + 无效的配置

无效配置写入BACON寄存器,后续数据无法发送。
在这里插入图片描述

7.7.7 收发8*15bit数据测试

数据DL设置为14,(传输15bit)这里是传输的是bit0~bit14(发送buffer中bit15未发出,所以从机收到的是0x7fxf)
在这里插入图片描述

7.8 channelBasedCs功能测试

1、短连续模式下,不使用DMA的情况下,存在写两次BACON的情况,但是对结果无影响
备注:这里写的第一次属于短连续模式的接口,但是由于后面的逻辑未处理,所以导致写了两次。
2、短连续模式下,只有在首尾的时候才写BACON,中间是没有写配置的,所以中间的数据块是沿用了上一次的配置,这里分两种情况,根据第一次LAST写的不同值区分

  • LAST = 0:QSPI硬件认为后面的数据块不是最后一个,所以发送完毕后,不会拉高片选(CS中间不会出现尖峰)
  • LAST = 1:QSPI硬件认为后面的数据块不最后一个,所以每发完一个数据,都会拉高片选,直到所有的数据发送完毕。

8. 其他

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

03-10
### QSPI 接口原理 QSPIQueued SPI 的缩写,由 Motorola 公司推出,在标准 SPI 协议基础上进行了功能增强,加入了队列传输机制,形成了队列串行外围接口协议 (QSPI 协议)[^1]。这种改进使得数据可以在多个设备之间更高效地传递。 #### 队列传输机制 QSPI 不仅继承了传统 SPI 的优点——简单性和灵活性,还引入了一个重要的特性:队列传输机制。这意味着可以预先配置一系列读/写操作并将其放入发送队列中执行,从而减少了 CPU 干预次数,提高了效率和吞吐量。 #### 连接方式和支持的存储器类型 该接口专门用于连接单一、双重或四重(多条数据线)SPI Flash 存储器件。它支持多种工作模式,包括单线全双工、二线半双工以及四线全双工等不同类型的通信模式,这取决于具体应用场景的需求。 ```c #define QSPI_FLASH_BASE_ADDR 0x90000000UL // 定义QSPI Flash基地址 #define QSPI_CLK_PIN GPIO_PIN_2 // 设置QSPI时钟引脚编号 // 更多关于硬件连接定义... ``` 这段代码展示了如何利用宏定义来简化与特定型号Flash芯片之间的交互过程,同时也体现了对于不同类型外设的支持能力[^2]。 ### 应用场景 由于其高效的性能表现及广泛的兼容性,QSPI 已经成为许多嵌入式系统中的首选解决方案之一: - **高速数据交换**:适用于需要频繁访问外部非易失性内存的应用场合; - **低功耗设计**:特别适合电池供电的产品,因为能够在保持良好速度的同时降低能耗; - **紧凑型产品开发**:有助于减少 PCB 板面积占用率,提高空间利用率; 综上所述,QSPI 提供了一种强大而灵活的方法来进行快速可靠的闪存编程和读取操作,尤其在现代微控制器平台上的应用日益增多。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值