AUTOSAR 架构下的SPI模块的理解

news2024/12/24 22:13:10

一、SPI模块

1、模块简介

SPI处理程序/驱动程序为单片SPI [串行外设接口]处理程序/驱动程序提供功能和API。该软件模块包括处理和驱动功能。这种单片SPI处理器/驱动器的主要目标是充分利用每个微控制器的功能,并根据静态配置实现优化,以尽可能地满足ECU的需求。

因此,该规范定义了可选择的功能级别和可配置特征,以允许设计利用微控制器特性的高可扩展模块。

SPI处理程序/驱动程序是微控制器抽象层(MCAL)的一部分。它提供读取和写入通过SPI总线连接的设备的服务。它还提供了配置片上SPI外设所需的机制。

SPI具有4线同步串行接口。使用片选线(CS)启用SPI通信。SPI通信由3线接口执行,包括用于串行数据主线 - 输出 - 从 - 输入(MOSI),串行数据主 - 输入 - 从 - 输出(MISO)和串行时钟(CLK)的线。

SPI外设可能取决于系统时钟,预分频器和PLL。因此,系统时钟的变化(例如,PLL开启 - > PLL关闭)也可能影响SPI硬件的时钟设置。

SPI处理程序/驱动程序模块不会在初始化函数中设置用于配置时钟,预分频器和PLL的寄存器。这必须由MCU模块完成。

根据微控制器,SPI外设可以与其他外设共享寄存器。在这种典型情况下,SPI处理程序/驱动程序与MCU模块有关系,用于初始化和取消初始化这些寄存器。

根据所选的功能级别,SPI处理程序/驱动程序的一般行为可以是异步或同步的调用方式。

2、Channel Job Sequence

AUTOSAR 提供了三种SPI的抽象。Channel Job Sequence。

一张图可以说明三者的关系。

一个Job 代表了一次完整的SPI通信,一个Job可以由一个或者多个Channel组成,Channel用来装载SPI的发送与接收数据。

一个Sequence可以由一个或者多个Job,可以将一个操作序列抽象成一个Sequence。

SPI传输的最小单元是由连续的Job组成的Sequence,依据Job的优先级将Job 依次发送出去。

3、同步调用与异步调用

AUTOSAR 为SPI 提供了两种方式通信的接口。

同步调用    Spi_SyncTransmit

异步调用 Spi_AsyncTransmit

同步调用,是需要等待返回调用结果,而异步调用这是发起任务,一般可以通过回调函数来告知调用结果。

对于同步调用接口 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函数来告知调用方已经完成传输   

以上三种方式,我采用了第二种。我认为第三种方式使用于大量数据传输,菊花链的数据量并不是很大。

二、配置项与关联

1、SPI配置

SPI的配置项只有在使用DMA功能是才与MCL模块相关联。

在SpiPhyUnits的配置项中,直接关联到硬件的SPI

SpiExternalDevice 中通过HW Uint关联到SpiPhyUints 

SpiJob 中通过Device Assignment 关联到Device,通过ChannelList 关联到Channel。

    

 2、MCL配置

MPC5746R有64个DMA通道,可以通过手册查到应对的DmaMux。

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

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

相关文章

医疗虚拟仿真和虚拟现实有什么区别?哪个更好?

随着我们在仿真教育中越来越多地使用新技术,区分虚拟模式的类型很重要。虚拟仿真是一个统称,用来概括术语来描述各种基于仿真的体验,从基于屏幕的平台到沉浸式虚拟现实。然而,各虚拟平台在保真度、沉浸感和临场感的水平上有很大差…

java 调用 opencv 识别图片

