首页 > 其他分享 >一帧CAN报文的收发流程

一帧CAN报文的收发流程

时间:2024-08-07 14:25:14浏览次数:14  
标签:调用 一帧 报文 信号 收发 模块 Com signal

一帧CAN报文的收发流程

概述

介绍总线通讯的文章有很多了,各种平台,CSDN\知乎、电子发烧友等等。

扪心自问,你真的懂了吗? 还是和大多数人一样,浅尝辄止,仅仅了解了一些分层的概念,就停滞不前了?

附赠自动驾驶最全的学习资料和量产经验:链接

认识事物的逻辑可不是这样的。

autosar实际上是一套很固化的东西。我们要想在实际工程项目中用得好,还是要在根上去研究透;

本文介绍下一阵CAN报文的数据;

本文主要介绍CAN自下而上以及以上而下在AUTOSAR架构下的通信流程。

首先介绍下信号数据流:

image

从上层到总线

不清楚可以看下图,可以先熟悉下大体经过的层级;

image

Autosar CAN 总线信号的数据流传递。

然后呢,还要再熟悉下,流程中会经过的模块:

再不清楚,可以看下图:

image

这里注意下,一般应用报文是不会经过Tp层的, 只有诊断报文会经过Tp层进行传输;

应用报文直接从CANif 到PDUR层次;

1、接收

1.1 各模块参与过程

Can接收功能需要使用到通知(Indication)服务,在Autosar架构中,由(Bsw调度周期性的Can_MainFunction_Read),现项目是Can_17_McmCan_IsrReceiveHandler放在Can中断中,会根据Rx的缓冲区类型来选择处理函数,但是不管什么类型的缓冲区,最终都会调用Can_17_McmCan_lRxExtractData将数据从缓冲区中读出来,然后将消息对象信息分配给RxMailBoxInfo【RxMailBoxInfo中包括CanId,对应的Hoh,和ControllerId】,Rx Pdu信息分配给RxPduInfo【RxPduInfo中包括 指向Ddu数据的指针*SduDataPtr,Sdu长度】,最后调用CanIf_RxIndication通知CanIf向上传输,调用关系如下图

image

image

数据流

BSW调度器周期性调用CAN Driver模块的Can_MainFunction_Read函数;

CAN Driver模块的Can_MainFunction_Read函数将访问CanController(硬件)的寄存器—仲裁寄存器,数据寄存器和数据长度寄存器(保证读取数据的有效性),并读取这些寄存器的数据;

数据读取结束后,这时继续调用CAN Interface模块的CanIf_RxIndication函数,这样数据从CAN Driver模块传给了上一层的CAN Interface模块;

CAN Interface模块再调用PduR模块的PduR_RxIndication函数,将数据传到PduR模块;

PduR模块路由到Com模块,调用Com_RxIndication函数,将数据传到Com模块,Com模块将会把数据存入其缓存,供应用层软件读取使用。

1.2 接收报文在com层的处理

image

接收报文在com层,将i-pdu拆解成signal,具体如下:

Step 1 :

由PduR调用Com_RxIndication向上通知Com层接收Pdu,

在Com_RxIndication中:

1、调用Com_ResetUpdateDMTime,为基于I-Pdu的监控重置接收截止时间监控定时器(DM){有ub的signal/signal group且ub不为1的除外}

2、调用Com_RxPduHandle

3、如果ComIPduSignalProcessing配置为immediate,则调用Com_IndicationProcess立即处理pdu接收,带有ub的signal/signalgroup检查ub是否为1,不带ub的signal/signalgroup直接继续处理,调用Com_SignalRxIndication / Com_SignalGroupRxIndication

4、signal处理 : Com_SignalRxIndication中,对信号类型为COM_UINT8_N和COM_UINT8_DYN另外处理,不为此类型的调用Com_RxSignalHandle ;

①、字节序转换:Com_RxSignalUnPack;

②、信号值有效判断 :若使能了信号无效通知,则调用ComInvalidNotification函数,若没有使能,则调用Com_RxSignalReplaceHanlde将信号值替换成原始值;

③、过滤条件判断;若全通过,则第6步

5、signalgroup处理 : ①、signalgroup信号值有效判断,若无效则调用通知函数;

②、过滤条件判断;若全通过,则第6步

6、调用ComNotification函数,此通知函数为Rte_COMCbk_signal/signalgroup_name,调用Com_ReceiveSignal/signalgroup,将数据通过Rte向上传输;

2、发送

2.1 在com层的处理

image

对于发送报文在com层,将signal封装成i-pdu调用Pdur_ComTransmit向下传输,那在com层都做了哪些处理呢?(周期发送报文)

在SWC_EcuMon,通过周期调用的发送处理函数中,调用Rte_Read_xx将Signal数据从xx中读出,需要过E2E(信号组中带有checksum和alive counter)的信号组调用对应的E2E_xx_signalgroupname处理函数,最后调用Rte_Write_com_(signalgroupname)将读出的数据和E2E中的counter、checksum值通过Rte传入com层(调用Com_SendSignal/group)

Step 1 :

上层的SWC通过Rte调用对应的Signal/Signal Group接口(Com_SendSignal/group),

在Com_SendSignal中:

信号发送模式处理 Com_TxSignalTMHandle

更新发送信号的buffer,检查信号value是否更新

第2步信号值更新后,将Tx Signal 打包到Tx buffer(字节序转换和符号扩展在这一步中)

set update bits

添加信号的发送属性以及选择报文的发送模式

