jjzjj

[ 搞一点AutoSar ]一张图帮你理解CAN通信全过程

如烟的温柔 2024-05-03 原文

笔者最近一直在学习AUTOSAR 通信部分的相关知识,经过长时间的学习有了一个大概的了解。但一直感觉资料介绍的东西都很零散,不是很全面,这样子无法建立一个完整的知识体系。于是笔者查阅各种资料,加上自己的一点理解,制作了CAN通信部分从软件到硬件的一个流程图。
写的过程中发现这里面可以写的内容实在是太多了,所以本篇先简略介绍一下信号是如何传输的,以及主要模块的功能介绍,后续再更新每个模块信号传输的细节;

一图了解CAN通信硬件到软件

1、CAN通信概略图和基本概念介绍

应用层APPL、RTE(实时运行环境 Runtime Environment)不太熟悉,这里不多赘述;

交互层:

  • IPDU multiplexer:协议数据单元复用模块
  • COM:COMMUNICATION 通信模块
  • DCM: 诊断通信管理模块(Diagnostic Comminication Manager)
  • PDUR:Protocol Data Unit Router -PDU路由器

网络层:

  • CAN TP: CAN Transport Layer
  • CAN TP提供的服务包括: 传输方向的数据分割、接收方向的数据重组、 数据流控制、检测分割会话中的错误、传输取消
    接收取消
  • J1939 TP:基于J1939协议的CAN TP,J1939Tp模块实现了SAEJ1939标准中的两种数据传输方式BAM和CMDT;

数据链路层:

  • CAN Interface:CAN 接口层(CanIf)是访问CAN总线的标准接口;

物理层:

  • CAN Driver: CAN 驱动;,可以实现对CAN控制器的初始化、发送/接收CAN报文、对接收报文的指示与对发送报文的确认、唤醒检测、溢出和错误处理等功能。
  • CAN Controller: CAN控制器;
  • CAN Transceiver Driver: CAN收发器驱动程序抽象了CAN收发器硬件。它为较高层提供了一个独立于硬件的接口。它利用MCAL层的api从ECU布局中抽象出来,访问CAN收发硬件。

硬件部分:

  • CANTransceiver:CAN收发器,是一种硬件设备,可将CAN总线上使用的信号电平调整为微控制器识别的逻辑(数字)信号电平。此外,收发器还能够检测电气故障,例如布线问题,接地偏移或长主导信号的传输。根据与微控制器的接口,它们会标记由单个端口引脚汇总的检测到的错误或由SPI非常详细地标记出来
  • CAN High: CAN总线高电平;
  • CAN Low: CAN总线低电平;
  • CAN network:AUTOSAR CAN网络管理是一个独立于硬件的协议,只能在CAN上使用。其主要目的是协调网络从正常运行到总线休眠模式的过渡。

传输数据类型:

  • signals:信号;
  • PDU:Protocol Data Unit 协议数据单元,PDU 由 SDU 和 PCI 组成
  • I-PDU:Interaction Layer PDU,由 data、length、I-PDU ID 组成。
  • N-PDU:Network Layer PDU,或 I-PDU Segment,由传输协议模块使用,对 I-PDU 进行分段
  • L-PDU:Data Link Layer PDU,或 Large PDU,一个或多个 I-PDU 被打包成 L-PDU,L-PDU
    是基于总线的,例如 CAN 总线的 L-PDU 就是 CAN 帧;
  • Message:报文;

2、通信模块介绍

首先,从AUTOSAR架构上来说,一个完整的CAN通信的过程涉及到了包括硬件、AUTOSAR中间件和上层应用层软件;在硬件部分来说,涉及到的是CAN 总线CAN的收发器;软件部分的话,涉及到的概念是MCAL(微控制器抽象层)BSW(基础软件层)RTE(实时运行环境)APPL(应用层)等;
其中MCAL部分用到了
通信驱动模块
,而BSW部分使用到了通信服务模块通信硬件抽象模块;由于笔者是做MCAL和BSW的,至于应用层部分的知识就暂且不具体介绍了;

3、CAN通信从软件到硬件过程详解

3.1、自上到下,数据的传递过程是:

应用层–>RTE–>COM–>PDUR–>CANTP–>CAN Interface–>CAN Driver–>CAN controller–>CAN transceiver–>CAN BUS Line

①Com模块获取应用层的信号(Signal),经一定处理封装为IPDU(Interaction Layer Protocol Data Unit)发送到PduR模块;

②PduR根据路由协议中所指定的I-PDU目标接收模块,将接收到的I-PDU经一定处理后发送给CanIf;PduR也可以将部分I-PDU发送给CAN TP模块,处理之后再发送给CANIf;

③CanIf将信号以L-PDU(Data Link Layer Protocol Data Unit)的形式发送给CAN驱动模块;

