DBC转Excel;DBC转位定义;Excel转DBC;Excel转位定义;MatrixCreat(一)之CAN矩阵详解

本文深入解读CAN矩阵在汽车行业的应用,详细阐述了CAN总线通信原理、矩阵表结构及其各项参数含义,包括报文格式、数据错误检测、信号定义与处理,以及高效解析方法。

一、摘要

1.描述

本文主要描述的是汽车行业中CAN矩阵的内容,主要描述我们当拿到一份矩阵表的时候如何去看懂内容。

2.关键字

CAN,CAN矩阵,矩阵详解,通信协议,汽车总线。

二、什么是CAN

CAN 是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。在汽车产业中,出于对安全性、舒适性、方便性、低功耗、低成本的要求,各种各样的电子控制系统被开发了出来。

CAN总线是德国BOSCH公司从80年代初为解决现代汽车中众多的控制与测试仪器之间的数据交换而开发的一种串行数据通信协议,它是一种多主总线,通信介质可以是双绞线、同轴电缆或光导纤维。通信速率最高可达1Mbps,我们这儿主要讲的是低速CAN,非CANFD。

1.报文格式

在总线中传送的报文,每帧由7部分组成。CAN协议支持两种报文格式,其唯一的不同是标识符(ID)长度不同,标准格式为11位,扩展格式为29位。

在标准格式中,报文的起始位称为帧起始(SOF),然后是由11位标识符和远程发送请求位 (RTR)组成的仲裁场。RTR位标明是数据帧还是请求帧,在请求帧中没有数据字节。

控制场包括标识符扩展位(IDE),指出是标准格式还是扩展格式。它还包括一个保留位 (ro),为将来扩展使用。它的最后四个位用来指明数据场中数据的长度(DLC)。数据场范围为0~8个字节,其后有一个检测数据错误的循环冗余检查(CRC)。

应答场(ACK)包括应答位和应答分隔符。发送站发送的这两位均为隐性电平(逻辑1),这时正确接收报文的接收站发送主控电平(逻辑0)覆盖它。用这种方法,发送站可以保证网络中至少有一个站能正确接收到报文。

报文的尾部由帧结束标出。在相邻的两条报文间有一很短的间隔位,如果这时没有站进行总线存取,总线将处于空闲状态。

2.数据帧格式

远程帧:
远程帧由6个场组成:帧起始、仲裁场、控制场、CRC场、应答场和帧结束。远程帧不存在数据场。
远程帧的RTR位必须是隐位。
DLC的数据值是独立的,它可以是0~8中的任何数值,为对应数据帧的数据长度。

错误帧:
错误帧由两个不同场组成,第一个场由来自各站的错误标志叠加得到,第二个场是错误界定符
错误标志具有两种形式:
活动错误标志(Active error flag),由6个连续的显位组成
认可错误标志(Passive error flag),由6个连续的隐位组成
错误界定符包括8个隐位

超载帧:
超载帧包括两个位场:超载标志和超载界定符
发送超载帧的超载条件:
要求延迟下一个数据帧或远程帧
在间歇场检测到显位
超载标志由6个显位组成
超载界定符由8个隐位组成

3.数据错误检测

循环冗余检查(CRC):
在一帧报文中加入冗余检查位可保证报文正确。接收站通过CRC可判断报文是否有错。

帧检查:
这种方法通过位场检查帧的格式和大小来确定报文的正确性,用于检查格式上的错误。

应答错误:
如前所述,被接收到的帧由接收站通过明确的应答来确认。如果发送站未收到应答,那么表明接收站发现帧中有错误,也就是说,ACK场已损坏或网络中的报文无站接收。CAN协议也可通过位检查的方法探测错误。

总线检测:
有时,CAN中的一个节点可监测自己发出的信号。因此,发送报文的站可以观测总线电平并探测发送位和接收位的差异。

位填充:
一帧报文中的每一位都由不归零码表示,可保证位编码的最大效率。然而,如果在一帧报文中有太多相同电平的位,就有可能失去同步。为保证同步,同步沿用位填充产生。在五个连续相等位后,发送站自动插入一个与之互补的补码位;接收时,这个填充位被自动丢掉。例如,五个连续的低电平位后,CAN自动插入一个高电平位。CAN通过这种编码规则检查错误,如果在一帧报文中有6个相同位,CAN就知道发生了错误。

三、CAN矩阵

在汽车行业开发的过程中,凡是挂在CAN总线上的产品,客户都会给一份CAN矩阵表,如何去读懂CAN矩阵表显得尤为重要,前面我们讲了CAN的基本概念,相信大家对CAN有一个初步的了解,下面我以某个车厂的CAN矩阵表为例来说明。

1.矩阵表

在这里插入图片描述

2.报文名称

