Autosar MCAL-SPI配置及使用

news2024/11/25 15:57:42

文章目录

  • 前言
  • SPI协议基础
  • Autosar SPI
    • 专有名词
    • SpiDriver
      • SpiChannel
        • SpiChannelId
        • SpiChannelType
        • SpiDataWidth
        • SpiDefaultData
        • SpiEbMaxLength
        • SpiIbNBuffers
        • SpiTransferStart
      • SpiExternalDevice
        • SpiBaudrate
        • SpiAutoCalcBaudParams
        • SpiCsIdentifier
        • SpiCsPolarity
        • SpiCsSelection
        • SpiDataShiftEdge
        • SpiEnableCs
        • SpiIdleTime
        • SpiParitySupport
        • SpiShiftClockIdleLevel
        • SpiTimeClk2Cs
        • SpiTrailingTime
        • SpiHwUnit
      • SpiJob
        • SpiJobEndNotification
        • SpiJobId
        • SpiJobPriority
        • SpiDeviceAssignment
        • SpiHwUnitSynchronous
        • SpiChannelList
      • SpiSequence
        • SpiInterruptibleSequence
        • SpiSeqEndNotification
        • SpiSequenceId
        • SpiJobAssignment
      • SpiGeneral
        • SpiAsyncParallelTransmit
        • SpiBaudrateConfigAtRuntime
        • SpiCancelApi
        • SpiChannelBuffersAllowed
        • SpiHwStatusApi
        • SpiInterruptibleSeqAllowed
        • SpiLevelDelivered
        • SpiMaxJobTriggerQueueLength
      • SpiHwConfiguration
    • SPI使用
  • 总结

前言

在Autosar标准中,SPI做为标准的通信模块,在与外设进行通讯时,经常会使用到。本文首先简单介绍SPI协议,然后详细介绍SPI在Autosar配置软件中的配置及使用。对应单片机为TC27x

SPI协议基础

网上关于SPI协议介绍有很多,具体可以自行查阅。
常用SPI通信一般由四根线组成,它们是SDI(数据输入),SDO(数据输出),SCK(时钟),CS(片选)。

SDO – 主设备数据输出,从设备数据输入 对应MOSI master output slave input

SDI – 主设备数据输入,从设备数据输出 对应MISO master input slave output

SCLK – 时钟信号,由主设备产生

CS – Chip Select,从设备使能信号,由主设备控制

CS: 其中CS是控制芯片是否被选中的,也就是说只有片选信号预先规定使能信号时(高电位或低电位),对此芯片的操作才有效,这就允许在同一总线上连接多个SPI设备成为可能。

SDI/SDO/SCLK: 通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。这就是SCK时钟线存在的原因,由SCK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。数据输出通过 SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。这样,在至少8次时钟信号的改变(上沿和下沿为一次),就可以完成8位数据的传输。

要注意的是,SCK信号线只由主设备控制,从设备不能控制信号线。同样,在一个基于SPI的设备中,至少有一个主控设备

当SPI主设备想读/写从设备时,它首先拉低从设备对应的CS线(如果CS是低电平有效)。接着开始发送工作脉冲到时钟线上,在相应的脉冲时间上,主设备把数据信号按位发到MOSI实现“写”,同时可对MISO采样而实现“读”。如下图所示:

注意:此图只是示例,不代表所有SPI的情况,因为输出和采样的边沿可能会变化。

Autosar SPI

专有名词

缩写含义
EB外部缓冲通道。包含要传输的数据的缓冲区在SPI处理程序/驱动程序之外
IB内部缓冲通道。包含要传输的数据的缓冲区位于SPI处理程序/驱动程序内部。
ChannelSPI最小单元,其中可以配置传输长度,通道类型等。
Job一个Job是由一个或几个具有相同Chip Select(在Job处理期间不释放)的channel组成的。Job被认为是原子的,因此不能被另一个Job中断。Job具有指定的优先级。
SequenceSequence是要传输的连续Job的数量,但可以使用优先级机制在作业之间重新调度。Sequence传输是可中断的(被另一个Sequence传输),或者不依赖于静态配置。
LEVEL 0简单同步SPI处理器/驱动程序:通信基于同步处理,采用FIFO策略处理多个访问。缓冲区的使用是可配置的,以优化和/或利用HW功能
LEVEL 1基本异步SPI处理器/驱动程序:通信基于异步行为,并具有优先级策略来处理多个访问。缓冲区的使用是可配置的“简单同步”级别
LEVEL 2增强的(同步/异步)SPI处理器/驱动程序:通信基于异步行为或同步处理,在执行期间使用可选择的中断或轮询机制,并具有优先级策略来处理多个访问。与其他级别一样,缓冲区的使用也是可配置的