前言 opencv 的 github 地址 opencv 官网 本文介绍如何使用 java 来调用 opencv 下载opencv opencv下载 页面根据自己电脑操作系统下载最新的安装包,我这里下载的是 4.7.0 版本。 (4.7.0 版本里的 opencv-470.jar 包是使用 jdk11 编译的&#xff0c…

从0到1ES集群搭建实践

ES集群搭建实践 创建虚拟机 创建Linux新用户elastic 必须信息 使用elasticsearch账号操作:启动,关闭等 配置网卡信息 vi /etc/sysconfig/network-scripts/ifcfg-ens33TYPE"Ethernet" PROXY_METHOD"none" BROWSER_ONLY"no…

pytorch笔记:transformer

来自B站视频,API查阅,TORCH.NN seq2seq 可以是 CNN,RNN,transformer nn.Transformer 关键源码: encoder_layer TransformerEncoderLayer(d_model, nhead, dim_feedforward, dropout,activation, layer_norm_eps, ba…

Github官网进不去怎么办?Github无法访问怎么办?

1.操作方法: 打开hosts文件,可能需要管理员权限。 win10 hosts位置:C:\Windows\System32\drivers\etc 在末尾新建一行,添加如下内容: 2.1方法一 Host文件追加 140.82.112.26 alive.github.com140.82.114.25 live.…

【electron】 客户端调试小技巧

1、谷歌浏览器输入:chrome://inspect打开开发者工具 可以方便拦截electron内的请求,也可以通过f12的开发者工具中的source打断点。 虽然在electron客户端内也能审查元素。 PS:但是其有局限性,如果是窗体套窗体(webview)&#xff…

Android——基本控件(十)

1. 图片视图:ImageView 1.1 知识点 (1)掌握ImageView组件的使用; (2)掌握图片的保存; 1.2 具体内容 之前我们讲过了RadioGroup是提供了一个存放RadioButton的一个容器,ImageVie…

STM32速成笔记—中断

文章目录 一、什么是中断二、中断的相关概念2.1 中断优先级2.2 中断嵌套2.3 中断服务函数2.4 中断标志位 三、外部中断EXIT四、中断程序配置4.1 设置中断分组并使能中断4.2 初始化EXIT4.3 编写中断服务函数 五、注意事项 一、什么是中断 首先介绍一下什么是中断。在实际开发过…

OpenCV 笔记_2

文章目录 笔记_2图像尺寸变换resize 图像缩放 (重置图像大小)flip 图像翻转hconcat 横向连接vconcat 纵向连接 图像方式变换warpAffine 仿射变换函数:矩阵M(2*3)getRotationMatrix2D 获取图像旋转矩阵M:矩阵M&#xff…

电脑出现MSVCP100.dll丢失错误怎么办?

MSVCP100.dll是一个Windows系统文件,它可以确保Windows程序正确平稳运行,如果该文件安装不正确、丢失或损坏,则使用该文件的应用程序将无法正常启动,会出现“无法启动此程序,因为计算机中丢失MSVCP100.dll”的错误提示…

OpenCV 笔记_4

文章目录 笔记_4图像细化thinning 图像细化函数 轮廓检测findContours 轮廓检测函数drawContours 轮廓绘制函数contourArea 计算轮廓面积:返回值 double类型arcLength 计算轮廓长度:返回值 double类型 轮廓外接多边形boundingRect 给定轮廓的外接矩形min…

Hook攻防之InlineHook

什么是InlineHook Inline Hook,又称为超级Hook,是一种强大而又灵活的Hook技术。 Inline Hook的主要思想就是直接修改目标函数的代码,通常是在目标函数的开头插入一个跳转指令(jmp)。这个跳转指令会将程序的执行流跳转…

PPT写作要义:信息效率

PPT写作的要义:信息效率 抖音里一个有货的讲师的总结 花里胡哨的PPT一定偏离了初衷 这点上要像互联网公司学习 其实有些PPT制作的初衷,就是搞神秘感 故意让人听不懂 趣讲大白话:大道至简 【趣讲信息科技198期】 ****************************…

基于Java绿色农产品推广应用网站设计实现(源码+lw+部署文档+讲解等)

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…

CRC原理

文章目录 简介 CRC思想错误检测基本思想多项式运算没有进位的二进制计算 CRC计算方式发送方计算接收方校验多项式选择 CRC实现原理CRC8整体处理数据单个处理数据与整体数据处理比较使用查找表加速计算 扩展到CRC16整体处理数据单个处理数据与整体数据处理比较使用查找表加速计算…

项目管理中,如何实现有效的项目预算管理?

在《PMBOK指南》第七版中,变化较大的一点是从以成果为导向演变为以价值为导向,其十二项指导原则之一——“聚焦于价值”也阐述了价值是项目的最终成功指标和驱动因素。在这一指导原则下,项目经理就不能只关注在范围、进度、成本三重要素约束下…

UmiJs - 拆包优化

UmiJs - 拆包优化 前言一. 如何拆包,怎么拆1.1 分析自己项目的编译产物结构1.2 开始拆包 二. 有哪些注意点2.1 样式丢失2.2 存在需单独打包的页面 前言 我们在写前端代码的时候,难以避免的是,我们可能引入的依赖越来越多。那么随之而来的&am…

Redis入门 - Lua脚本

原文首更地址,阅读效果更佳! Redis入门 - Lua脚本 | CoderMast编程桅杆https://www.codermast.com/database/redis/redis-scription.html Redis 脚本使用 Lua 解释器来执行脚本。 Redis 2.6 版本通过内嵌支持 Lua 环境。执行脚本的常用命令为 EVAL。 …

【Golang系列】Golang环境配置和第一个Go程序

⭐️前面的话⭐️ 本篇文章将介绍Golang语言的环境配置,以及如何在VS code中运行第一个golang程序。 📒博客主页:未见花闻的博客主页 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 📌本文由未…

Pytest教程__定制allure报告(12)

定制报告需要先导入allure模块,再使用以下装饰器方法: feature: 标注主要功能模块。story: 标注feature功能模块下的分支功能。description:在报告中显示用例描述。step: 标注测试用例步骤。issue && testcase:标注用例关…