目录
AURIX-TC3XX-QSPI通信实验
1.QSP简介
1.1、AURIX TC3XX QSPI个数
AURIX 型号 | QSPI 个数 |
---|---|
TC377 | 5个 QSPI 最高速度达50 Mbit/s |
TC387 | 5个 QSPI 最高速度达50 Mbit/s |
TC397 | 6个 QSPI 最高速度达50 Mbit/s |
1.2、QSPI功能特点
1.2.1、QSPI外设的新特性
①.支持队列模式;
能处理控制信息和传输数据;
可以通过
DMA
机制来进行数据的有限搬运;在与外设进行缓冲搬移时采用四级的小
FIFIO
队列。
②.自动硬件控制的信号正时
外设选择信号的激活;
外设可选择
leading
、trailing
和idle
延迟时间。
③.支持高速的SPI
通信
速率最高可达
50Mbit/s
;对于每个
bit
来说支持可编程的时间量子;当
FIFO
满时会产出Overrun
保护。
1.2.2、一些独特的特性
①.对于长的数据流,数据长度可以配置成以
byte
传输(代替bits创新)。2②.每个
SPI
通道最多支持16
个外设信号;③.支持硬件的奇偶校验;
④.支持
LOOP BACK
模式;
1.2.3、支持传统的SPI特性
①.可编程的数据长度为
2~32bit
(或bytes)。②.传输方向:高位优先或者低位优先。
③.时钟的极性:
ldel
状态下有些器件是高电平,有些是低电平,通过clock
极性来选择是高电平还是低电平。④.时钟的相位:
SPI
时钟是否需要根据外设进行延迟。⑤.在
FIFO
时间和相位跳变时产生中断。
1.2.4、四种可供用户选择的传输模式
①.端数据模式
在端数据模式下,传输帧的长度为
2~32bits
。在一个32
位的BACON
寄存器中配置数据的数据信息,此时BACON
。BYTE
设置为0,数据长度以bits
为单位;BACON.LST
设置为1,表示传输的数据是传输帧的最后数据。
②.长数据模式
在长数据模式下,传输帧的长度为
2~32bits
。在一个32位的BACON
寄存器中配置数据的数据信息,此时BACON
。BYTE设置为1,数据长度以bytes
为单位;BACON.LAST
设置为1,表示传输的数据是传输帧的最后数据。如果传输数据的尺寸小于32位,需要用0进行填充补齐。
③.连续数据模式
在连续数据模式下,传输帧的长度为任意的数据长度。改模式既可与短数据模式结合使用,也可与长数据模式结合使用。在对
BACON
寄存器进行配置时,对于传输帧的起始数据BACON.LAST
设置为0,使得外设在接收完该部分数据后仍然保持为接收状态;对于一帧的结束数据,BACON.LAST
需要设置为1,表示该部分数据为一帧的最后数据,当接收完该部分数据后外设将被设置为不接受状态。
④.单配置-多帧模式
在单配置-多帧模式下,仅需要一次配置就可以给外设发送多帧数据,不需要在发送每帧数据的时候都配置一次,但该模式下发送数据帧的大小必须小于16bits。
该模式也可以用来传输在一个32位的
BACON
寄存器中配置数据的数据信息,此时BACON.BYTE
设置为1,数据长度以bytes为单位;BACON.LAST
设置为1,表示传输的数据是传输帧的最后数据。如果传输数据的尺寸小于32位,需要用0进行填充补齐。
2、具体实验操作
实验一:通过ASCLIN
模块进行的SPI
主通信,配置为SPI
主节点的ASCLIN
模块发送一个两个字节的消息。
实验二:通过SPI
采集IMU
数据。
2.1、新建工程
新建工程后,编译工程
编译通过
新建SPI.c和SPI.h
2.2、实验一
注:SPI
配置中的ASCLIN
模块只能支持四线或三线(无从选择输出信号),最多16位数据宽度。
ASCLIN模块的配置:
用于
SPI
通信的ASCLIN
模块的配置是在设置阶段通过初始化IfxAsclin_Spi_Config
结构的一个实例来完成的:baudrate–SPI通信波特率
interrupt–中断配置:传输和接收中断优先级(tx优先级、rx优先级);
服务类型——定义了哪个服务提供商负责处理中断,该中断可以是任何可用的cpu,或DMA
pins–设置用于通信的GPIO端口引脚的结构。
函数IfxAsclin_Spi_initModuleConfig()
用默认值填充配置结构,而IfxAsclin_Spi_initModule()
用用户配置初始化模块。
以上所有的函数都可以在iLLD
报头IfxAsclin_Spi.h
中找到。
SPI消息交换功能:
数据输出
(MTSR/MOSI)
通过内部环回连接到数据输入(MRST/MISO)
。这两个字节的消息通过函数
exchange_ASCLIN_SPI_message()
发送,该函数在ASCLIN
模块初始化后被调用一次。这两个字节的消息使用
IfxAsclin_Spi.h
头文件中的函数IfxAsclin_Spi_exchange()
从g_spiTxBuffer
发送到g_spiRxBuffer
。
具体实现
Cpu0_Main.c
#include "Ifx_Types.h"
#include "IfxCpu.h"
#include "IfxScuWdt.h"
#include "ASCLIN_SPI.h"
IFX_ALIGN(4) IfxCpu_syncEvent g_cpuSyncEvent = 0;
void core0_main(void)
{
IfxCpu_enableInterrupts();
/* !!WATCHDOG0 AND SAFETY WATCHDOG ARE DISABLED HERE!!
* Enable the watchdogs and service them periodically if it is required
*/
IfxScuWdt_disableCpuWatchdog(IfxScuWdt_getCpuWatchdogPassword());
IfxScuWdt_disableSafetyWatchdog(IfxScuWdt_getSafetyWatchdogPassword());
/* Wait for CPU sync event */
IfxCpu_emitEvent(&g_cpuSyncEvent);
IfxCpu_waitEvent(&g_cpuSyncEvent, 1);
/* 对SPI进行初始化 */
init_ASCLIN_SPI_master();
/* 开启数据交换 */
exchange_ASCLIN_SPI_message();
while(1)
{
}
}
ASCLIN_SPI.c
/*
* ASCLIN_SPI.c
*
* Created on: 2023年4月7日
* Author: kevin
*/
#include "IfxAsclin_Spi.h"
#define SPI_BUFFER_SIZE 2 /* Size of the SPI buffer in bytes */
#define BAUDRATE 115200 /* Define baud rate in bit/s */
#define PRESCALER 1 /* Define prescaler */
#define IFX_INTPRIO_ASCLIN1_TX 1 /* Define TX interrupt priority */
#define IFX_INTPRIO_ASCLIN1_RX 2 /* Define RX interrupt priority */
#define CLOCK_PIN IfxAsclin1_SCLK_P20_10_OUT /* Define Clock port pin */
#define MTSR_PIN IfxAsclin1_TX_P15_4_OUT /* Define MTSR port pin */
#define MRST_PIN IfxAsclin1_RXB_P15_5_IN /* Define MRST port pin */
IfxAsclin_Spi g_spiHandle;
uint8 g_spiTxBuffer[] = {'E', 'T'};
uint8 g_spiRxBuffer[SPI_BUFFER_SIZE];
/* Add SPI Interrupt Service Routines */
IFX_INTERRUPT(asclin1TxISR, 0, IFX_INTPRIO_ASCLIN1_TX);
/* Transmit interrupt function */
void asclin1TxISR(void)
{
IfxAsclin_Spi_isrTransmit(&g_spiHandle);
}
void init_ASCLIN_SPI_master(void)
{
/* Initialize one instance of IfxAsclin_Spi_Config with default values */
IfxAsclin_Spi_Config spiMasterConfig;
IfxAsclin_Spi_initModuleConfig(&spiMasterConfig, &MODULE_ASCLIN1);
/* Set the desired baud rate */
spiMasterConfig.baudrate.prescaler = PRESCALER;
spiMasterConfig.baudrate.baudrate = BAUDRATE;
/* ISR priorities and service provider */
spiMasterConfig.interrupt.txPriority = IFX_INTPRIO_ASCLIN1_TX;
spiMasterConfig.interrupt.rxPriority = IFX_INTPRIO_ASCLIN1_RX;
spiMasterConfig.interrupt.typeOfService = IfxSrc_Tos_cpu0;
/* Pin configuration */
const IfxAsclin_Spi_Pins pins =
{
&CLOCK_PIN, IfxPort_OutputMode_pushPull, /* Clock output port pin (CLK) */
&MRST_PIN, IfxPort_InputMode_pullUp, /* MRST port pin (MISO) */
&MTSR_PIN, IfxPort_OutputMode_pushPull, /* MTSR port pin (MOSI) */
IfxPort_PadDriver_cmosAutomotiveSpeed1
};
spiMasterConfig.pins = &pins;
/* Initialize module with the above parameters */
IfxAsclin_Spi_initModule(&g_spiHandle, &spiMasterConfig);
}
/* This function exchanges a two bytes message */
void exchange_ASCLIN_SPI_message(void)
{
/* Exchange the two bytes message */
IfxAsclin_Spi_exchange(&g_spiHandle, g_spiTxBuffer, g_spiRxBuffer, SPI_BUFFER_SIZE);
}
ASCLIN_SPI.h
/*
* ASCLIN_SPI.h
*
* Created on: 2023年4月7日
* Author: kevin
*/
#ifndef ASCLIN_SPI_H_
#define ASCLIN_SPI_H_
void init_ASCLIN_SPI_master(void);
void exchange_ASCLIN_SPI_message(void);
#endif /* ASCLIN_SPI_H_ */
使用示波器测试P15.4
引脚,会得到如下波形图
对波形进行分析可得,字符为:'E'和 'T'
。
将15.4
和15.5
连接后,可以得到缓冲区g_spiTxBuffer
和缓冲区g_spiRxBuffer
的内容一致。
3、域控制器中常见的SPI通信方式
3.1、MCU-SOC之间的主从SPI通信交互
具体使用案例分析
硬件连接电路
主设备为MCU
,从设备为SOC
,GPIO1
为MCU
输出引脚,与片选信号CS
连接–从设备输入引脚;GPIO2
为从设备输出引脚。GPIO1
的作用是:告诉从设备,主设备接收数据已经完成;GPIO2
的作用是,向主设备发起信号传输请求,发送一个中断信号。
MCU
和SOC
SPI通信的流控方法:
-
①、主设备(
MCU
)和从设备(SOC
)之间通过通信信道进行数据传输; -
②、当从设备(
MCU
)向主设备(SOC
)发送数据时,将GPIO2
引脚设置为第一状态(第一状态指的是GPIO2
从高电平变为低电平再变为高电平的过程);向主设备(MCU
)发送中断信号; -
③、主设备(
MCU
)接收到中断信号后发起传输,接收来自从设备(SOC
)的数据。如果主设备(MCU
)没有发起传输,从设备会(SOC
)一直阻塞。 -
④、当从设备(
MCU
)检测到第一GPIO
引脚从高电平变为低电平时,判断数据帧传输完成。