下图很好的说明了Channel,Job,Sequence三者之间的关系:


一个Job可以包括多个CS相同的Channel,一个Sequence可以包含多个CS不同的Job.

SpiDriver

SpiDriver中需要配置时钟,其他都是自动生成的

cfg中配置:

SpiChannel

SpiChannelId


Autosar标准配置项,一般为自动生成

cfg中配置:

SpiChannelType


选择通道类型,IB/EB

cfg中配置:

SpiDataWidth


该参数表示传输数据单元的宽度。需要根据实际通信需求修改。


cfg中配置:

SpiDefaultData

当(对于内部缓冲区或外部缓冲区)传递给Spi_WriteIB(对于内部缓冲区)或Spi_SetupEB(对于外部缓冲区)的指针为NULL时,传输的默认数据



cfg中配置:

SpiEbMaxLength

在选择为EB通道的情况下,此参数仅包含数据缓冲区的最大大小(数据元素数量)。

依赖项:SPI_CHANNEL_TYPE参数必须为该通道配置为EB。


SPI_CHANNEL_BUFFERS_ALLOWED参数必须配置为1或2


cfg中配置:

SpiIbNBuffers


该参数用于设置IB模式下的最大数据缓冲区数量

依赖项: SPI_CHANNEL_TYPE参数必须为该通道配置为IB。SPI_CHANNEL_BUFFERS_ALLOWED参数必须配置为0或2

此处我们没有选择用IB,所以不用配置该项

SpiTransferStart


此参数定义传输的第一个起始位。LSB-低位先传输,MSB-高位先传输。具体选择哪种需要看具体的应用场景。


cfg中配置:

SpiExternalDevice

通信外部设备的设置。与SpiJob密切相关,会被SpiJob引用。

SpiBaudrate


配置波特率。

cfg中配置:

SpiAutoCalcBaudParams

此配置不是Autosar标准配置。用来启用或不启用qspi波特率参数的自动计算。如果参数设置为TRUE,则配置工具将根据参数SpiBaudrate自动生成波特率参数(TQ、Q、A、B、C)。该项配置后,TQ、Q、A、B、C可以不配置。


cfg中配置:

SpiCsIdentifier

此参数是标识分配给该Job的Chip Select (CS)的符号名称。

此处CS信号我们没有选择在SPI中配置,而是直接通过配置PORT实现。

所以该配置不需要配。

SpiCsPolarity


配置片选信号的激活时的电平。


cfg中配置:

SpiCsSelection

当芯片选择处理被启用时(参见SpiEnableCs),那么这个参数指定芯片选择是由外设HW引擎自动处理还是通过Spi驱动程序的通用IO处理

一般都会选择CS_VIA_PERIPHERAL_ENGINE,除非对应的IO被异常占用。


cfg中配置:

SpiDataShiftEdge


此参数定义SPI数据移位边缘。数据可以在移位时钟的前沿或后沿上移位
对于一个时钟周期内,有两个edge,分别称为:

(1)Leading edge=前一个边沿=第一个边沿,对于开始电压是1,


那么就是1变成0的时候,对于开始电压是0,那么就是0变成1的时候;


(2)Trailing edge=后一个边沿=第二个边沿,对于开始电压是1,


那么就是0变成1的时候(即在第一次1变成0之后,才可能有后面的0变成1),
对于开始电压是0,那么就是1变成0的时候

在SPI协议中,有类似的定义为CPHA

CKPHA (Clock Phase) = CPHA = PHA = Phase = (时钟)相位

