上篇文章简介了AUTOSAR架构的CAN Driver模块,本文将更进一步,来了解CAN Driver模块对接的唯一上层模块--CAN Interface。


9 CAN interface

CAN Interface,顾名思义,CAN接口模块,位于下层的CAN设备驱动(CAN Driver,CAN收发器驱动)和上层的通讯服务层(CAN传输协议层,Pdu Router等)之间,如下图1所示。

图1 AUTOSAR CAN Layer Model,引自[1]

引自[1]:
CAN接口模块由所有与CAN硬件无关的任务组成,这些任务属于相应ECU的CAN通讯设备驱动程序。这些功能在CAN接口模块中执行一次,以便底层CAN设备驱动程序只专注于访问和控制相应的特定CAN硬件设备。
CAN接口模块满足PDU路由器和上层通信Com模块的主控制流和数据流要求:发送请求处理、发送确认/接收指示等。它的数据处理和通知API是基于CAN L-SDU,而用于控制和模式处理的API提供了一个与CAN控制器相关视角。

对于CAN Driver来说,与上层模块通讯的唯一接口就是CAN接口模块,通过这个模块可实现我们熟知的3个ECU通讯功能

  • CAN通讯,通过接口层到PDU Router模块;(路径:CanDrv--CanIf--PduR--Com)
  • UDS服务,通过接口层到CANTp模块;(路径:CanDrv--CanIf--CanTp--PduR--Dcm)
  • XCP服务,通过接口层到XCP模块。(路径:CanDrv--CanIf--XCP)
图2 通讯功能相关模块

本文关注的是CAN通讯功能,继续采用上篇文章menghuyouyou:CAN通讯系列--AUTOSAR架构的CAN Driver6 的思路来介绍CAN接口模块。

考虑到本文主要基于参考[1]而来,不打算对某些细节展开说明,将主要介绍CAN发送和接收相关的函数。若真有需要研究CAN通讯在CAN接口模块的具体实现,则肯定需要对实现细节一一研究,比如上篇文章提到的CAN接收和发送的前提条件有哪些,是什么。接下来我们来CAN接口模块的发送和接收操作:

9.1 发送操作

由前面内容可知,发送时,PduR模块调用CanIf_Transmit函数,然后CanIf_Transmit函数再去调用Can模块的Can_Write函数。

图3 经Can Interface的发送过程

文档对CanIf_Transmit函数的定义和描述如下:

图4 CanIf_Transmit函数的定义,引自[1]

这个函数两个输入参数,由TxPduId可解析出相应的CAN控制器和Hth,具体如何实现解析的,后文会解释;PduInfoPtr包含数据的长度和内容两个信息,即要发送的数据。关于这个函数大致的动作描述如下:

图5 CanIf_Transmit的动作说明,引自[1]

注意:如果Can_Write函数返回CAN_BUSY,即发送拒绝,CanIf可以什么都不做,也可以尝试存储一条新的PDU或发送请求到发送缓存器中;如果发送成功,Can模块将通过调用CanIf_TxConfirmation通知Can接口模块,有两种调用方式:一种是采用轮询模式,如下图6,另一种则是采用中断模式,如下图7。

图6 经Can Interface的轮询模式发送确认
图7 经Can Interface的中断模式发送确认,引自[1]

文档对CanIf_TxConfirmation函数的定义如下,使用Id形式与上层确认发送成功。

图8 CanIf模块的确认函数定义,引自[1]

这个函数将根据输入的CanTxPduId进行处理:首先确认功能(CAN通讯?UDS服务?XCP服务);然后根据输入的CanTxPduId查询获得已映射的TxPduId,最后再调用上层模块的User_TxConfirmation函数,如图9所示。

图9 PduR模块的确认函数定义,引自[1]

这里不确定具体哪个模块,而使用User,这样就使得软件通用性好。从上可知:CAN通讯,User选择为PduR模块; UDS服务,User选择为CanTp模块; XCP服务,User选择为XCP模块。

以上就是发送操作的大致过程,更多具体细节详见[1]。

9.2 接收操作

由前面内容可知,接收时,Can模块将调用Can接口模块的CanIf_RxIndication函数,然后再调用PduR_RxIndication函数,如下图10所示。

图10 经Can Interface的的接收通知,引自[1]

文档对CanIf_RxIndication函数的定义如下:

图11 CanIf模块的通知函数定义,引自[1]

这个函数参数有Mailbox和PduInfoPtr,这两者包含Hrh, CanId, DLC和data这些信息。概括地讲,该函数包含的动作有:

