英飞凌 AURIX-TC3XX:QSPI通信实验

英飞凌 AURIX-TC3XX:QSPI通信实验_第1张图片

目录

  • AURIX-TC3XX-QSPI通信实验
    • 1.QSP简介
      • 1.1、AURIX TC3XX QSPI个数
      • 1.2、QSPI功能特点
        • 1.2.1、QSPI外设的新特性
        • 1.2.2、一些独特的特性
        • 1.2.3、支持传统的SPI特性
        • 1.2.4、四种可供用户选择的传输模式
    • 2、具体实验操作
      • 2.1、新建工程
      • 2.2、实验一
    • 3、域控制器中常见的SPI通信方式
      • 3.1、MCU-SOC之间的主从SPI通信交互

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队列。

②.自动硬件控制的信号正时

外设选择信号的激活;

外设可选择leadingtrailingidle延迟时间。

③.支持高速的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寄存器中配置数据的数据信息,此时BACONBYTE设置为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、新建工程

英飞凌 AURIX-TC3XX:QSPI通信实验_第2张图片
英飞凌 AURIX-TC3XX:QSPI通信实验_第3张图片
英飞凌 AURIX-TC3XX:QSPI通信实验_第4张图片
英飞凌 AURIX-TC3XX:QSPI通信实验_第5张图片

新建工程后,编译工程

英飞凌 AURIX-TC3XX:QSPI通信实验_第6张图片

编译通过

英飞凌 AURIX-TC3XX:QSPI通信实验_第7张图片

新建SPI.c和SPI.h
英飞凌 AURIX-TC3XX:QSPI通信实验_第8张图片
英飞凌 AURIX-TC3XX:QSPI通信实验_第9张图片
英飞凌 AURIX-TC3XX:QSPI通信实验_第10张图片

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引脚,会得到如下波形图

英飞凌 AURIX-TC3XX:QSPI通信实验_第11张图片

对波形进行分析可得,字符为:'E'和 'T'

英飞凌 AURIX-TC3XX:QSPI通信实验_第12张图片

15.415.5连接后,可以得到缓冲区g_spiTxBuffer和缓冲区g_spiRxBuffer的内容一致。

3、域控制器中常见的SPI通信方式

3.1、MCU-SOC之间的主从SPI通信交互

具体使用案例分析

英飞凌 AURIX-TC3XX:QSPI通信实验_第13张图片

英飞凌 AURIX-TC3XX:QSPI通信实验_第14张图片

硬件连接电路

英飞凌 AURIX-TC3XX:QSPI通信实验_第15张图片

主设备为MCU,从设备为SOCGPIO1MCU输出引脚,与片选信号CS连接–从设备输入引脚;GPIO2为从设备输出引脚。GPIO1的作用是:告诉从设备,主设备接收数据已经完成;GPIO2的作用是,向主设备发起信号传输请求,发送一个中断信号。

MCUSOC SPI通信的流控方法:

  • ①、主设备(MCU)和从设备(SOC)之间通过通信信道进行数据传输;

  • ②、当从设备(MCU)向主设备(SOC)发送数据时,将GPIO2引脚设置为第一状态(第一状态指的是GPIO2从高电平变为低电平再变为高电平的过程);向主设备(MCU)发送中断信号;

  • ③、主设备(MCU)接收到中断信号后发起传输,接收来自从设备(SOC)的数据。如果主设备(MCU)没有发起传输,从设备会(SOC)一直阻塞。

  • ④、当从设备(MCU)检测到第一GPIO引脚从高电平变为低电平时,判断数据帧传输完成。

你可能感兴趣的:(自动驾驶嵌入式工程师修炼秘籍,#,单片机,英飞凌,自动驾驶,嵌入式,AURIX)