文章目录
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