Msg_Name主要是通过名称就能区分我们平时描述的是哪条报文,这个名称一般是唯一的,就像人的名称一样,一般客户也不是随便定义该名称,当然这个名称也可以随意定,一般定义的格式就是该报文发送的节点加上报文的标识符。
例如.BCM_ALS_0x2F3 代表BCM_ALS为节点BCM转发ALS发送的报文,报文标识符为0x2F3。

3.报文类型

Msg_Type主要描述的是报文类型,在汽车行业中,报文主要类型有应用报文,网络管理报文,诊断报文。
应用报文 Normal: Normal Communication message;
网络管理报文 NM:Network Mangment message;
诊断报文 Diag: Diagnostic message。

4.报文标识符

Msg_ID是Message identifier的缩写,在矩阵表中,一般同一个报文标识符的内容放在一起,方便他人阅读,这个标识符是我们CAN总线上的唯一标识符,不可与其他信号重复,在矩阵表中,一般加上0x开头,代表16进制显示,在前面已经提到过在标准帧CAN的标识符大小为11位,所以一般大小为0x00 - 0x7FF;扩展帧我们这儿不做描述,因为一般车厂使用的都是标准帧,很少采用扩展帧。

5.报文发送类型

Msg_Send_Type表示的是报文发送的类型,在汽车行业中,报文发送的类型一般主要有事件型,周期型,周期事件型,使能型,周期使能型等,其他的类型我在这儿不做描述。

  • 事件型(Event)
    事件报文的发送取决于事件是否触发,事件发生改变时,按照矩阵发送事件报文,非触发事件发生改变时不允许触发发送事件报文,事件型报文一般车厂都会要求一个事件触发的时候发送多次,为了避免报文丢失,每帧之间也会限定一个帧与帧之间的最小间隔。下图为最小间隔20ms,当在事件报文发送 20ms 之后有新的事件发生,则发送新的事件报文,丢弃上一个事件报文;当在事件报文发送 20ms 之内有新事件发生,则新事件报文延迟到 20ms 之后发送。
    在这里插入图片描述
  • 周期型(Cycle)
    报文以一定的间隔时间循环发送,报文的发送周期在矩阵表都会有体现,开发的时候必须
### CAN总线矩阵的概念与实现 #### 什么是CAN矩阵? 控制器局域网(Controller Area Network, CAN)是种用于嵌入式系统的串行通信协议,广泛应用于汽车电子领域。CAN矩阵是指种逻辑结构,它定义了车辆内部不同ECU(Electronic Control Unit)之间的消息映射关系以及信号传输路径[^1]。具体来说,CAN矩阵描述了哪些节点可以发送特定的消息,哪些节点能够接收这些消息,并规定了每条消息的时间特性、优先级和其他属性。 #### CAN矩阵的主要组成部分 - **Message ID**: 唯标识符,用来区分不同的数据帧。 - **Signal Definitions**: 定义了每个信号的名字、长度、初始值及其物理意义。 - **Transmitter Nodes**: 明确指出哪个或哪些ECU负责某类信息的广播。 - **Receiver Nodes**: 列出了应该监听并处理该类别信息的所有目标设备列表。 - **Timing Parameters**: 包含周期时间、超时设置以及其他与时序有关的要求。 #### 实现方式 在实际开发过程中,工程师通常会借助专用工具来创建和维护复杂的CAN数据库文件(如DBC格式),这实际上就是所谓的“CAN Matrix”。通过这样的软件环境,开发者不仅可以直观地编辑上述提到的各项参数配置项,还可以模拟测试整个网络的行为表现是否符合预期设计标准。 对于具体的硬件层面而言,在基于微控制器构建支持CAN接口的应用场景下,往往需要初始化相应的寄存器以启用中断机制、设定波特率等基础功能;与此同时也要编写应用程序代码完成高层协议栈解析工作——即将接收到的数据按照预定规则提取有用部分交给后续业务逻辑单元进步处置或者反过来组装待发包体再经由底层驱动程序提交给外设芯片执行真正的电气层操作过程。 下面给出段简单的伪代码示例展示如何利用Python配合第三方库`can`来进行基本收发动作演示: ```python import can def send_message(bus): msg = can.Message(arbitration_id=0x7de, data=[0, 25, 0, 1, 3, 1, 4, 1], is_extended_id=False) try: bus.send(msg) print("Message sent successfully.") except can.CanError: print("Failed to send message.") if __name__ == "__main__": bustype='socketcan_native' channel='vcan0' # Virtual CAN interface; replace accordingly. with can.interface.Bus(bustype=bustype, channel=channel) as bus: while True: send_message(bus) ``` 此脚本片段展示了怎样建立连接至指定虚拟CAN通道上的实例对象并通过调用其成员函数向总线上投放标准化格式化后的二进制序列流表示形式之种可能版本而已[^1]。
评论 14
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值