AutoSar中的Spi_SetupEB函数原理与实现

文章目录

    • 一、函数介绍
    • 二、项目背景
    • 三、函数在AUTOSAR官网中的介绍
    • 四、代码实现
    • 五、验证
    • 六、联调过程中遇到的问题

一、函数介绍

此函数是Autosar标准中的接口,为EB SPI处理器/驱动程序设置缓冲区和数据长度的服务
指定频道。用容易理解的话说就是 设置一下某个通道的接收数据地址和发送数据地址以及数据长度的函数。

函数原型:
Std_ReturnType Spi_SetupEB ( Spi_ChannelType Channel, const Spi_DataBufferType* SrcDataBufferPtr, Spi_DataBufferType* DesDataBufferPtr, Spi_NumberOfDataType Length )
入参Channel为Channel索引号,索引号在Spi_Cfg.h里有。入参SrcDataBufferPtr为某路Channel的发送数据缓冲区地址,DesDataBufferPtr为某路Channel的接收数据缓冲区地址,Length为数据长度。

二、项目背景

写此函数的背景是目前有一个项目,需要我这边的MCU做SPI从机,SOC做主机与MCU进行SPI通信,并使用AUTOSAR标准接口实现。

三、函数在AUTOSAR官网中的介绍

首先进入到AUTOSAR官网
在这里插入图片描述
在Communication Drivers中即可找到关于SPI相关的介绍,可通过此访问文档。
在这里插入图片描述
函数的详细介绍可查看此文档进行了解。了解功能和接口定义实现一个函数基本就足够了。

四、代码实现

根据上面介绍,我们就来实现一下这个接口。并将其应用到SPI从机的代码逻辑功能中。
下面代码是当SPI来数据,SPI从机就会进入到接收中断中进行处理数据,然后将数据放入到Spi_SetupEB中的接收数据DesDataBufferPtr中。

函数实现:

Spi_ChannelObjType Spi_ChannelObj[SPI_MAX_CHANNELS];typedf struct
{Spi_DataBufferType* TxBufPtr;Spi_DataBufferType* RxBufPtr;Spi_NumberOfDataType numWordsTxRx;
}
Spi_ChannelObjType;Spi_SetupEB(spi_ChannelType Channel,Spi_DataBufferType *Src,Spi_DataBufferType *Des,Spi_NumberOfDataType Length)
{/*关全部中断*/Spi_ChannelObjType *chObj;chObj = &Spi_ChannelObj[Channel];chObj->TxBufPtr = Src;ChObj->RxBufPtr = Des;ChObj->numWordsTxRx = Length;/*开全部中断*/
}

接收中断处理代码

uint8 RxOneData;
void Spi_IrqHandler(spi_ChannelType Channel)
{RxOneData = xxxx();//xxxx()代表获取接收SPI数据的函数Spi_ChannelObj[Channel].RxBufPtr  = &RxOneData;//将数据给到全局指针中
}

验证测试代码

Spi_DataBufferType  TXEB[10];
Spi_DataBufferType  RXEB[10];
Spi_NumberOfDataType Length = 10;Spi_SetupEB(0,TXEB,RXEB,Length);//上电后调用一次即可
//待接收中断中收到数据,即存到了EXEB中

五、验证

当调用验证代码,当SPI主机来了数据,RXEB数组中也就存放了接收到的数据。

六、联调过程中遇到的问题

1、字节间纯同步
众所周知,SPI是同步传输的,从机应跟随时钟线进行数据通信,问题是,当主机来了一个字节的数据,从机触发了中断,数据从机收到了,但是,从机的第二个字节的数据是主机第一个字节的数据,导致数据错了一位。
:其实这不是一个问题,是没问题的,因为从机是不可能提前知道主机要给从机发什么数据的,相当于我告诉你我要打你一拳,你是不知道我打你哪里的,这也是相同的道理,不可能提前预知。但是甲方毕竟是甲方,此问题要解决。
**解决办法是:**在应用设置SpiSetupEB接口时,将第一个字节的数据放入到接收数据寄存器中,也就是提前将第一个接收数据寄存器的一个字节放入了主机要发送给我第一个数据,这样就实现数据对齐了。
2、数据错误
在本地调试没有问题,到了项目中调试出现了主机给从机发数据,不过几秒中从机就收不到数据了,经过测试,主机确实给主机发过去了,从机没有进接收中断。
**答:**这是从机MCU产生错误标志,需要将错误状态标志位给清掉之后才能再次进中断接收数据。
解决办法是:
每间隔1ms的时间查询是否产生了错误状态,如果产生了错误状态,连续读四次接收数据寄存器才能彻底清除。然后再清除错误状态寄存器。

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

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

