AUTUSAR通信篇 - CAN网络通信(一)

news2024/11/29 8:54:59

第一篇从全局角度出发,简单介绍了AUTOSAR的结构,从本篇开始我们一起详细了解一下AUTOSAR软件架构下内部的组成部分。下面,我们首先介绍第一个模块-通信。在AUTOSAR BSW中通信由三个部分组成,分别是:通信驱动、通信抽象、通信服务。涉及的通信类型包括但不仅限于LIN、CAN、FlexRay、Ethernet。实际车用最广泛还是LIN和CAN,但LIN总线由于带宽及通信质量等原因,大都是用于简单执行器的控制通信。而车载ECU之间、ECU与复杂传感器之间的通信大都采用CAN通信。而以太网通信是近年来由于车载娱乐及自动驾驶业务发展对车载通信要求的提高引入的。这里我们已典型的CAN通信作为切入点,介绍AUTOSAR架构下的通信。

CAN网络简介

CAN(Controller Area Network)网络通信是一种现代的串行通信协议,被广泛应用于汽车、工业控制和其他领域。它最初由德国BOSCH公司于1986年开发,旨在满足汽车电子系统中的通信需求。然而,由于其卓越的性能和可靠性,CAN通信很快就在其他行业中也得到了广泛采用。

CAN网络通信的特点:

  • 分布式通信架构,允许多节点同时在总线收发消息;
  • 差分信号设计,提高信号抗干扰性;
  • 支持优先级仲裁,可组成多主机局部网络;
  • 相对结构简单、成本低;

关于CAN的更多基础知识这里不再详细展开。对CAN总线完全不了解的朋友这里有一篇文章仅供参考:CAN通信讲解 - 知乎

在实际应用中,CNA通信的实现需要在硬件上有CAN控制器和CAN收发器的支持。应用比较广泛的独立的CAN控制器有NXP(恩智浦)的TJA1050,独立的CAN收发器有NXP的TJA1043、TJA1044等。但现在大多主控芯片都包含片内CAN控制器,只需要搭配合适的CAN收发器即可。

BSW中的CAN模块

在AUTOSAR架构中,CAN模块属于BSW层的MCAL,其作用就是作为CAN驱动软件,驱动CAN硬件,实现CAN报文的收发。在AUTOSAR中CAN模块负责驱动一个“CAN Hardware Unit”的实体。一个CAN Hardware Unit包含一个或多个一样的CAN控制器,可以是在主芯片内部(片内)也可以是在主芯片外部(板载)。下图所示为包含2个CAN控制器连接到两路物理CAN通道的CAN Hardware Unit。

CanHardwareUnit示意图

一个CAN模块提供访问一个CAN Hardware Unit的接口,如果应用存在多个不同类型的CAN Hardware Unit那么就要实现多个CAN模块。

CAN状态机

CAN模块状态机比较简单,共有4个状态,分别为:

  • UNINIT(未初始化);
  • STOPPED(停止);
  • STARTED(启动);
  • SLEEP(睡眠);

下图所示为CAN状态机转换图。

上电后,CAN首先进入UINIT状态,直到调用Can_Init()函数,进行CAN模块初始化,然后CAN模块进入STOPPED状态,此时表示CAN模块已经初始化完成,但是并不参与总线通信。然后当函数Can_SetControllerMode(CAN_CS_STARTED)被调用后,CAN模块进入STARTED模式,在STARTED模式下CAN模块正常工作,可进行CAN报文的收发。当函数Can_SetControllerMode(CAN_CS_STOPPED)被调用后,CAN状态进入STOPPED状态,此时CAN模块停止参与总线通信。当函数Can_SetControllerMode(CAN_CS_SLEEP)被调用后,CAN状态由STOPPED状态进入SLEEP状态。当Can_DeInit()被调用后,CAN状态机进入UNINIT状态。

另外,除了由软件触发的CAN模块状态机跳转,以下硬件条件也可出发CAN状态机跳转。

  1. 硬件唤醒:当CAN状态机处于SLEEP模式下时,收到硬件唤醒信号,CAN状态机跳转STOPPED状态
  2. Bus-Off:当CAN状态机处于STARTED状态时,如果发生BusOff,那么CAN状态机跳转STOPPED状态;