④ CAN 驱动模块将Message 报文发送给CAN controller;

⑤ CAN controller 与外部硬件的CAN transceiver(CAN收发器)进行CAN 报文的收发;

⑥外部硬件CAN收发器–CAN Transceiver Hardware主要工作内容为,接收CAN bus上的网络信息(通常叫做CAN Frame)相关的信号电平并将其转化为逻辑信息电平转发给CAN Controller,接收从CAN Controller传输过来的逻辑电平信息并将其转化为信号电平传从到CAN bus上。CAN Transceiver有两条线,一条连CAN总线的高电平,一条低电平;
123456

3.2、一些补充

  • CAN transceiver部分通过拉脚,部分通过SPI来控制CAN收发器;
    简单的判断方法是:脚多的使用SPI控制,传输模式命令。脚少的使用一根线来控制模式;
  • CAN transceiver driver 可以走SPI发送控制数据,但一般还是用CAN控制器和CAN收发器来通信的,不要搞不清主次!;如果芯片支持,SPI可以配置成DMA模式,使用DMA来搬运数据;
  • 收发器和控制器可以一对多,具体的情况有待研究;

4、结尾:

通信全流程的知识点真的相当的多,查阅了包括标准文档和其他优秀博主在内的相当多的文章。笔者后面准备在学习中将一个个模块之间的联系总结一下;等着我的更新吧;

有关[ 搞一点AutoSar ]一张图帮你理解CAN通信全过程的更多相关文章

  1. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  2. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  3. ruby CSV : How can I read a tab-delimited file? - 2

    CSV.open(name,"r").eachdo|row|putsrowend我得到以下错误:CSV::MalformedCSVErrorUnquotedfieldsdonotallow\ror\n文件名是一个.txt制表符分隔文件。我是专门做的。我有一个.csv文件,我转到excel,并将文件保存为.txt制表符分隔的文件。所以它是制表符分隔的。CSV.open不应该能够读取制表符分隔的文件吗? 最佳答案 尝试像这样指定字段分隔符:CSV.open("name","r",{:col_sep=>"\t"}).eachdo|row|

  4. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  5. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  6. TimeSformer:抛弃CNN的Transformer视频理解框架 - 2

    Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图

  7. ruby - 易于初学者理解的 Ruby 库 - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭3年前。Improvethisquestion我正处于学习Ruby的阶段,我想查看一些小型库的源代码以了解它们是如何构建的。我不知道什么是小型图书馆,但希望SO能推荐一些易于理解的图书馆来学习。因此,如果有人知道一两个非常小的库,这是新手Rubyists学习的好例子,请推荐!我想使用Manveru'sInnatelib,因为它试图保持在2000LOC以下,但我还不熟悉其中经常使用的Ruby速记。也许大约100-5

  8. ruby - 无法理解 `puts{}.class` 和 `puts({}.class)` 之间的区别 - 2

    由于匿名block和散列block看起来大致相同。我正在玩它。我做了一些严肃的观察,如下所示:{}.class#=>Hash好的,这很酷。空block被视为Hash。print{}.class#=>NilClassputs{}.class#=>NilClass为什么上面的代码和NilClass一样,下面的代码又显示了Hash?puts({}.class)#Hash#=>nilprint({}.class)#Hash=>nil谁能帮我理解上面发生了什么?我完全不同意@Lindydancer的观点你如何解释下面几行:print{}.class#NilClassprint[].class#A

  9. ruby - 混帐 & ruby : How can I unset the GIT_DIR variable from inside a ruby script? - 2

    我编写了一个非常简单的“部署”脚本,作为我的裸git存储库中的post-updateHook运行。变量如下livedomain=~/mydomain.comstagingdomain=~/stage.mydomain.comgitrepolocation=~/git.mydomain.com/thisrepo.git(bare)core=~/git.mydomain.com/thisrepo.gitcore==addedremoteintoeachlive&stagegitslive和stage都初始化了gitrepos(非裸),我已经将我的裸仓库作为远程添加到它们中的每一个(名为co

  10. ruby-on-rails - 在 Ruby 或 Rails 中,hash.merge({ :order => 'asc' }) can return a new hash with a new key. 什么可以返回带有已删除键的新散列? - 2

    在Ruby(或Rails)中,我们可以做到new_params=params.merge({:order=>'asc'})现在new_params是一个带有添加键:order的散列。但是是否有一行可以返回带有已删除key的散列?线路new_params=params.delete(:order)不会工作,因为delete方法返回值,仅此而已。我们必须分3步完成吗?tmp_params=paramstmp_params.delete(:order)returntmp_params有没有更好的方法?因为我想做一个new_params=(params[:order].blank?||para

随机推荐