关于tresos Studio(EB)的MCAL配置之SPI

基本概念

通道:1个通道对应1个发送缓冲区和1接收缓冲区

作业:1个作业对应1次SPI通讯发送的内容,也就是SPI一次

选过程所传输的内容。一个作业至少要包含一个通道,里面的所有通道必须使用同一个片选信号,可以多个作业/通道对应同一个片选。

序列:可以把多个作业分配给一个序列,可以理解为是作业的组合。SPI通讯是基于序列触发的,即使发送1个作业也要将该作业分配给1个队列,然后通过触发序列来实现作业的传输。

Buffer<通道<作业<序列

 

channel不是通道,是缓存区,对应一个EB或者IB,到波形上就是一帧有多少位。

内部缓存是指发送/接收数据的缓存是由SPI驱动模块分配的。有的MCU的SPI控制器内部有独立缓存,因此,设计内部缓存的通道是为了利用这类MCU本身的性能;如果MCU的SPI控制器内部没有独立缓存,则使用软件模拟。

外部缓存是指发送/接收数据的缓存是由用户指定的,这也是为了复用外部缓存空间。

双时钟机制

允许在运行过程当中,可以在保持传输的基本特征(如波特率)的前提下更改时钟参考,改变频率或者功率。

限制

如果用DSPI1或者3,用了PF3端口,开了个大于60M的时钟,SpiTimeCs2Clk就不能为0。因为PAD[83]不支持pc高速运行的特性,可能会导致DSPI1或者3不能正常工作。

新配置SpiEnable32BitsDataWidthReord

允许MCAL软件在将数据推送到硬件之前交换halfwords

DMA模式下使能了该配置:MCAL软件会将输入的发送缓冲区重新排序,因此输入发送缓冲区必须位于RAM中。

DMA模式下失能了该配置:MCAL软件没有将输入的发送缓冲区重新排序,API将不得不重新排序输入的发送缓冲区,因此输入的发送缓冲区可以在ROM或者RAM。

FIFO模式下使能了该配置:MCAL软件在将数据推到硬件之前交换halfwords,输入的发送缓冲区不受重新排序的影响,可以在ROM或RAM。

FIFO模式下失能了该配置:MCAL软件没有将输入的发送缓冲区重新排序,API将不得不重新排序输入的发送缓冲区,因此输入的发送缓冲区可以在ROM或者RAM。

三个API功能等级

LEVEL 0:同步SPI驱动模块,以同步方式通信。只能处理简单的同步通信,其他函数在通信完成之前不能打断当前通信调用的函数。通常用于简单SPI总线网络中,以及与片外高速器件通信的ECU上。

LEVEL 1:异步SPI驱动模块,以异步方式通信。只能处理异步通信,通信过程调用的函数是非阻塞的,其他函数可以继续执行而无须等待通信完成。通信完成后使用通知机制告知用户,在软件上可以由中断或者轮询的方式实现。通常用于具有不同优先级的SPI总线网络中,以及与片外低速器件通信的ECU上。

LEVEL 2:增强型SPI驱动模块,以同步或异步方式通信。通常用于有多个SPI硬件单元的MCU上,MCU需要处理多个SPI任务,既包括针对不同优先级的任务,也包括针对不同速度片外器件的任务。例如,一个SPI硬件通过同步方式与片外高速器件通信,另一个SPI硬件通过异步方式与片外低速器件通信。

TSB模式

定时串行总线模式。

在TSB模式下,传输的SPI数据优先级高于DSI数据

在ITSB模式下,SPI数据和DSI数据不考虑优先级进行交错,在每次触发时,当SPI中没有帧或之前的传输是来自SPI的帧时,都会发送来自DSI的帧

配置

SpiGeneral

 

SpiCancelApi使能Spi_Cancel接口

SpiChannelBuffersAllowed允许使用的通道缓冲区类型,0只允许内部缓冲区,1只允许外部缓冲区,2都允许,一般默认选择2

SpiDevErrorDetect使能开发者错误检查

SpiHwStatusApi使能Spi_GetHWUnitStatus接口

SpiInterruptibleSeqAllowed使能中断序列处理功能