CAN报文发送

Can_Write()函数用于发送报文,报文成功发送后,CAN模块会调用CanIf_TxConfirmation()上报消息发送成功(CanIf层的通知回调,此处若不理解可浏览CanIf篇)。

Can报文的发送方式有两种:中断式和轮询式。若CAN报文以中断的方式发送,那么发送回调在中断服务中调用;若CAN报文以轮询的方式发送,那么发送回调在周期函数Can_MainFunction_Write()中调用。

CAN报文接收

当有CAN报文到来时,CAN模块调用接收指示回调函数CanIf_RxIndication()。

CAN报文的接收方式有两种:中断式和轮询式。中断式时相应硬件资源的接收中断服务程序调用回调函数CanIf_RxIndication;轮询模式时,周期函数Can_MainFunction_Read 调用回调函数CanIf_RxIndication。

基于硬件特性,看具体硬件支持FIFO、Queue、ShadowBuffer。CAN模块会将接收到报文数据存放到FIFO/Queue/ShadowBuffer,供后续使用。

是的,就这样就结束了!CAN模块在报文接收过程的作用仅仅时发出一个提示并缓存数据,后续报文的处理都是CanIf完成的,将在后续介绍。

总结

  • CAN报文接收发送有两种模式:中断 或 轮询,不同模式决定任务处理方式不同;
  • CAN状态机跳转条件:软件触发(Can_SetControllerMode)和硬件触发(BusOff、唤醒)

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

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

相关文章

【计算机视觉 | Pytorch】timm 包的具体介绍和图像分类案例(含源代码)

一、具体介绍 timm 是一个 PyTorch 原生实现的计算机视觉模型库。它提供了预训练模型和各种网络组件,可以用于各种计算机视觉任务,例如图像分类、物体检测、语义分割等等。 timm 的特点如下: PyTorch 原生实现:timm 的实现方式…

Java之线程池

目录 一.上节复习 1.阻塞队列 二.线程池 1.什么是线程池 2.为什么要使用线程池 3.JDK中的线程池 三.工厂模式 1.工厂模式的目的 四.使用线程池 1.submit()方法 2.模拟两个阶段任务的执行 五.自定义一个线程池 六.JDK提供线程池的详解 1.如何自定义一个线程池? 2.创…