在第3步时已将更新signal value到Com_TxIPduRuntimeBuff[COM_TXIPDUBUFF_SIZE]缓冲区中

Step 2 :周期调用的Com_MainFunctionTx中:

DMCnt计数(超限监控),超时后调用Com_TxDMTimeOutNotification

报文的发送模式确认(TMS)

调用Com_MainFunction_SendPdu,发送pdu

在Com_MainFunction_SendPdu中:

在调用PduR_ComTransmit之前可以配置ComIPduCallout,在Callout中实现一些特殊功能

Com_TxIPduRunTimeState[txIpduId].Transmiting = TRUE; // 在调用PduR_Transmit之前设置发送标志,避免在设置发送标志之前出现TxConfirmation

调用PduR_ComTransmit

第2步返回E_OK后调用Com_ClearTxIPduUpdates清除该pdu所有信号和信号组的UB位

PduR_ComTransmit --> CanIf_Transmit --> CanWrite

涉及一阵can通讯的内容还有很多。但是多说无益,希望大家可以结合自身项目,使用Debug工具,对于一帧信号的传输进行逐步的调试,这样,慢慢的,就可以逐步掌握数据流;

标签:调用,一帧,报文,信号,收发,模块,Com,signal
From: https://blog.csdn.net/liuphahaha/article/details/140991166

相关文章

  • 笔记:从Aurora 8b/10b 到Aurora 64b/66b (三):自定义PHY层收发
    相较于8/10来说没那么复杂,需要考虑的情况只有八种;但是gearbox的控制需要额外的心思:每三十二周期所有操作都需要停止;这一点在收发都需要注意;RX:核心思想是利用header做检测,将夹杂在数据流中的控制包滤除掉;modulegt_phy_rx(inputwirei_rx_clk......
  • SAP PO接口报文保存到内表中
    有一个需求,接收PI传数据过来后,除整理数据保存到用户数据表外,在后期还需要把报文加工一下(要求报文内容与原接收报文一致,只是补加少量值),在发送到其它的系统。由于数据接收后已对数据加工到了用户表,已没有原报文内容(比如金额已累计),如从用户数据表中再取出数据整理加入发送出去,一是......
  • HTTP报文:“请求报文“和“响应报文“详解
    在网络通信的世界里,HTTP协议扮演着至关重要的角色。它是客户端与服务器之间对话的语言,允许数据的请求和响应。本文将深入探讨HTTP报文的两个核心组成部分:请求报文和响应报文,揭示它们如何共同构建了网络通信的基础。......
  • 串行通信协议--UART(Universal Asynchronous Receiver/Transmitter,通用异步收发传输器
    一、UART简介  UART广泛应用于微控制器和计算机之间的数据通信,如GPS模块、蓝牙模块、GSM模块等。UART是一种通用串行数据总线,用于异步通信,该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用于主机与辅助设备通信UART通常被集成于其他通讯接口的连结上。UA......
  • HCIE学习笔记(持续补充更新):OSPF 五种报文、LSA
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、OSPF基础1、OSPF三张表2、OSPF建立邻接关系的过程2.1建立邻居关系2.2主/从关系协商、DD报文交换2.3、LSDB同步(LSA请求、LSA传输、LSA应答)二、OSPF报文OSPF报头1、OSPFHello报文(选DR、B......
  • vue连接mqtt实现收发消息组件超级详细
    vue连接mqtt实现收发消息组件超级详细基本概念:MQTT(MessageQueuingTelemetryTransport)是一种基于发布/订阅模式的轻量级消息传输协议,专为低带宽、高延迟或不稳定的网络环境设计。以下是MQTT实现收发消息的基本原理:客户端-服务器模型:MQTT基于客户端-服务器模型工作。客户......
  • 高速收发器(一)
    什么是高速收发器(GTX)FPGA中的通信协议分为低速协议和高速协议,常见的低速协议有UART、SPI、I2C等,这些协议的通信速率较低使用FPGA内部逻辑就可以实现;常见的高速协议有PCIe、以太网、Auraro、SRIO等协议,利用FPGA内部的时钟、LUT是无法实现的,假如线速度为1G,则FPGA内部需要跑到1G......
  • RK3568之修改8250驱动实现RS485收发的自动切换
    最近项目需求,要用到RK3568搭配自制底板。整个软硬件联调过程并不顺利,特立此系列帖,记录调试中发生的一些问题和解决办法。文章目录前言调试过程及问题解决办法1.硬件修改2.软件解决1.修改设备树文件2.查找设备树对应的串口驱动文件3.修改serial.h2.修改8250_dw.c2.修改......
  • [米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-26 RS485串口程序收发环路设计
    软件版本:Anlogic-TD5.9.1-DR1_ES1.1操作系统:WIN1064bit硬件平台:适用安路(Anlogic)FPGA实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板板卡获取平台:https://milianke.tmall.com/登录"米联客"FPGA社区http://www.uisrc.com视频课程、答疑解惑! 1概述在前面的课程中,我......
  • 我必须每秒捕获一帧的时间戳,但无法捕获整个事件。我能得到的最接近日期是“YYYY-MM-DD
    我正在尝试从左上角的一帧速率的视频中获取时间戳。我只能得到日期,不能得到整个时间戳。帮我获取整个时间戳我正在共享一个在预处理视频后得到的窗口。我本来希望获得整个时间戳,但我无法做到。我想要一个json文件中的整个时间戳,例如“2024-03-2916:36:20”,并且每个帧都......