**不太一样的是,SpiDataShiftEdge是指的数据传输,CPHA指的是数据采样。**不过一个确定后,另外一个边沿也就跟着确定了。


cfg中配置:

SpiEnableCs


启用或禁用Chip Select处理功能。如果该参数被启用,那么参数SpiCsSelection进一步详细说明了芯片选择的类型

cfg中配置:

SpiIdleTime

此参数是QSPI硬件定义的IDLEA/IDLEB时间(以秒为单位)。此参数用于计算Qspi硬件延迟参数IPRE和IDLE。参数的单位为秒。

该配置需要参考具体的外设使用


cfg中配置:

SpiParitySupport

当选择SpiParitySupport时,SPI数据传输/接收包含一个额外的位,使奇偶校验基于选择为偶数EVEN或奇数ODD。此处我们没有使用该功能


cfg中配置:

SpiShiftClockIdleLevel

此参数定义SPI移位时钟空闲电平,在SPI中一般又称为极性CPOL

CKPOL (Clock Polarity) = CPOL = POL = Polarity = (时钟)极性



cfg中配置:

SpiTimeClk2Cs


时钟和芯片选择CS之间的计时(以秒为单位),在英飞凌手册中也称为leading delay-此参数允许使用从0到0.0001秒的值范围。该配置需要参考具体的外设使用

cfg中配置:

SpiTrailingTime

此参数是QSPI硬件定义的Trailing时间(以秒为单位)在英飞凌手册中也称为trailing delay。该参数用于计算Qspi硬件延迟参数TPRE和TRAIL。该配置需要参考具体的外设使用

cfg中配置:


延时时间参数可以参考寄存器BACON中的对应位。

SpiHwUnit


配置对应的硬件单元,该配置需要跟实际原理图对应起来。

SpiJob

SpiJobEndNotification

此参数是通知函数的引用。如果配置了Notification,则在job结束后会调用对应的函数



cfg中配置:

SpiJobId


一般自动生成该ID。


cfg中配置:

SpiJobPriority


根据SPI093设置优先级:0,最低,3,最高优先级


cfg中配置:

SpiDeviceAssignment


关联对应的 external device


cfg中配置:

SpiHwUnitSynchronous