相关文章

人工智能在教育领域的应用:优势、挑战与未来展望

在数字化时代,人工智能(AI)正以其独特的方式重塑教育的面貌。从课堂互动到个性化学习,再到教学管理,AI技术的应用正变得越来越广泛。本文将深入探讨AI在教育领域的应用,分析其优势、挑战,并展望…

VUE3 el-table-column header新增必填*

1.在需要加必填星号的el-table-column上添加render-header属性 <el-table-column :label"getName(产品代码)" :render-header"addRedStart" prop"MODELCODE" min-width“4.5%”> <template v-slot"scope"> <el-input …

SpringBoot中使用监听器

1.定义一个事件 /*** 定义事件* author hrui* date 2024/7/25 12:46*/ public class CustomEvent extends ApplicationEvent {private String message;public CustomEvent(Object source, String message) {super(source);this.message message;}public String getMessage() …

Cannot find module ‘html-webpack-plugin

当你在使用Webpack构建项目时遇到Cannot find module html-webpack-plugin这样的错误&#xff0c;这意味着Webpack在构建过程中找不到html-webpack-plugin模块。要解决这个问题&#xff0c;你需要确保已经正确安装了html-webpack-plugin模块&#xff0c;并且在Webpack配置文件中…

uniapp手写滚动选择器

文章目录 效果展示HTML/Template部分&#xff1a;JavaScript部分&#xff1a;CSS部分&#xff1a;完整代码 没有符合项目要求的选择器 就手写了一个 效果展示 实现一个时间选择器的功能&#xff0c;可以选择小时和分钟&#xff1a; HTML/Template部分&#xff1a; <picker…

『 Linux 』信号概念与信号的产生 ( 万字 )

文章目录 信号概念前台进程与后台进程信号的本质硬件理解信号的产生Core dump 标志 信号概念 "信号"一词指用来传达信息或只是的各种形式的提示或标志; 在生活中常见的信号例如红绿灯,交通标志,短信通知等 在操作系统中,"信号"是一种用于异步通知进程发生特…

[嵌入式英语]Real Time Clock

zynqmpsoc 开发手册 Real Time Clock 章节 Introduction The real time clock (RTC) unit maintains an accurate time base for system and application software. For high accuracy needs, the RTC also includes calibration circuitry to offset temperature and voltage …

JVM加载一个实现了某个接口

在Java虚拟机&#xff08;JVM&#xff09;加载类和接口时&#xff0c;加载过程本身是由多个线程来完成的&#xff0c;而不是由单个线程完成的。JVM是多线程的&#xff0c;它可以并行加载多个类和接口&#xff0c;以提高加载效率和整体应用程序的性能。 具体来说&#xff0c;JV…

国衍科技——RFID技术的应用

在文物馆藏信息的记录与管理过程中&#xff0c;准确性和详细性是至关重要的。无论是大型博物馆还是私人收藏馆&#xff0c;都需要有效的方法来确保馆藏文物信息的可追溯性和可访问性&#xff0c;才能提供更好的服务和保护馆藏资源。而结合射频识别&#xff08;RFID&#xff09;…

2024年虚拟主机转移教程

转移网站并不困难&#xff0c;但选择正确的选项和最佳程序才是关键。网站托管服务被视为当今数字世界的基石&#xff0c;全球有18 亿个网站。网站所有者可以通过下载备份、将其上传到新服务器并指向域名来手动转移网站。他们还可以通过新网站托管商的助手请求来移动网站。对于初…

华清数据结构day5 24-7-22

1>使用栈&#xff0c;完成进制转换输入&#xff1a;一个整数&#xff0c;进制数输出&#xff1a;该数的对应的进制数 seqstack.h #ifndef SEQSTACK_H #define SEQSTACK_H #define MAX 10 #include"myhead.h" typedef int datatype;typedef struct {datatype *d…

【Tomcat】快速入门

概述 Tomcat是Apache软件基金会一个核心项目&#xff0c;是一个开源免费的轻量级Web服务器&#xff0c;支持Servlet/JSP.少量avaEE规范。Tomcat Tomcat也被称为Web容器、Servlet容器。Servleti程序需要依赖于Tomcat才能运行。 安装使用 下载安装都是绿色版本&#xff0c;解…

Git、Gitlab以及分支管理

分布式版本控制系统 一、Git概述 Git是一种分布式版本控制系统&#xff0c;用于跟踪和管理代码的变更。它由Linus torvalds创建的&#xff0c;最初被设计用于Linux内核的开发。Git 允许开发人员跟踪和管理代码的版本&#xff0c;并且可以在不同的开发人员之间进行协作。 Githu…

全年销售7亿块,巧克力企业如何通过相邻业务打造极致产品力?

蒂罗尔巧克力是日本经典的巧克力品牌。 糖果业务是松尾早期的主营业务&#xff0c;在主营业务下滑的情况下&#xff0c;确立新的竞争方向&#xff0c;通过主营业务优势进入相邻业务&#xff0c;打造新产品成就巧克力极致产品力&#xff0c;避免衰退重回增长。 如何通过进入相邻…

MFC列表框示例

本文仅供学习交流&#xff0c;严禁用于商业用途&#xff0c;如本文涉及侵权请及时联系本人将于及时删除 目录 1.示例内容 2.程序步骤 3.运行结果 4.代码全文 1.示例内容 编写一个对话框应用程序CMFC_Li6_4_学生信息Dlg&#xff0c;对话框中有一个列表框&#xff0c;当用户…

matlab gui下的tcp client客户端编程框架

GUI界面 函数外定义全局变量 %全局变量 global TcpClient; %matlab作为tcpip客户端 建立连接 在“连接”按钮的回调函数下添加以下代码&#xff1a; global TcpClient;%全局变量 TcpClient tcpip(‘192.168.1.10’, 7, ‘NetworkRole’,‘client’); %连接到服务器地址和端…

sqlalchemy报错sqlalchemy.orm.exc.DetachedInstanceError

解决方案&#xff1a; 在初始化数据库的代码中&#xff0c;将 maker sessionmaker(bindeng)修改为 maker sessionmaker(bindeng, expire_on_commitFalse)为什么要添加 expire_on_commitFalse 参数&#xff1f; expire_on_commit 可以用来更改 SQLAlchemy 的对象刷新机制&…

【Hot100】LeetCode—152. 乘积最大子数组

目录 题目1- 思路2- 实现⭐152. 乘积最大子数组——题解思路 3- ACM 实现 题目 原题连接&#xff1a;152. 乘积最大子数组 1- 思路 动规五部曲 2- 实现 ⭐152. 乘积最大子数组——题解思路 class Solution {public int maxProduct(int[] nums) {// 初始化答案以及以第一个元…

windows wsl ubuntu系统安装桌面可视化

参考&#xff1a; https://www.bilibili.com/read/cv33557374/ 1&#xff09;首先先安装好wsl ubuntu系统 2&#xff09;安装 Ubuntu 桌面版 sudo apt purge -y acpid acpi-support modemmanagersudo apt-mark hold acpid acpi-support modemmanager sudo apt install ubunt…

OpenSearch 实现自动化告警

本文将介绍如何使用 Amazon OpenSearch 服务设置自动化告警,并通过 SNS、Lambda 和钉钉实现告警通知。 1. 创建 SNS 主题和订阅 首先,我们需要创建一个 SNS 主题来发送通知: 登录 AWS 控制台,进入 SNS 服务。点击"创建主题",选择标准类型,为主题命名。创建主…