
AUTOSAR-MCAL--SPI模块详解(一)
前言
MCAL处于AUTOSAR架构的最底层,和具体的芯片强绑定,且不同的芯片使用不同的MCAL配置工具,例如英飞凌芯片系列使用EB配置MCAL,瑞萨芯片系列使用Davince配置MCAL。所以,除了AUTOSAR标准定义好的配置项及标准接口外,不同厂商的MCAL还会有独立于MCAL标准之外的配置,所以MCAL的学习最好是结合具体的工具和芯片来学习。本系列MCAL分享,将基于瑞萨RH850芯片使用Davince配置工具来讲解。
基于RH850芯片的MCAL详解--MCAL简介及PWM模块详解
车载外设控制芯片(TLE92108,L9369,9301等高低边驱动)基本都是使用SPI通信,。本文为SPI(Serial Peripheral Interface)模块详解篇第一部分,SPI通信协议介绍及AUTOSAR架构下SPI模块介绍。
1.Specification of SPI Handler / Driver 4.3.1
https://www.autosar.org/nc/document-search/
2. RH850/U2A-EVA GroupUser’s Manual: Hardware
正文
1.SPI通信协议介绍
SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。具体可以参考下面这篇文章:
https://mp.weixin.qq.com/s/bvRmmzF55LoqMSGZPDw-kg
2.AUTOSAR架构下的SPI模块
2.1 SPI模块介绍
SPI处理程序/驱动程序提供了从设备上读取和写入通过SPI总线连接的设备的服务。它为多个用户(例如,EEPROM、看门狗、I/OASIC)提供了对SPI通信的访问。它还提供了配置芯片SPI外设所需的机制。位于微控制器抽象层(MCAL)中。
AUTOSAR架构下的SPI模块的主要目标是充分利用每个微控制器的最佳特性,并允许根据静态配置进行实现优化,以尽可能多地适应ECU的需求。通过可选择的功能级别和可配置的特性,以允许设计一个利用微控制器特性的高可伸缩的模块。
要配置SPI处理程序/驱动程序,应遵循以下步骤:
. 应选择SPI处理程序/驱动程序功能级别,并配置可选功能
. SPI通道(Channel)应根据数据使用情况进行定义,它们可在SPI处理程序/驱动程序(IB)内进行缓冲,或由用户(EB)提供。
. SPI作业(Job)应根据HW属性(CS)进行定义,它们将包含使用这些属性的通道列表。
. 作为最后一步,应定义作业的顺序(Sequences),以便以一种排序的方式(优先级排序)传输数据。
根据所选择的功能级别,SPI处理程序/驱动程序的一般行为可以是异步的或同步的。
SPI模块涵盖了在一个单一模块中组合的Handler/Driver功能。一个是SPI处理(Handing)部分,它处理对可能位于ECU抽象层中的总线的多次访问。另一部分是SPI驱动(Driver),它直接访问可以位于微控制器抽象层中的微控制器硬件。
2.2 关键概念理解
1个Channel对应1个发送缓冲区和1接收缓冲区;1个Job对应着1次SPI通讯发送的内容(既SPI一次片选过程所传输的内容)。1个Sequence 对应着1个SPI通讯序列(job序列)。多个Job可以分配给一个Sequence。SPI通讯是基于Sequence触发的,即使发送1个Job也要将该Job分配给1个队列,然后通过触发Sequence来实现Job的传输。
EB: 外部缓冲通道。包含要传输的数据的缓冲区在SPI处理程序/驱动程序之外。
IB: 内部缓冲通道。包含要传输的数据的缓冲区位于SPI处理程序/驱动程序中。一般都是配置为Internally Buffer。
2.3SPI模块详细设计
2.3.1 SPI可扩展功能
AUTOSAR架构设计者基于以前的规范经验,总结设计了一个可伸缩性的SPI处理程序/驱动程序模块,同时也是一个适合增强需求的智能软件模块。
SPI处理程序/驱动程序指定了以下3级可扩展功能:
. LEVEL 0, Simple Synchronous SPI Handler/Driver:通信是基于与FIFO策略的同步处理来处理多次访问。缓冲区使用可配置,以优化和/或利用HW功能。
. LEVEL 1, Basic Asynchronous SPI Handler/Driver:该通信基于异步行为,并具有优先级策略来处理多次访问。缓冲区的使用是可配置为“简单同步”级别的。
. LEVEL 2, Enhanced (Synchronous/Asynchronous) SPI Handler/Driver: 该通信基于异步行为或同步处理,使用在执行期间可选择的中断或轮询机制,并使用优先级策略来处理多次访问。与其他级别一样配置。
SPI处理程序/驱动程序的可伸缩功能级别应始终是可静态配置的,即在预编译时进行配置,以允许最佳的源代码优化。
SpiLevelDelivered参数用来配置可扩展功能等级。
2.3.2 SPI Channel Job Sequence
1个Channel对应1个发送缓冲区和1接收缓冲区;1个Job对应着1次SPI通讯发送的内容(既SPI一次片选过程所传输的内容)。1个Sequence 对应着1个SPI通讯序列(job序列)。多个Job可以分配给一个Sequence。SPI通讯是基于Sequence触发的,即使发送1个Job也要将该Job分配给1个队列,然后通过触发Sequence来实现Job的传输。
配置SPI,最主要的就是根据实际需求定义Channel Job Sequence。一个Job对应一个CS片选,多个Job可以对应同一个片选。Channel可以理解为两个主从SPI设备间的协议数据帧,每个Channel都有公共的属性(Data Width Channel ID),而这个IB/EB(缓存)里面的内容就是两个SPI设备交互的协议数据,每个Channel都绑定到一个Job上。Sequence就是几个相同内容的Job的组合。
2.2.3 通道缓存功能
为了允许利用所有微控制器的能力,但也允许从专用存储器位置发送/接收数据,所有级别都具有关于通道缓冲区位置的可选特性。
有两种通道缓存(Channel buffer)可以配置:
.Internally buffered Channels (IB):用于传输/接收数据的缓冲区由处理程序/驱动程序提供。
.Externally buffered Channels (EB): 要传输/接收的缓冲区由用户提供(静态和/或动态)。
通过SpiChannelBuffersAllowed参数可以配置只使用IB、只使用EB、同时使用IB和EB。
内部缓冲通道的目的是利用微控制器,包括这一特性的硬件(硬件寄存器缓存数据)。否则,该特性应该由软件进行模拟。
对于IB通道,处理程序/驱动程序应提供缓冲区,但它不能在传输期间考虑缓冲区中数据的一致性。通道缓冲区的大小是固定的。
外部缓冲区通道的目的是重用位于外部的现有缓冲区。这意味着SPI处理程序/驱动程序不监视它们。
2.2.4 同步和异步调用
AUTOSAR 为SPI 提供了两种方式通信的接口:
同步调用
异步调用
同步调用,是需要等待返回调用结果,而异步调用这是发起任务,一般可以通过回调函数来告知调用结果。
对于同步调用接口 Spi_SyncTransmit() Sequence状态的切换都是在接口函数中完成的。开始将Sequence 状态置为PENDING,Sequence处理完成 立即置为OK。
对于异步接口Spi_AsyncTransmit(),会把Sequence中的Job按照顺序加载到Job的调度表中,同时将Sequence的状态置为PENDING。由Spi_ScheduleJob函数通过DMA加载到硬件。从机返回数据通过DMA加载到对应的Channel的DestBuf中,此时Sequence并没有置为OK,而是通过Spi_Dspi_IsrDmaRx 函数去查询DMA是否传输完成,然后在重新将Sequence的状态置为OK。
这里有两种方式来调用Spi_Dspi_IsrDmaRx()。一种是在SPI的Rx中断中,一种是在MainFunction中。因此只要使用异步调用接口就没有办法直接通过接口返回值来判断数据是否发生完成,也无法判断Slave是否有返回数据。
这里有三种方式来解决这个问题。
. 将同步调用接口增加Sequence等待检查,抽象成同步方式;即等待中断服务函数将Sequence的状态切换为OK。
. 调用异步接口之后不管,在下一次发送相同Sequence时检查Sequence的状态,如果是非OK 就调用Spi_Cancel 函数取消上次Sequence的发送。
. 使能DMA Rx的Notificaion 功能,通过Call Back函数来告知调用方已经完成传输
一般使用第二种办法。第三种方式使用于大量数据传输,菊花链的数据量并不是很大。
2.4SPI模块重要数据类型
2.4.1 Spi_ConfigType
Channel配置包含:
.的使用情况
. 传输位宽 (1~32bits)
. 传输数据个数
. 传输字节序LSB/MSB
. 传输的默认值
Job配置包含:
. 使用哪个SPI硬件实例
. 使用该实例的哪个片选引脚cs
. 片选功能是否启用
. 片选高/低有效
. 波特率
. clock 和 chip select之间的时间
. 时钟在空闲时是高/低
. 数据传输在上升沿/下降沿
. 优先级(低0~3高)
. Job完成的通知函数
. MCU相关的属性(可选)
. Channels(至少1个)
sequence配置包含:
. Jobs (至少1个)
. 在每个Job完成后是否产生中断
. Sequence完成的通知函数
2.4.2 Spi_StatusType
此类型定义了SPI处理程序/驱动程序的特定状态范围。
类型Spi_StatusType为SPI处理程序/驱动程序定义了一个特定的状态范围。通过Spi_GetStatus可以获知SPI处理程序/驱动程序状态或指定的SPI硬件微控制器外设SPI通信状态。
2.4.3 Spi_JobResultType
类型Spi_JobResultType为SPI处理程序/驱动程序定义了一系列特定的Job状态。
它通知的类型Spi_JobResultType关于SPI处理程序/驱动程序作业状态,可以用作业ID调用API服务Spi_GetJobResult。
2.4.4 Spi_SeqResultType
该类型的Spi_SeqResultType为SPI处理程序/驱动程序定义了一系列特定的序列状态,并可以通过调用API服务Spi_GetSequenceResult来获得。
2.4.5 Spi_AsyncModeType
类型Spi_AsyncModeType指定了在级别2中以异步方式处理并由Spi_SetAsyncMode获得的SPI总线的异步机制模式。
2.5SPI重要API
2.5.1 Spi_Init
void Spi_Init( const Spi_ConfigType* ConfigPtr )
. 初始化所有ConfigPtr相关寄存器
. 定义ConfigPtr相关的默认值
. 设置SPI状态为“IDLE”,job、sequence的状态设为“ok”
. 对于Level2,异步模式设为polling,禁用spi相关中断
2.5.2 Spi_DeInit
Std_ReturnType Spi_DeInit( void )
. 如果驱动状态不是BUSY,将spi外设置为复位上电后的状态
. 如果驱动状态是BUSY,请求被拒绝
. 去初始化后,模块的状态是UINIT
2.5.3 Spi_WriteIB
Std_ReturnType Spi_WriteIB( Spi_ChannelType Channel, const Spi_DataBufferType* DataBufferPtr )
. 返回值:E_OK:该命令被接受,E_NOT_OK:该命令被拒绝。
. 将入参数据写入对应channel的内部缓存
. 如果入参DataBufferPtr为NULL,将传输默认值
2.5.4 Spi_AsyncTransmit
Std_ReturnType Spi_AsyncTransmit(Spi_SequenceType Sequence)
. 返回值:E_OK:该命令被接受,E_NOT_OK:该命令被拒绝。
. 在SPI总线上传输数据
. 驱动状态设为“BUSY”,Sequence状态设为“PENDING”后函数返回
. Job状态设为SPI_JOB_QUEUED
2.5.5 Spi_ReadIB
Std_ReturnType Spi_ReadIB( Spi_ChannelType Channel, Spi_DataBufferType* DataBufferPointer )
. 返回值:E_OK:该命令被接受,E_NOT_OK:该命令被拒绝。
. 同步读取一条或多条数据
. 应该在Transmit后调用,以获取相关数据
2.5.6 Spi_SyncTransmit
Std_ReturnType Spi_SyncTransmit( Spi_SequenceType Sequence )
. 返回值:E_OK:该命令被接受,E_NOT_OK:该命令被拒绝。
. 在SPI总线上传输数据
. 驱动状态设为“BUSY”
. Sequence、Job状态设为“PENDING”
. 此时如果有其他Sequence正在传输,应该返回 E_NOT_OK,并上报错误。
2.5.7 Spi_GetStatus
Spi_StatusType Spi_GetStatus( void )
. 获取驱动状态
2.6小结
本节为AUTOSAR架构下的SPI概念的理解和梳理,着重应理解Channel,Job,Sequence的概念。SPI模块是MCAL配置的难点和重点,几乎所有的笔记复杂的CDD都是通过SPI来通信的。而不同的外设,我们就需要更具外设芯片手册来配置MCU端SPI模块,除了AUTOSA架构下的哪些SPI参数的配置,还会涉及到时序的控制,独立于AUTOSAR架构之外的芯片特有的参数的配置。这些才是重点和难点。后面基于RH850芯片及L9301底边驱动的SPI模块将详细介绍SPI的实际配置,请关注本公众号后续的文章。
文章转载自公众号:汽车电子嵌入式