配置job是同步还是异步
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I5MJRgTm-1671969044120)(https://files.mdnice.com/user/30966/bccc6c8e-2ddd-45a9-8884-2818813f73ec.png)]

SpiChannelList

配置job中的channel,一个job至少有一个channel

SpiSequence

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UQcm8SQo-1671969044120)(https://files.mdnice.com/user/30966/bd48e71f-bba9-4b00-82c0-27fff039e5be.png)]

SpiInterruptibleSequence


此参数允许或不允许此序列被另一个序列挂起。依赖:这个SPI_INTERRUPTIBLE_SEQ_ALLOWED参数被配置为ON。


cfg中配置:

SpiSeqEndNotification

此参数是通知函数的引用。



cfg中配置:

SpiSequenceId


一般自动生成此参数


cfg中配置:

SpiJobAssignment

配置关联的job


cfg中配置:

SpiGeneral

SpiAsyncParallelTransmit

用于启用/禁用仅在Level 1和Level 2可编辑的并行异步传输

通过启用SpiAsyncParallelTransmit,限制适用于Autosar的使用。

Sequence不能包含属于不同QSPI模块的Job。

这个配置没用过


cfg中配置:

SpiBaudrateConfigAtRuntime

波特率配置选择是在Spi_Init()还是在运行时启动new job之前,一般不勾选

cfg中配置:

SpiCancelApi


选择是否开启Spi_Cancel()函数,该函数用来取消指定的正在进行的序列传输。




cfg中配置:

SpiChannelBuffersAllowed

选择允许和传递的SPI处理器/驱动程序通道缓冲区使用情况

如果通道使用IB,则选择0,如果通道使用EB,则选择为1,若两种都有使用,则选择2



cfg中配置:

SpiHwStatusApi


选择是否开启Spi_GetHWUnitStatus函数,此函数返回指定SPI硬件微控制器外围设备的状态


cfg中配置:

SpiInterruptibleSeqAllowed

打开或关闭可中断序列处理功能

SPI_LEVEL_DELIVERED需要配置为1或者2,sequence中也有对应的配置SpiInterruptibleSequence



cfg中配置:

SpiLevelDelivered


SpiLevelDelivered为0(LEVEL0):驱动程序仅处理所有可用SPI总线(QSPIx)上的简单同步传输


SpiLevelDelivered为1(LEVEL1):驱动程序仅处理所有可用SPI总线(QSPIx)上的简单异步传输


SpiLevelDelivered是2级(LEVEL2):LEVEL2是驱动程序的增强行为,将处理同步和异步传输

一般都配置为2


cfg中配置:

SpiMaxJobTriggerQueueLength

队列中job的最大个数


cfg中配置:

其他配置项不是很重要,默认即可

SpiHwConfiguration

配置SpiHwDmaConfiguration,即对应的发送和接收的DMA通道

TC27x有四路QSPI

记得在MCU中将DMA选择为SPI USE

SPI使用

此处我们SPI使用异步调用,中断方式。需要在OS中配置DMA,SPI的相关中断。

在EcuMDriverInitListOne中增加Spi_Init函数

在需要使用SPI的外设驱动CDD的初始化函数中,调用:

	Spi_SetAsyncMode(SPI_ASYNC_MODE_INTERRUPT);

通过Spi_SetupEB函数设置发送和接收的数据,然后通过Spi_AsyncTransmit函数发送Sequence

对于Spi_SetupEB函数,使用方法如下:

Std_ReturnType Spi_SetupEB ( 
  Spi_ChannelType Channel, 
  const Spi_DataBufferType* SrcDataBufferPtr, 
  Spi_DataBufferType* DesDataBufferPtr, 
  Spi_NumberOfDataType Length 
)

Channel-配置的通道,一般会自动生成宏定义

SrcDataBufferPtr-输出的数据buffer指针

DesDataBufferPtr-输入的数据buffer指针

Length-发送或接收的数据长度

对于Spi_AsyncTransmit:

总结

本文没有太多参考芯片手册,其实有时间应该再多看看芯片手册,理解的会更深刻一些。最近越来越觉得思路方法很重要,只要有想法,干就完了~


若你觉得本文对你有帮助,欢迎点赞,关注,收藏,转发~~~ 你的鼓励是对小弟的最大支持~~~ 建了一个WX公众h,《汽车电子学习笔记》感兴趣可以关注一下~~~文章都会同步更新

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/114383.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端工程师可以分成 4 种,你属于哪一种?

在这篇文章中,探讨四种常见的前端工程,1)产品工程师,2)UI 基建工程师,3)设计师,4)工具基建工程师,你属于哪一种? 产品工程师 产品工程师负责公司…

6.s081 学习实验记录(二)xv6 and unix utilities

文章目录一、boot xv6二、sleep三、pingpong四、primes五、find六、xargs该实验主要用来熟悉xv6以及其系统调用 一、boot xv6 实验目的: 启动xv6系统,并使用提供的命令ls,列出系统所有的文件ctrl p,打印当前运行的进程ctrl a…

Ubuntu22.04使用kubeadm安装k8s 1.26版本高可用集群

目录阿里云ACK集群的架构ACK实例的创建过程如下安装前的准备主机规划基线准备所有k8s master、worker节点安装kubeadmkubectlkubelet创建集群负载均衡器HAproxy安装keepalived 和haproxy配置haproxy配置keepalivedkubeadm部署第一台master节点Calico网络组件一键安装安装完成阿…

mPEG-Biotin,甲氧基-聚乙二醇-生物素科研实验用试剂

​​ 英文名称:mPEG-Biotin 中文名称:甲氧基-聚乙二醇-生物素 mPEG生物素可通过与链霉亲和素和抗生物素结合进行聚乙二醇化,具有高亲和力和特异性。生物素通过稳定的酰胺连接物与线性PEG结合。 提示:避免频繁的溶解和冻干&…