SpiLevelDelivered选择可用的扩展的SPI处理程序/驱动程序级别,0只允许简单的同步行为,1在0的基础上增加基本异步行为,2增强行为也就是允许同步和异步行为,一般默认选择2

SpiSupportConcurrentSyncTransmit不同序列的并发调用Spi_SyncTransmit是否可配置,只有这些序列不共享硬件单元的时候,才允许并发调用Spi_SyncTransmit。一般都会共享硬件单元,所以不用勾选这个。

SpiVersionInfoApi使能Spi_GetVersionInfo接口

SpiGlobalDmaEnable允许使用DMA模式,对于每一个SPI单元,可以配置传输方法为DMA或者FIFO。如果不勾选这个选项,就不允许使用DMA模式,所有SPI单元都只能使用FIFO。

SpiSyncTransmitTimeout接口SPI_SyncTransmit等待收发FIFO清空或者填完的超时值,默认50000,自己选个差不多大小的,只要不产生超时不影响其他任务执行就可以。

SpiOptimizeOneJobSequences为只有一个作业的序列开启同步传输优化,在初始化的时候,使用额外的RAM充当内部缓冲区。

SpiNonAUTOSAR

 

SpiAllowBigSizeCollections允许超过255个序列、作业和通道

SpiEnableHWUnitAsyncMode使能Spi_SetHWUnitAsyncMode接口,允许为每个硬件单元单独定义轮询或中断的操作模式。

SpiTSBModeSupport允许用户访问Micro Second总线,配置,默认勾选改不了,但也用不上。

SpiEnableDualClockMode使能Spi_SetClockMode接口,并且允许双时钟配置

SpiEnableDataCache使能在DMA模式下数据缓存映射到SPI缓冲区

SpiEnable32BitsDataWidthReord由于硬件IP问题,MCAL软件需要重新排序words,详情请看“新配置SpiEnable32BitsDataWidthReord”

SpiEndianess大小端定死了是大端,无法改变。

SpiJobStartNotificationEnable使能作业开始执行时候的通知机制

SpiForceDataType强制改变的数据类型

Spi Disable Production Error Reporting失能诊断错误报告和通知

SpiAlternateClockRef参考备用时钟

SpiDriver

General

这里的配置都是默认无法改变的,已经舍弃了这些配置

 

SpiChannel

SPI通道是用相同结构(数据结构)定义的数据的软件交换媒介。

 

SpiChannelId通道ID

SpiChannelType通道使用的缓冲区类型,要看SpiChannelBuffersAllowed的配置允许使用的缓冲区类型

SpiDataWidth数据宽度,单位为位

SpiDefaultData发送数据默认值

SpiEbMaxLength外部缓冲区最大大小,单位为位,是SpiDataWidth的倍数。例如SpiDataWidth数据宽度为6,SpiEbMaxLength外部缓冲区最大大小是2代表着2个8位的数据元素。SpiDataWidth数据宽度大于16位小于等于32位,SpiEbMaxLength外部缓冲区最大大小是2代表着2个32位的数据元素。

SpiIbNBuffers内部缓冲区最大大小,单位为位,是软件模拟的,不可配置,SpiIbLength也同理。

SpiTransferStart发送的字节序

SpiExternalDevice

这东西不是外设,是跟外部设备通讯相关的配置参数,可以对应多个作业,只能对应一个硬件单元。

 

SpiSlaveMode硬件单元是从机还是主机

SpiModifyTimingFormat使用到更高的波特率时候勾选

TSBModeEnable硬件单元使用TSB模式,需要更快的速度时候勾选

SpiBaudrate波特率

SpiCsIdentifier芯片上对应的片选引脚

SpiCsSelection当芯片选择处理被启用时,芯片选择是由外围硬件引擎自动处理CS_VIA_PERIPHERAL_ENGINE

还是通过驱动程序通过通用IO处理CS_VIA_GPIO。如果选择了CS_VIA_GPIO,需要调用SpiJobStartNotification和SpiJobEndNotification来切换片选引脚,调用DIO驱动程序。说人话就是用这两个接口来再调用下DIO接口,处理片选引脚拉高拉低。

SpiCsPolarity片选是高电平有效还是低电平有效