当CanIf_RxIndication函数执行完上述动作后,将调用User_RxIndication函数向上通知,实际CAN通讯功能调用的是PduR_RxIndication函数。

图12 CanIf的上一层模块的接收通知函数,引自[1]

了解上述相关函数的基本内容后,若要更清晰地理解CAN通讯的发送和接收过程,还需要注重从数据流角度来看,即CanId,收发数据是如何向上或向下传输。这里需要介绍CanId的传输,实际上,CanId通过映射方式来转化为相应模块的ID。

9.3 ID的相关映射

CAN接口模块设计的初衷就是不能直接访问硬件,与硬件保持独立,这也就意味着CAN接口层只能通过CAN模块的接口去获取硬件有关的内容,主要使用的CAN模块接口有Hth和Hrh。关于Hth和Hrh,首先涉及一个软件过滤选择问题,即当Hth和Hrh配置成BasicCAN,则需要在CanIf模块执行软件过滤;当Hrh和Hth配置成FullCAN,则不需要在在CanIf模块执行软件过滤,而是在硬件过滤。然后进入上述提到的CanId映射方式,即不同CanId如何映射到Hrh和Hth,以及Hrh和Hth又如何映射到更上层模块(暂称为PDU Id),如下图13所示。

图13 PDU Ids和Hoh的映射,引自[1]

总的来说上图非常清晰地展现了各种Id的映射,但为了更好理解,下面详细介绍:

首先,我们知道CAN Controller中有很多硬件对象处理器(Hoh), 在CAN Driver中将Hoh作为接收和发送用途,接收的叫做Hrh, 发送的叫做Hth。然后将Hrh和Hoh分别与对应的CanId映射起来,如下图14所示。

图14 Hoh--(Hrh, Hth)-- CanId映射示意

再分别定义CAN模块与CAN接口模块的Hrh和Hth的映射,如下图15。

图15 (Hrh--CanIf Hrh), (Hth--CanIf Hth)

最后建立CanIf Hrh与RxPduID,CanIf Hth与TxPduID的映射,如图16,即对于CAN通讯功能,建立起了CAN接口模块与PduR模块的ID映射。

图16 (CanIf Hrh--RxPdu ID), (CanIf Hth--TxPdu ID)

建立了上述几种映射后,就非常好理解不同模块的相关函数的参数关系(比如indication函数和confirmation函数)。以接收indication函数说明,如下图17所示。

图17

即CAN模块读取相关寄存器的数据,其中建立CanId与Hrh的映射1,且两者均为Mailbox的元素;数据长度和数据为PduInfoPtr的元素。将这些信息传递给上一层CAN接口模块,CAN接口模块根据建立的Hrh与CanIf Hrh的映射获取CanIf Hrh,CanIf Hrh根据建立的CanIf Hrh与RxPduId的映射2获取RxPduId。最后,将RxPduId和CAN模块传输的数据传递给PduR模块。通过这个过程不难发现,如果已知RxPduId,则可知对应CanId是多少,反之亦然。

如果有过AUTOSAR工具配置经验,不难发现配置过程大体是按照这种逻辑去建立各种映射关系,且配置过程中Id设置要特别注意,必须得对应正确,才能保证功能正确。


通过这两篇文章对CAN模块和CAN接口模块的介绍,基本理顺了从硬件到软件的数据传输和软件实现的过程,如下图18上半部分。也就是软件在这个部分已经获得了相应CanId的8个字节数据,那么下一步自然要做的就是将接收的这8个字节数据解析成相应报文协议定义的各个信号,或将发送的信号打包成8个字节的数据。从下篇文章开始介绍图18的下半部分内容。

图18

Reference:

[1] Specification of CAN Interface.