【计网】第三章 数据链路层(3)信道划分介质访问控制

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 3.5-1 信道划分介质访问控制(播报信道中应用)一、传输数据使用的两种链路二、介质访问控制 三、信道划分 介质访问控制(静态划分…

协程切换原理与实践 -- 从ucontext api到x86_64汇编

目录 1.协程切换原理理解 2.ucontext实现协程切换 2.1 实现流程 2.2 根据ucontext流程看协程实现 2.3 回答开头提出的问题 3.x86_64汇编实现协程切换 3.1libco x86_64汇编代码分析 3.2.保存程序返回代码地址流程 3.3.恢复程序地址以及上下文 4.实现简单协程框架 1.协程…

《编程思维与实践》1071.猜猜猜

《编程思维与实践》1071.猜猜猜 题目 思路 对于首字符而言,如果后一位字符与之相同,则首位选法只有1种,不同则2种; 对于最后一位字符而言,如果前一位字符与之相同,则末位选法只有1种,不同则2种; 对于中间的字符而言,有以下几种可能: 1.中间字符与前后字符均不同且前后字符不同…

企业挑选人力资源管理系统,需要从哪些角度考察?

企业在挑选人力资源管理系统时,除了要考虑到企业自身的主要需求外,还应该从哪些角度考察人力资源管理系统呢?一起来看看吧~ 一. 数据是否共通 企业在人力资源管理系统时通常有多个功能模块的需求。除了要看系统是否具备这些功能模块&#xff…

一分钟图情论文:《数据与信息之间逻辑关系的探讨——兼及DIKW概念链模式》

一分钟图情论文:《数据与信息之间逻辑关系的探讨——兼及DIKW概念链模式》 1989年,Ackoff R L在论文:《From data to wisdom》中正式提出DIKW概念链模型,在该模型提出后的20年间,在计算机学科、信息管理学科、图书情报…

数据结构--线段树

写在前面: 学习之前需要知道以下内容: 1. 递归 2. 二叉树 文章目录 线段树介绍用途建树修改单点修改区间修改 查询 代码实现。建树更新lazy传递查询 练习洛谷 P3372 【模板】线段树 1题目描述题解 线段树 介绍 线段树是一种二叉树,也可以…

【5G RRC】5G中的服务小区和邻区测量方法

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客…

STL配接器(容器适配器)—— stack 的介绍使用以及模拟实现。

注意 : 以下所有文档都来源此网站 : http://cplusplus.com/ 一、stack 的介绍和使用 stack 文档的介绍:https://cplusplus.com/reference/stack/stack/ 1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中&…

Matlab进阶绘图第20期—带类别标签的三维柱状图

带类别标签的三维柱状图是一种特殊的三维柱状图。 与三维柱状图相比,带类别标签的三维柱状图通过颜色表示每根柱子的所属类别,从而可以更加直观地表示四维/四变量数据。 由于Matlab中未收录带类别标签的三维柱状图的绘制函数,因此需要大家自…

Java 使用 jdbc 连接 mysql

简介 Java JDBC 是 Java Database Connectivity 的缩写,它是一种用于连接和操作数据库的标准 API。Java JDBC 可以让 Java 程序通过 JDBC 驱动程序连接到各种不同类型的数据库,并且执行 SQL 语句来实现数据的读取、插入、更新、删除等操作。在本篇文章中…

Springboot整合Flowable流程引擎

文章目录 前言1. Flowable的主要表结构1.1 通用数据表(通用表)1.2运行时数据表(runtime表)1.3.历史数据表(history表)1.4. 身份数据表(identity表)1.5. 流程定义数据表(r…

C++: 并行加速图像读取和处理的过程

文章目录 1. 目的2. 设计3. 串行实现4. 并行实现5. 比对:耗时和正确性6. 加速比探讨 1. 目的 读取单张图像,计算整图均值,这很好实现,运行耗时很短。 读取4000张相同大小的图像,分别计算均值,这也很好实现…

【OpenCv • c++】形态学技术操作 —— 开运算与闭运算

🚀 个人简介:CSDN「博客新星」TOP 10 , C/C 领域新星创作者💟 作 者:锡兰_CC ❣️📝 专 栏:【OpenCV • c】计算机视觉🌈 若有帮助,还请关注➕点赞➕收藏&#xff…

openGauss5.0.0在vscode成功调试

之前在虚拟机上编译成功过,但今天启动数据库的时候出现权限错误问题,我重新删除了data文件夹,重新初始化启动数据库还是不成功,后来对报错文件进行赋权,成功解决! 问题(一) 1.启动…

图像水印MATLAB实验

文章目录 一、实验目的二、实验内容1. 简单的可见水印嵌入实验2. 不可见脆弱水印实验3. 不可见鲁棒水印实验 一、实验目的 了解数字图像水印技术的基本原理、分类和应用。掌握简单的可见水印和不可见水印的嵌入方法。实现一种基于DCT的不可见鲁棒水印,并进行水印鲁…

Dubbo 服务端源码深入分析 (7)

目录 1. 前提 2. 认识 Protocol 和 ProxyFactory Protocal ProxyFactory Dubbo服务流程 服务端源码分析 测试代码: Protocal代理的源码 ProxyFactory源码: 获取invoker对象 具体步骤 1. 我们调用的是ProxyFactory的代理对象的getInvoker方法…

Linux线程同步(6)——更高并行性的读写锁

互斥锁或自旋锁要么是加锁状态、要么是不加锁状态,而且一次只有一个线程可以对其加锁。读写锁有 3 种状态:读模式下的加锁状态(以下简称读加锁状态)、写模式下的加锁状态(以下简称写加锁状态)和不加锁状态&…

django视图(request请求response返回值)

一、视图函数介绍 视图就是应用中views.py中定义的函数,称为视图函数 def index(request):return HttpResponse("hello world!") 1、视图的第一个参数必须为HttpRequest对象,还可能包含下参数如通过正则表达式组获取的位置参数、通…