SpiDataShiftEdge数据位移边沿,数据是在移位时钟的前沿或后沿上移位,Leading是前沿,Trailing是后沿。选择前沿的时候,CPHA=0,在SCK的前缘捕获数据,在后沿更改数据。选择后沿的时候,CPHA=1,在SCK的前沿更改数据,在后沿捕获数据。

SpiEnableCs启用片选功能

SpiHwUnit选择硬件单元,多个外部驱动可以指向同一个硬件单元,这个硬件单元就是这里的SpiPhyUnit,需要对应起来,所以CSIBx的x就是SpiPhyUnit里面的序号。

 

SpiShiftClockIdleLevel移位时钟空闲电平,不要被这个名字骗了,跟位移没啥关系。这里配置的是时钟线空闲的时候的电平,也就是CPOL,一般都是高电平。

SpiTimeClk2Cs SPI时钟到片选之间的时间,也就是tASC( After SCK delay),单位微秒

SpiTimeCs2Clk 片选到SPI时钟之间的时间,也就是tCSC(PCS to SCK delay),单位微秒

SpiTimeCs2Cs[sec] (in TSBmode[Tsck]) 片选断言之间的时间,也就是tDT(Delay after Transfer/Minimum CS idle time),单位微秒

 

上面三个就是个延迟时间,就是上面图里面的几个时间。

很少改动,按照默认来配置就行

SpiCsContinous在帧传输之间保持芯片选择断言,这个配置很少用,默认true就行

SpiPhyUnit

物理单元

 

SpiPhyUnitMapping映射到的物理单元

SpiClockRef参考时钟

SpiPhyUnitMode主机还是从机

SpiPhyUnitSync勾选则该硬件只能用于同步传输,不勾选则只能用于异步传输。

有同学可能会对这里产生疑惑,上面的SpiGeneral里面的SpiLevelDelivered不是可以选增强,也就是同步和异步吗?为什么到通道这里就要么同步要么异步?因为SpiGeneral的同步异步是对于整个芯片的所有SPI模块来说,这里的同步异步仅针对单个的SPI模块,相当于一个是总开关,一个是分开关。

SpiPhyUnitAsyncMethod外设传输方式,DMA或者FIFO

如果选择了DMA传输方式,需要将SpiPhyTxDmaChannel和SpiPhyRxDmaChannel关联到MCU模块里面McuDmaChannelConfiguration。

 

SpiJob

作业由一个或多个具有相同芯片选择的通道组成(相同的外部设备,传输过程中不释放CS)。作业被认为是原子作业,因此不能被另一个作业中断。

 

TSBModeEnable勾选则此单元用于TSB模式,不勾选则此单元用于非TSB模式

SpiHwUnitSynchronous同步还是异步

SpiJobEndNotification作业执行结束后的回调函数

SpiJobStartNotification作业开始执行的时候的回调函数,需要勾选上SpiJobStartNotificationEnable才会启用这个回调功能

 

SpiJobId作业ID

SpiJobPriority优先级,0最低,3最高

SpiDeviceAssignment引用外设配置参数,也就是上面的SpiExternalDevice

TSBFrameSize在TSB传输下数据帧的长度

DsiCsIdentifier在DSI模式下分配给这个作业的片选符号名称

TransmitDataSource选择要序列化的数据的源寄存器(这个不太理解)

ChangeInDataTransfer允许序列化数据的改变来初始化DSI帧传输(这个不太理解)

DualReceiverSupport一种能够将在帧的第一部分期间驱动的PCS信号集切换到在帧的第二部分期间驱动的不同PCS信号集的特征(这个不太理解)

SpiChannelList

 

SpiChannelAssignment引用的通道,可以是多个,这里只需要把作业关联的通道选择进来就行。

SpiSequence

序列要传输的一系列连续作业,是作业的集合,不同的序列可以包含同一个作业

 

SpiInterruptibleSequence是否允许这个序列被另一个序列挂起

SpiSeqEndNotification序列执行完成时候的调用接口

SpiSequenceId序列ID

SpiJobAssignment引用作业

接口

Spi_AsyncTransmit使用异步的方式触发序列发送

Spi_Cancel异步取消正在执行的序列

Spi_DeInit逆初始化,同步执行