node.js+uni计算机毕设项目基于微信的同学会小程序(程序+小程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等…

GraphQL在Django中的使用

简介 特点 请求你所要的数据,不多不少获取多个资源,只用一个请求描述所有的可能,类型系统几乎所有语言支持 谁在用 文档 Graphene-PythonGraphQL | A query language for your API 背景 传统restful的接口定义类型多,试图简…

WordPress 添加百度主动推送代码,加速网站收录保护原创文章

WordPress是世界上使用人数最多开源程序之一,它的优点有很多,譬如,简单易用、样式丰富,模板众多,安全性能高,对搜索引擎友好,收录快、扩展性强,功能强大等等,其中我最喜欢…

JVM的类加载机制

一、类加载机制 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内****,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象&…

六、应用层(三)文件传输协议(FTP)

将某台计算机中的文件通过网络传送到可能相距很远的另一台计算机中,是一项基本的网络应用,即文件传送。 文件传送协议FTP(File Transfer Protocal)是因特网上使用得最广泛的文件传送协议。 FTP提供交互式的访问,允许…

欢祝圣诞——北斗星的爱!

2022年圣诞节到来啦,很高兴这次我们又能一起度过~ ★★给大家推荐两首我很喜欢的歌曲,第一首是标题同名歌曲:1.张杰的《北斗星的爱》;另一首是:2.张杰的《星星》,这两首歌真的很震撼很好听! 我…

2022细胞生物学实验原理复习资料汇总

2022细胞生物学实验原理复习资料汇总1.2022年考试复习题及参考答案2.2021年考试复习题及参考答案3.2020年之前考试复习题汇总4.复习重点(汇总)5.排版好的PDF高清版 获取途径(资源2021年版,链接2022年最新版本)1.2022年…

Linux网络编程之epoll多路转接服务器

Linux网络编程之epoll多路转接服务器 一、epoll的基本概念 epoll是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,因为它会复用文件描述符集合来传递结果而不用迫使开发者每次等待…

基于自动模糊聚类的图像分割研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

kubernetes之数据存储详解

目录 一、存储卷的作用 二、数据卷概述 三、数据卷emptyDir 四、数据卷hostPath 五、数据卷:NFS 六、持久卷概述 6.1PV静态供给 6.2PV 动态供给(StorageClass) 6.3 PV 生命周期 6.3.1 ACCESS MODES (访问模式) 6.3.2 RECLAIM POLICY (回收策略) 6.3.3 S…

【Redis场景2】缓存更新策略(双写一致)

在业务初始阶段,流量很少的情况下,通过直接操作数据是可行的操作,但是随着业务量的增长,用户的访问量也随之增加,在该阶段自然需要使用一些手段(缓存)来减轻数据库的压力;所谓遇事不决,那就加一…

vue 基础入门:vue 的调试工具

1. 安装 vue-devtools 调试工具 vue 官方提供的 vue-devtools 调试工具,能够方便开发者对 vue 项目进行调试与开发。 Chrome 浏览器在线安装 vue-devtools :https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajb…

六、应用层(五)万维网(www)

目录 5.1 WWW的概念与组成结构 5.2 超文本传输协议(HTTP) 5.2.1 HTTP的操作过程 5.2.2 HTTP的特点 5.2.3 HTTP的报文结构 5.1 WWW的概念与组成结构 万维WWW(World Wide Web)简称web并非某种特殊的计算机网络。它…

商城管理系统

商城管理系统 文章目录商城管理系统要求:项目结构图AddProductServlet添加商品:AddToCart将商品添加至购物车ClearCart清空购物车DeleteProductServlet删除商品EditProductServlet修改商品FindProductServlet查找商品LoginServlet登录ProductControl商品…

初级C语言之【数组】

🦖作者:学写代码的恐龙 🦖博客主页:学写代码的恐龙博客主页 🦖专栏:【初级c语言】 🦖语录:❀未来的你,一定会感谢现在努力奋斗的自己❀ 初级C语言之【数组】一&#xff…

Swagger在线API文档

Swagger 解决的问题 随着互联网技术的发展,现在的网站架构基本都由原来的后端渲染,变成了前后端分离的形态,而且前端技术和后端技术在各自的道路上越走越远。前端和后端的唯一联系,变成了 API 接口,所以 API 文档变成…