tms570 can 接收大量数据_CAN通讯系列--AUTOSAR架构的CAN Interface7相关推荐

  1. tms570 can 接收大量数据_CAN通讯系列--CAN总线基础3

    上篇文章讲述了CAN总线的特点,以及CAN协议帧的基础知识,包括数据帧和遥控帧.本文将在此基础上通过相关的协议标准,寄存器和整车控制器CAN通信报文来进一步深化CAN协议帧的理解,同时可了解到一个简单 ...

  2. 2个相同的 stm32 can通讯不成功_CAN通讯系列--CAN通讯简介1

    1 CAN通讯简介 1.1 什么是通讯 为了更好地理解CAN通讯概念,我们借助人与人之间的通讯形式来了解汽车的这种内部通讯模式.当然,首先我们得清楚什么是通讯: "通讯是两个或两个以上参与者 ...

  3. tms570 can 接收大量数据_超全!嵌入式必懂的CAN总线一文讲通了

    嵌入式的工程师一般都知道CAN总线广泛应用到汽车中,其实船舰电子设备通信也广泛使用CAN,随着国家对海防的越来越重视,对CAN的需求也会越来越大.这个暑假,通过参加苏州社会实践,去某船舶电气公司实习几 ...

  4. STM32 USB数据接收与数据发送程序流程分析

    既然学习了USB,那就必须的搞懂USB设备与USB主机数据是怎么通讯的.这里主要讲设备端,因为我们的代码是做USB设备用的. 我们需要必须要定义了USB中断.起始在STM32的中断向量表中给USB两个 ...

  5. 看清接收网络数据包的全过程

    接收网络数据包的过程,从数据包到达网卡的物理接口开始,然后由网卡的驱动程序交给网络协议栈,最后经过协议栈的一层层处理之后交给应用程序.大致上是这样的过程,但实际上有更多的细节.本文中主要介绍第一个和第 ...

  6. ModbusPoll和ModbusSlave使用(搭配VSPD,串口接收发数据)

    modbuspoll和modbusSlave在通讯上有五种方式,本篇介绍的是其中关于Serial Port串口的通讯 使用VSPD虚拟串口,创建虚拟端口COM1和COM2 Modbus Poll和Mo ...

  7. 【模块间的通讯】数据接口及通讯代理系统架构

    系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录 前言 为什么需要数据接口及通讯代理系统架构 解决这种数据接口问题和一对一通 ...

  8. 51UWB单片机连接ESP8266实现Wifi接收串口数据

    UWB定位需要电脑读取UWB基站的串口数据来读取距离信息,用wifi连接可以实现远程接收串口数据方便连接.这里记录一下如何让51UWB单片机接入WiFi模块ESP8266. 前置条件: 单片机完成基站 ...

  9. QT多线程接收串口数据

    ** QT多线程接收串口数据 ** 1.前言 QT多线程的使用,和绝大数人一样,犯了错误(请查阅Qt开发人员( Bradley T. Hughes)Blog中的文章 you are-doing-it- ...

最新文章

  1. js 判断数据类型的几种方法
  2. 中文分词最佳记录刷新了,两大模型分别解决中文分词及词性标注问题丨已开源...
  3. ubuntu查看版本及检查是否有系统更新的命令
  4. 数学的列向量内积计算方法
  5. C++关联容器总结一
  6. oracle em界面监控出来的奇怪图像_海康poe主机断电重启后不出图像,显示用户被锁定...
  7. idea部署项目com.intellij.javaee.oss.admin.jmx.JmxAdminException-未使用最新版本的war包
  8. mysql 命令备忘
  9. 一万块是存入支付宝里的余额宝好还是存在微信的零钱通里好?
  10. 编写一个Java程序将当100,101,102,103,104,105个数以数组的形式写入到Dest.txt文件中,并以相反的顺序读出显示在屏幕上。
  11. php中怎么引用js变量_理解下 Go 中的引用是怎么回事
  12. 【HUD2072】单词数(字典树-统计一句话中不同单词的个数)
  13. windows android装应用,以IT之家为例,Win10 Mobile安装安卓APK应用体验如何?
  14. 文件IO(IO编程)
  15. 2021-02-20
  16. 【计算机网络】谢希仁笔记 数据链路层
  17. 谷歌浏览器插件迁移到火狐浏览器
  18. java队列打印杨辉三角_数组打印杨辉三角与队列打印杨辉三角
  19. 获取海康摄像机的rtsp流,并用VLC测试
  20. 如何注册和申请阿里云域名?

热门文章

  1. javafx应用启动自动执行函数_一张图,理顺 Spring Boot应用在启动阶段执行代码的几种方式...
  2. SQL语言之DQL语言学习(十一)分页查询
  3. python里读写excel等数据文件的6种常用方式
  4. Python 常见语法逻辑错误收集
  5. 解析Python中的条件语句和循环语句
  6. Python中比元组更好用的namedtuple
  7. 【常用】linux 命令是什么的缩写(命令缩写)?vi快捷键,linux操作,c语言缩写,计算机相关,其他缩写,xshell操作,apt-get命令大全
  8. margin和padding分别适合什么场景使用?
  9. 网络编程 数据报是什么?TCP、UDP数据报结构
  10. Markdown 如何编写表格(格式)?