Spi_GetHWUnitStat请求外设单元的状态,有SPI_UNINIT,SPI_IDLE和SPI_BUSY

Spi_GetJobResult请求作业的状态,有SPI_JOB_OK,SPI_JOB_PENDING和SPI_JOB_FAILED

Spi_GetSequenceResult请求序列的状态有SPI_SEQ_OK,SPI_SEQ_PENDING和SPI_SEQ_FAILED

Spi_GetStatusSPI驱动程序的状态有SPI_UNINIT,SPI_IDLE和SPI_BUSY

Spi_GetVersionInfo获取版本信息

Spi_Init初始化

Spi_MainFunction_Handling处理异步轮询SPI中断,这个接口放在整个系统里面轮询

Spi_ReadIB从通道的接收缓冲区读取数据

Spi_SetAsyncMode为异步处理的SPI总线指定异步模式,可以选择SPI_POLLING_MODE或者SPI_INTERRUPT_MODE

Spi_SetupEB调用一个接口就能读和写。设置一个外部缓冲区供特定通道使用.SrcDataBufferPtr是指向存储传输数据的内存位置的指针,也就是发送数据的首地址。DesDataBufferPtr是指向存放接收数据的内存位置的指针,也就是接收数据的首地址。长度是指发送数据和接收数据的长度,所以他俩的长度要一致,这个长度根据channel里面的SpiDataWidth配置来,例如SpiDataWidth是16(位),发送数据和接收数据的长度是2字节,那这里的长度就要写1。

Spi_SyncTransmit使用同步的方式触发序列发送

Spi_WriteIB同步写入数据到通道的内部缓存区。

Spi_SetClockMode时钟模式SPI_NORMAL或者SPI_ALTERNATE

Spi_SetHWUnitAsyncMode设置硬件单元的异步模式,有SPI_POLLING_MODE或者SPI_INTERRUPT_MODE

参考操作流程

使用IB的时候,需要配置IB的长度。

使用EB的时候,需要配置EB的最大

使用IB中断异步传输

1.Spi_Init初始化

2.Spi_SetAsyncMode(SPI_INTERRUPT_MODE),下面的3-7步骤放到轮询当中。

3.Spi_WriteIB写入数据

4.Spi_SyncTransmit使用同步的方式触发序列发送和接收

5.Spi_GetSequenceResult获取序列执行结果

6.当序列结果为SPI_SEQ_OK的时候,执行自定义动作。或者在序列执行完成的回到函数里面执行。

7.Spi_ReadIB读取接收到的数据

使用EB中断异步传输

1.Spi_Init初始化

2.Spi_SetAsyncMode(SPI_INTERRUPT_MODE),下面的3-6步骤放到轮询当中。

3.Spi_SetupEB写入数据并且指定接收缓存区

4.Spi_SyncTransmit使用同步的方式触发序列发送和接收

5.Spi_GetSequenceResult获取序列执行结果

6.当序列结果为SPI_SEQ_OK的时候,执行自定义动作,这时候接收缓存区的数据已经更新。或者在序列执行完成的回到函数里面执行。

使用IB轮询异步传输

1.Spi_Init初始化

2.Spi_SetAsyncMode(SPI_POLLING_MODE),下面的3-7步骤放到轮询当中。

3.Spi_WriteIB写入数据

4.Spi_AsyncTransmit使用异步的方式触发序列发送和接收

5.Spi_GetSequenceResult获取序列执行结果

6.当序列结果为SPI_SEQ_OK的时候,执行自定义动作。或者在序列执行完成的回到函数里面执行。

7.Spi_ReadIB读取接收到的数据

使用EB轮询异步传输

1.Spi_Init初始化

2.Spi_SetAsyncMode(SPI_POLLING_MODE),下面的3-6步骤放到轮询当中。

3.Spi_SetupEB写入数据并且指定接收缓存区

4.Spi_SyncTransmit使用同步的方式触发序列发送和接收

5.Spi_GetSequenceResult获取序列执行结果

6.当序列结果为SPI_SEQ_OK的时候,执行自定义动作,这时候接收缓存区的数据已经更新。或者在序列执行完成的回到函数里面执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不吃鱼的羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值