CAN总线协议

news2024/9/23 21:22:34

阅读指引:

  1. 术语过多,故各术语在第一次出现时解释,跳读时遇到不明的词可向上搜索看看;

  1. 信息量过大,很多细节没有展开,正文只写多数人可以了解的基础知识,请按需点击文中链接详情。

1 综述

CAN,Controller Area Network,直译是控制器局域网,如字面意思是连接多个控制器的一种网络结构。它具体是以总线(bus)拓扑结构连结、按特定数据协议传输的,因此中文常叫做CAN总线。首次发布于1986年的CAN历史悠久,有众多公司和组织参与优化完善,2015年发布了第二代CAN FD,2020年推出第三代CAN XL。CAN的软硬件实现方式已形成ISO国际规范(specification),其网络数据传输方式也称为CAN协议,不过CAN协议只定义了物理层和数据链路层。基于CAN的应用层协议也很多,最典型的是OBD汽车诊断。由于实现和维护都较简单,CAN已被用于汽车外的很多领域。

围绕CAN底层的软件开发都属于嵌入式开发领域,需要查阅众多规范,并对C语言和芯片寄存器控制有深入了解。总体来说门槛较高,但日常写代码的工作量减少,时间多花在设计调试上。类比我们熟知的领域,CAN的应用层开发就像是使用了底层有自动重传机制的UDP广播,这是相对简单的。

CAN的数据链路层协议是由硬件芯片实现的,和我们日常用的网卡一样,所以出故障的可能性极小。而应用层的业务需求通常都较简单,很容易复现,在开发自测阶段应能发现和解决。在真实应用中,故障基本都出在物理层——某种原因导致的断路。

2 应用领域

CAN的诞生是为了解决汽车中ECU(Electronic Control Unit,电子控制单元)间的数据交互问题。随着大规模应用检验和规范完善,CAN目前还被用于很多工业自动化领域,例如:

  1. 工业机械设备:包装、塑料成型、纺织、耕种、冷冻柜、打印机、半导体制造、磨刀砂轮等

  1. 其它交通领域:火车内通信、售票机、滑翔机、轮船、潜艇、摩托车等

  1. 建筑自动化:电梯

  1. 医疗系统:手术室、病床、血液分析仪等

  1. 餐厅设备:咖啡机

  1. 实验室设备:核子研究、磁学与物理性质测量等。

3 优劣

车载网络拓扑结构选择的考虑点有:成本、可靠性、时延和带宽速率。注:拓扑结构基础知识参考百度百科-拓扑结构。

选择CAN的考虑点:

  1. 跟其它拓扑结构(星形、环形等)比,总线结构能省线材。线材少意味着成本少,布线工作量少,车能减重就能降能耗。汽车线束重量每增加50kg,每百公里油耗会增加0.2L。优化车载网络设计,能减少9~17kg,电缆长度缩短200~1000m。

  1. 可靠性,在物理层表现为通过差分电压和屏蔽双绞线抗电磁干扰,数据链路层主要表现在加入CRC检验等多种措施来发现错误,还有关闭节点发送功能来防止持续错误。

  1. 跟传统以太网的数据链路层比(我们熟知的“MAC地址”在这一层),CAN每帧(frame)的bit更少

  1. 跟车载以太网比,车载以太网在成本、带宽上胜出,但延时较大、实现较复杂,且沿用CAN的系统设计改动少,还需时日才能替换。

简单地说,各类网络的选择都已经取得成本和带宽间的平衡,没有绝对的优劣,CAN就是成本和带宽双低。车载网络的开发模式是先设计后选择,而不是先选择高性能且贵的部件。

多种车载网络的对比,请参考文章:智能汽车中的CAN会被以太网替代吗?

4 层次模型

多节点示意图:

从图中可知:

  1. 各节点通过两根导线相连,是并联的关系。

  1. 通过提高CAN_H导线的电压且降低CAN_L导线的电压,来实现发数据。即默认电压代表数字“1”,电压变化后为“0”。

  1. 一方发数据改变电压,全体都能检测到。这也就是广播。

  1. 发数据的时候也能同时监听。如果同一时刻,自己发“1”不会改变电压,而别人发“0”改变了电压,这就能知道除了自己还有别人在发数据。此时就需要冲突仲裁和排错机制,见下文。

典型的单节点层次模型与作用:

注:

  1. 实际的系统(电路)设计更复杂,见下文的MCU方案。

  1. SOC:System on Chip,系统级芯片。日常交流中意为ECU的主控芯片。

  1. BootLoader:嵌入式系统的系统引导程序,相当于PC的BIOS。请参考百度百科-BootLoader。

  1. SPI:Serial Peripheral Interface,串行外设接口。它可以使单片机与各种外围设备以串行方式进行通信以交换信息。外围设备包括Flash存储、网络控制器、LCD显示驱动器、A/D转换器和MCU等。

  1. MCU:Micro Control Unit,微控制单元,也叫单片机。具体介绍请参考百度百科-MCU。

  1. TX/RX:transmit发送/receive接收 的缩写。

特别注意:

  • 狭义的CAN,指的是物理层和数据链路层。简单地以“CAN”作为关键字去搜索,都是这两层的知识。

  • 广义的CAN,包括应用层协议,主流有3种,互不兼容,见下文。

下文如无说明是“应用层”的内容,默认指狭义CAN。

5 分层介绍

5.1 历史与类型版本

CAN协议有多个版本和类型,需要做好区分。

先整理术语如下:

  • BOSCH:德国 博世 公司,CAN的发明者,全球第一大汽车技术供应商。

  • 中国官网:https://www.bosch.com.cn/

  • CiA:CAN in Automation,德国的CAN自动化协会,有很多家成员单位,是一些CAN规范的提出者。

  • 官网:https://www.can-cia.org

  • 百科百科:https://baike.baidu.com/item/CIA/920128

  • SAE:Society of Automotive Engineers,美国汽车工程师学会,一些CAN规范的提出者。自动驾驶级别(即日常说的L2、L3等)的美国标准也是由它定。

  • 官网:https://www.sae.org/

  • 百科百科:https://baike.baidu.com/item/SAE/3657709。

  • ISO:International Organization for Standardization,国际标准化组织,目前的CAN标准维护者。

  • 官网:https://www.iso.org/

  • 经典CAN:Classical CAN,指CAN FD之前的规范,包括BOSCH发明的CAN 1.0、2.0以及ISO收编后的ISO 11898-1协议。

  • CAN FD:CAN with Flexible Data rate。业界称为第二代CAN总线。

  • CAN XL:CAN Extra Long。业界称为第三代CAN总线,由CiA提出,主要为了跟车载以太网竞争。CiA对它的官方介绍:Controller Area Network Extra Long (CAN XL)

  • CAN frame/帧:有两种,以帧中的ID段的bit位数区分。有【CAN 2.0A规定的11bit ID的标准帧】和【CAN 2.0B规范的29bit ID的扩展帧】。

简史:

  1. 1983年,BOSCH开始内部开发车身网络(in-vehicle network)

  1. 1986年,BOSCH在SAE大会发布CAN

  1. 1991年,BOSCH发布CAN 2.0,包括2.0A和2.0B两部分(即标准CAN和扩展CAN)注:CAN2.0比1.0多了扩展帧的定义,跟高低速CAN没有关系总线上可同时有标准帧和扩展帧。

  1. 1993年起,ISO收编发布CAN规范

  1. 2015年,ISO发布CAN FD。CAN FD实际是从2011年开始开发。

  1. 2020年,CiA推出CAN XL。

以上仅需理解“历史悠久,参与者众多”即可。详细请参考:汽车的中枢神经系统——CAN总线简介。

各类CAN速率对比:

CAN分类

速率

备注

容错CAN

5Kbit/s~125Kbit/s间的某个固定值

其中一根线不工作还能靠另一根维持通路。相对而言也叫低速CAN。参考文章一文读懂容错CAN

(普通)CAN

125Kbit/s~1Mbit/s间的某个固定值,通常为500Kbit/s

速率由电路决定,是个常量,通常速率越低,成本越低。在CAN FD没问世前,>125Kbit/s的CAN网络称为高速CAN

第二代CAN FD

可变速率,数据比特率最高8Mbit/s,通常为2Mbit/s

CANFD不叫3.0,因为1.0和2.0特指CAN帧中ID位数的区别,而CAN FD的区别是速率

传输仲裁段时是2Mbit/s,传输数据段时最大是8Mbit/s。所以叫可变速率。

第三代CAN XL

最大10Mbit/s

还没大规模应用

ECU会根据用途选择合适的CAN总线速率:

  1. 低速总线,对数据的实时性要求较低,无关行车安全。例如灯光、雨刮、座椅、门锁、后视镜、空调、胎压等。注:部分也可能被LIN总线代替。

  1. 高速总线,需要实时计算,例如发动机、ABS、安全气囊、电控悬架、巡航、电池、ESP、EPS、能耗、尾气排放量等

各类CAN的帧格式都不同,不同类的CAN帧是通过特定的bit来标记识别的(详见下文协议介绍),均实现了向后兼容。即经典CAN设备能接收并可能忽视CAN FD帧,但不能发出经典CAN帧,否则会使CAN FD设备解析错乱。兼容方式参考文章:CAN-FD兼容CAN的三种方式。

实际应用中,不同类的CAN会独立分出一路总线,再通过网关转换来通信。理想情况下,仪表ECU会作为网关,网络组成如下:

多路CAN的实际例子,请参考:小鹏P7内部ECU技术信息梳理_懂车帝。

下图再简单梳理一下类型关系。

5.2 物理层

线束和接头见下文“硬件成本”一节,有样件图。

CAN的线束只有两根导线,根据其上的电平不同,分别命名为高电平的CAN_H和低电平的CAN_L。接线时需要注意,接反就不能正常工作。这两根线的塑料外皮颜色是不同的。

CAN收发器的作用是把上层数据转换成电信号通过总线发出去,以及把收到的电信号转换为数据(数字信号,0和1表示)。收发器本身只是个IC(简单的集成电路),规格分支持哪类CAN总线、电流电压等,只要外围电路按照规范来设计就能直接用。

工业用途的CAN收发器,至少还会做到:

  1. 带电流限制、过热警告等功能的低损耗电压调节器

  1. 多种低功耗运行模式,且支持多种唤醒模式

  1. 极低的休眠/待机电流

  1. 抗射频干扰,去噪

  1. 看门狗、中断和复位可软件编程

  1. 高级版支持更多功能特性的可编程控制

关于功耗,收发器和控制器都有睡眠模式等低功耗模式,由芯片或ECU控制切换。图例:

CAN收发器的详细介绍可参考:高速CAN总线收发器TJA1043(NXP)。

5.3 数据链路层

5.3.1 协议

数据链路层的协议模型:

具体的LLC、MAC子层内容可参考汽车总线CAN网络分层机构 --3。以上了解即可,不重要。

CAN2.0定义了两种帧格式,2.0A即标准帧,使用11bit的ID;2.0B即扩展帧,使用29bit的ID。可在帧数据中根据IDE标识符做判断。图示:

CAN FD和CAN XL的帧格式介绍请参考:下一代CAN通信技术CAN XL简介。了解即可。

应用层只收发ID、DLC(数据场长度)和Data Field(数据场)——可结合下文的DBC一节来理解。

ID的知识点:

  1. CAN帧中包含ID,在数据链路层只起到优先级判断的作用。ID的数值越小,CAN帧的优先级越高,会获得总线控制权。多节点同时开始发送数据时,按照电路设计,ID按每一bit传输时,ID小的数据会覆盖ID大的值,即0&1=0,此时只要判断到自己发出的bit1实际是收到bit0,就停止发送后续的bit,稍后重试。

更详细的解答请参考 CAN总线原理-精华整理。

  1. CAN ID值的业务意义由应用层决定。一种典型用法是,部分bit代表消息类型,部分bit代表发送者设备,即ID和设备绑定。只要ID的前几bit代表设备号,后几bit代表业务值,就能兼顾优先级判断的规范。

数据场的知识点:

  1. 数据场是放高层业务数据的地方。

  1. 数据链路层协议只规定了一帧的格式,数据跨越多帧的情况由应用层协议实现拆包和重组。详细介绍:CAN总线多帧发送方式

  1. 经典CAN,数据场最多8bytes;CAN FD最多64bytes;CAN XL最多2048bytes,即一帧可以有更多业务数据。当一帧的业务数据量>8且<64时,用CAN FD就不需要在业务层把数据拆成多帧和重组了,这也提升了性能。

更具体的协议内容比较多,本文不会展开讲,可参考多篇链接的文章。

5.3.2 控制器

协议的实现由CAN控制器负责,它是个独立的MCU,根据型号,可以对接1个或多个CAN收发器。对接多个时,也就相当于成为多路CAN的集线器了。只对接1个收发器的独立控制器结构图如下:

实际上控制器有两种硬件构成方案:

  1. SOC控制器(或SOC的协处理器MCU) + 独立CAN控制器 + CAN收发器。使用独立CAN控制器程序复用移植性较好,但占用主控芯片I/O资源。

  1. SOC+集成了CAN控制器模块的MCU + CAN收发器。该方案程序复用性不佳,有很强针对性,但可以使电路更加简单。

CAN控制器只会把正常的帧传递到SOC,在内部进行数据链路层的错误处理。没有部件记录详情,ECU只可读取寄存器了解基本信息,如错误计数、最近一次的错误类型。

CAN控制器是需要被编程控制的,根据芯片规范,SOC要在驱动层正确地初始化和动态控制CAN控制器。

5.3.3 报文过滤

过滤的目的是使SOC只接收到该ECU需要处理的数据。

消息过滤是根据CAN ID做的,因为都是业务需求,每个ECU都知道自己只处理哪些ID的信号。

有几种实现方式:

  1. CAN控制器自带的验收屏蔽寄存器和验收滤波寄存器,可以过滤掉不想要的报文。只要SOC对其做设置即可。(像操作系统设置网卡属性)

  1. SOC或协处理器MCU来实现编程实现。通常在MCU中实现,不占用SOC的资源。(像软件网络代理)

  1. 网关中设置某路的CAN哪些消息不转发到这路CAN。(像设置路由器)

信号(消息的具体内容)过滤需要解析数据场的数据,只能MCU实现。关于信号请参考DBC一节。

5.3.4 CAN故障

主要有这几类:

  1. 电磁辐射干扰;

  1. 工作电压不正常,包括电源故障、电路元件不符合电路设计规范(含电阻阻抗不对)等

  1. 各类原因导致的线路短路、断路,包括线松、线断、潮湿、线接错等。

  1. 线路物理性质变化引起通信信号衰减或失真,如高温

  1. ECU故障,即传输协议或软件程序有bug

数据链路层本身的出错概率非常小,各种芯片都很成熟了,只是通常在这层入手排查物理层问题,物理层的故障通常需要电子工程师用CANoe(见下文)、示波器、万用表来检测,具体请参考:

  1. CAN总线故障的常见故障与万用表检修方法

  1. can总线故障一般原因及问题解决方法 - 全文 - 接口/总线/驱动 - 电子发烧友网

  1. 《带您全面认识“CAN总线错误”》系列文章,一、二、三、四。

由于应用层都是脚本自动化生成代码,高层框架也成熟,这层出bug应该是必现的。正如CAN的名字里有“局域网”,本地网络的问题风险相对可控。

5.3.5 CAN BUS OFF问题

测试和预警方案:

  1. 测试触发方法:参考说说Busoff那点事。

  1. 可以对BUS OFF打log警告,log时机(根据具体芯片规范)有BUS OFF回调机制或定时读取芯片寄存器

更多参考资料:

  1. CAN总线报文格式—错误帧

  1. CAN通信:Busoff问题知多少,CAN通信基础:错误帧

  1. 基础涨知识篇:CAN总线错误分析与解决。一个根因不同的CAN BUS OFF例子,更详细地解释了BUS OFF的排查手段。

5.4 内核驱动层

嵌入式软件开发中,CAN总线数据收发的实现方案经历过一些迭代,最终在Linux形成SocketCAN方案,即内核用socket模型来封装底层实现,应用层只需给socket API设置特定参数即可。内核的net模块根据这些参数来确定是否以及怎样调用CAN驱动,同时内核也能提供socket缓冲区。socket封装的结果请参考下文的应用层代码示例。

内核驱动层需要正确初始化CAN控制器,按照芯片规范要求实现数据读写,处理硬件中断。通常芯片或板子供应商都会提供成熟的驱动程序,且已按客户要求做了最佳配置。

这层的具体工作请参考下文应用层的例子,更多详细介绍请参考:

  1. Linux内核官方关于SocketCAN的介绍: Readme file for the Controller Area Network Protocol Family

  1. 内核与驱动层的实现介绍:SOCKET CAN的理解

5.5 应用层

5.5.1 SocketCAN应用实例

以下是经简化的C++ 11代码片段,了解跟普通socket编程的差异即可,不用深入理解:

#include <linux/can.h>
#include <sys/socket.h> //PF_CAN SOCK_RAW
#include <net/if.h>     //struct ifreq
#include <sys/ioctl.h>

// Open
int m_fd = socket(PF_CAN, SOCK_RAW, CAN_RAW); 
struct ifreq ir;
strncpy(ir.ifr_name, m_filePath.c_str(), IFNAMSIZ - 1);  // m_filePath = "can0"
ioctl(m_fd, SIOCGIFINDEX, &ir)
ir.ifr_ifindex = if_nametoindex(ir.ifr_name);
struct sockaddr_can addr;
addr.can_family = AF_CAN;
addr.can_ifindex = ir.ifr_ifindex;
bind(m_fd, (struct sockaddr *)&addr, sizeof(addr))

// Read,子线程中执行
struct can_frame frame; // 收发CAN frame,对socket的read/write调用每次都是一帧。

fd_set fs_read;
FD_ZERO(&fs_read);
FD_SET(m_fd, &fs_read);

struct timeval out;
out.tv_sec = 0;
out.tv_usec = 1000 * 100;

auto fs_sel = select(m_fd + 1, &fs_read, nullptr, nullptr, &out);
if (fs_sel > 0) {
    auto cnt = read(m_fd, &frame, sizeof(frame));
    if(cnt==0){
        LOG_NORMAL_ERROR("can file|read close,{}",m_filePath);
    }else if(cnt<0){
        LOG_NORMAL_ERROR("can file|read error,{},{}",strerror(errno),m_filePath);
    }else{
        memcpy(buff, &frame.can_id, 4);
        memcpy(buff + 4, &frame.data, 8);
        return 12;    
    }
}

// Write
struct can_frame frame;
memset(&frame, 0, sizeof(frame));
memcpy(&frame.can_id, buff, 4);
memcpy(frame.data, buff + 4, 8);
if(frame.can_id>0x7ff){
    frame.can_id |= CAN_EFF_FLAG;
}
frame.can_dlc = 8;

auto cnt = write(m_fd, &frame, sizeof(frame));

5.5.2 主流协议

应用层协议有好几种,主流的是3种:

  1. CANopen:基于CAN2.0A定义的标准帧,由CiA提出和维护。最初是为工业自动化设计的,但很快应用在了其它领域。具体介绍:什么是CANopen总线协议?CANopen通信协议概述周立功的教学:CANopen 轻松入门 入门教程CiA官方规范分成了多份,下载入口:https://www.can-cia.org/groups/specifications/

  1. J1939:基于CAN2.0B定义的扩展帧,由SAE提出。多用于重型机械,如大巴、挖掘机、拖拉机、坦克、消防车等。具体介绍:从应用角度来讲讲J1939协议

  1. DeviceNet:基于CAN2.0A定义的标准帧,由美国的Allen-Bradley公司所开发。主要应用包括资讯交换、安全设备及大型控制系统,在美国的市场占有率较高。比起CANopen,对物理层的要求更严格,从而使得不同厂商的设备更通用。具体介绍:CAN应用层协议详解之DeviceNet协议

协议具体内容太多,多数人不用学习。我们了解这些即可:

  1. 三者互不兼容

  1. 都对CAN ID再做了规范,即对数据链路层的ID值是有要求的

经典CAN的一帧只有8 bytes的内容,如果数据>8bytes,是需要在应用层拆包和重组的。这对于实时性有一定的影响,还要考虑后面的帧收不到的场景,所以最好是设计时就做到数据只在一帧内表示完毕。实际应用中数据经常会超出可表示的范围,可以在业务层约定,最终值是通过怎样的公式计算转换出来的,从而使量程符合要求。例如1byte=8bit,可表示0~255,约定最终值要乘以2在加3,则1byte可表示3~513。这个约定可以在DBC(见下文)中表示。有些约定也成为了通用标准,但具体车厂车型会有自定义的部分。

注:AutoSAR为UDS定义了CAN-TP(Transport Layer)协议来拆包和重组,但按定义,这协议算是传输层。请看考 AUTOSAR使用小技巧——CanTp模块大揭秘!。

上述主流协议是通用的,还有专用的规范协议,例如OBD(见下文)。

5.5.3 DBC

DBC:DataBase CAN,是Vector公司(见工具一节的介绍)定义的描述CAN帧业务层规范的文件格式,文件后缀名即.dbc。

简单总结,DBC定义了:

  1. 每个ECU会发出的消息(Message)及这些消息对应的CAN ID。也就是说,根据CAN ID可以反推消息是哪个ECU发出的。

  1. 每种消息的长度(0~64字节),即CAN帧的数据场的长度

  1. 消息的数据场每bit或bit组合代表的意义,称为信号(signal)。一个消息内可以有多个信号

  1. 每个信号在数据场中的起始bit位置、长度,上层解析的数据类型、取值范围、枚举定义、计算公式、单位、周期消息的发送间隔、接收者等。

DBC相当于不同ECU的开发人员间的协议文档,特定软件可导入后以此解析CAN帧,支持所有的数据链路层以及应用层CAN协议。这已成为行业惯用工具,实际上不只Vector公司的软件使用DBC,周立功也可以用。

规范文档请见:格式规范文档。由于有规范,所以可以用脚本解析再自动生成高级编程语言的代码

更多详情:

  1. 具体介绍:CAN通信 DBC文件解析

5.5.4 独立控制器方案

系统框架图简化版:

SOC软件层的细分层工作:

  1. BootLoader:把SPI接口映射到内存空间地址,初始化寄存器。配置由板子供应商提供

  1. 驱动层:初始化控制器通信,注册内核中断号,实现基于SPI的can_frame读写系统代码路径:/kernel/drivers/net/can/spi/mcp251x.c,由芯片供应商提供,板子供应商打包给出。

  1. 内核层:加载驱动,映射CAN总线为(/dev/)can0,在socket实现层调用驱动

  1. App socket层代码示例见上文。

  1. App业务层,根据帧ID确定信号类型并解析数据,再按业务协议继续执行。解析和组帧的代码可以用脚本根据DBC自动生成。

5.5.5 自开发MCU方案

系统框架图简化版:

注:

  1. UART:Universal Asynchronous Receiver/Transmitter, 通用异步收发传输器。通信的两端可各自有一块芯片,或该功能模块内置于SOC中。详细介绍:串口通信(UART)介绍

MCU相当于一个集线器HUB,把多路CAN信息整合起来后再与SOC通信,也相当于一个协处理器。MCU要做到屏蔽CAN信号来源,就需要记录每个CAN ID的路由,即具体的CAN ID应通过哪个收发器收发。由于硬件是固定的,这个路由表可以写死在MCU代码或配置文件里。

5.6 HUB与网关

网关的作用就是在不同种类的网络间转发消息,核心功能是协议解析转换,典型应用为:

  • 连接不同速率的CAN网络

  • 连接CAN和车载以太网

  • 连接CAN和WiFi网络

  • 连接CAN和串口RS232toUSB,供调试诊断用

它可以是独立设备、独立ECU或者SOC中的某个软件模块:

  • 独立设备就像我们日常用的因特网路由器一样,只是车载网关设备通常连接了多种网络,且符合车规级要求。一些高级的设备支持更多的设置,如帧过滤、监控记录、错误报警等,甚至可以做二次开发。

  • 独立ECU是自己开发的网关设备,可以耦合特定的业务逻辑,通常需要在内存中维护一些状态才能对消息进行处理。自己开发的挑战:如何实现低成本、高可靠、易维护。参考周立功的用户手册可了解下难度。

  • 假如消息量不大,处理过程占用SOC CPU不多,可以由SOC直接在软件层实现。

常见的网关设备有:

  1. CAN2Eth,CAN转以太网:一种CAN总线和以太网互通数据的中转设备。可通过软件或网页配置,支持TCP Server、TCP Client、UDP Client、UDP Broadcast模式。支持帧过滤。例子:某ECU Client在以太网连接上作为TCP Server的网关,能按网关协议收发CAN数据,由网关在CAN网络转发和监听。注:CAN口数据包和网口数据包用透传方式通信。

  1. Tbox:本质是个独立的网关ECU,可桥接CAN、车载以太网、WiFi、4G/5G、蓝牙。现在正处于车联网快速发展的阶段,各厂家都在推出自己的特有功能,所以是还没标准化的,需要进行嵌入式开发,有专门的Tbox软件开发岗位。

6 开发测试

6.1 MCU开发简介

一个典型的开发流程:

  1. 明确任务分析和了解项目的总体要求,并综合考虑系统使用环境可靠性要求可维护性及产品的成本等因素,制定出可行的性能指标

  1. 划分软、硬件功能MCU由软件和硬件两部分,有些功能既可由硬件来实现,也可以用软件来完成。硬件的使用可以提高系统的实时性和可靠性;使用软件实现,可以降低系统成本,简化硬件结构,合理地制定硬件和软件任务的比例。

  1. 确定芯片及其他关键部件根据硬件设计任务,选择能够满足系统需求并且性价比高的芯片及其他关键器件,如A/D、D/A转换器、传感器、放大器等,这些器件需要满足系统精度、速度以及可靠性等方面的要求。

  1. 硬件设计根据总体设计要求,以及选定的芯片及关键器件,利用软件设计出应用系统的电路原理图。

  1. 软件设计在系统整体设计和硬件设计的基础上,确定软件系统的程序结构并划分功能模块,然后进行各模块程序设计。

  1. 仿真调试软件和硬件设计结束后,需要进行进行进入两者的整合调试阶段。为避免浪费资源,在生成实际电路板之前,可以利用软件进行系统仿真,出现问题可以及时修改。

  1. 系统调试完成系统仿真后,利用绘图软件,根据电路原理图绘制PCB(Printed Circuit Board),即印刷电路板图,然后将PCB图交给相关厂商生产电路板。拿到电路板后,为便于更换器件和修改电路,可首先在电路板上焊接所需芯片插座,并利用编程器将程序写入MCU。然后将MCU及其他芯片插到相应的芯片插座中,接通电源及其他输入、输出设备,进行系统联调,直至调试成功。

  1. 测试修改、集成试用经测试检验符合要求后,与ECU其它部件以及对手件集成联调,对于出现的实际问题进行修改完善,系统开发完成。

可以通过一个实例了解下CAN开发面对的问题:CAN总线指定帧唤醒的硬件实现方式。

MCU软件开发和系统及应用开发的不同点:

  1. 更深入了解硬件,看协议规范,掌握电子电气基础知识。在各类总线规范之上,还有AutoSAR规范等。

  1. 要使用示波器、外接LED灯、仿真器等工具调试

  1. 使用C语言开发为主,没有API,直接对内存地址读写即是操作硬件。需要考虑编译结果,例如某段代码必须放在数据段还是代码段。

  1. 芯片厂商会提供驱动、上层应用示例,还可能有开发IDE。由于历史悠久,现成产物多,多数工作是适配新板子

  1. 功耗是重要的性能指标,多种低功耗模式的切换过程是最复杂的场景之一。

  1. 异常主要由硬件引起,关注电平滤波、整形、时间同步等问题。

  1. 对口专业:电子信息、计算机科学与技术

  1. 人力成本参考:一线城市5年工龄内大专本科,月薪8~25k

6.2 硬件成本

简述:最简线路的物理层+数据链路层在10块钱内(批发价哈)。网关价格中值需要5千元。仿真测试设备需要5万元+。

芯片的知名厂商:

  1. NXP:荷兰 恩智浦 半导体公司,车载设备的供应商。前身是飞利浦半导体事业部。车载芯片领域在高通进入前是由NXP主宰。

  1. Microchip:美国 微芯半导体 公司,全球领先的单片机和模拟半导体供应商。

  1. Renesas:日本 瑞萨 公司,世界十大半导体芯片供应商之一。

软硬件开发工具的厂商:

  1. Vector:德国 维克多 公司,是总线开发工具、网络节点测试验证工具和嵌入式软件组件供应商,为汽车总线网络的设计、建模、仿真、分析、测试以及ECU的开发、测试、标定和诊断等领域提供一系列强有力的软硬件工具和源代码。

  1. 周立功、ZLG:公司名为广州致远电子股份有限公司,官网 https://www.zlg.cn/。创始人就名为周立功,关于他的介绍可参考百度百科。公司总部位于广州市天河区,是一家工业互联网产品与解决方案供应商。也是CANopen协会CiA的会员。

材料价格表:

材料

价格(百度&淘宝价)

备注

样件图

屏蔽双绞线

大概2~3元1米

文章描述,MODEL S的线路总长达到3000米,MODEL 3的线路总长为1500米,而MODEL Y车型的线路总长仅为100米。不全是CAN线,知道量级就好了。

Microchip MCP2551l芯片

规范

3元

CAN收发器

NXP TJA1043芯片

规范

4.5元

CAN收发器

Microchip MCP2515芯片

规范

4.5元

CAN控制器

瑞萨 RH850/U2A16-516芯片

很多份官方文档

170元左右

协处理器,MCU,主要控制多路CAN和LIN。功能上远不只是CAN控制器了。

DB9接头

2块钱以内

接头根据实际需要来选择。这一头通常焊死在板子上。

Open4接头

15

指绿色底座的4个线孔。通常接总线、地线。

Open5接头

15

比起Open4,可支持CAN设备的CAN信号和电源同时传输。

CAN转以太网

  • 普通厂家 180~360

  • 周立功 1800~7800,按支持多少路CAN和网口区分价格。业内成为CAN盒

  1. 周立功强在性能优越,高速不丢帧,作为Server时支持254个Client。支持二次开发。

  1. ZLG CANFDNET-400U:周立功的CAN转以太网设备。支持4路CAN,1路以太网,1路车载以太网。

CAN中继器/网桥

普通厂家600(5路)

周立功1650~4500(2~8路)

也用于不同速率的多路CAN之间转发数据。

CANoe的硬件设备VN1630

官方手册

ebay的价格:全新6800美元,二手3260美元。+50运费

辅助软件做仿真、测试

6.3 工具

6.3.1 Vector系列

Vector公司是车载网络开发工具领域的泰斗,软件主要有3款:

  1. CANoe:CAN open environment,为汽车总线的开发而开发的一款集总线仿真、测试分析和诊断等功能为一体的图形化开发环境,实际还支持除CAN外的其它车载网络类型。需要绑定硬件使用(硬件成本和样件见上文),软件有多个版本,售价600~1500美元。详细介绍:CANoe与CANalyzer工具的区别开发过程视频:合集和视频列表-手把手教你CANoe,可理解如何仿真

  1. CANalyzer:功能上相当于CANoe的子集,价格也便宜一半。

  1. CANape:CAN Application Programming Environment是一款可用于ECU测量、标定、诊断以及ADAS传感器数据记录验证的综合性工具软件。

与Vector相关软件有关的概念:

  1. CANdb++:CANoe的附属工具,可单独使用,用于解析编辑DBC文件。教学视频:【北汇信息】CANoe培训视频 | 数据库搭建-生成CAN通信数据库_哔哩哔哩_bilibili

  1. CAPL:Communication Access Programming Language,即通信访问编程语言。专门为CANoe配置的语言,主要用于仿真过程的编程。具体介绍:CANoe学习4—CAPL语言设计

由于Vector软硬件太贵,软件有破解,软硬件也有模仿。原理并不复杂,因为底层协议都已公开,只是做成商业化产品就要以功能和质量见高低了。CANoe的配套硬件是带有CAN控制器的,在实验室或实机诊断时,可以直接观察到数据链路层的错误,包括错误帧。

6.3.2 周立功

CAN盒(ZLG CANFDNET-400U)本身是CAN和以太网的网关,也具备调试分析功能。其配套软件是ZCANPRO,可免费下载使用。

CAN盒本身没有记录功能,是连上电脑后配套的软件可以记录在电脑,所以不能支持真机实飞过程的故障排查。它还支持二次开发,有多种开发语言的套件,给它外接一个SOC再做点开发工作是可以记录故障的,那就可用于监控。二次开发请参考:https://www.zlg.cn/can/down/down/id/255.html。

周立功另有分析仪CANScope,价格16万起。它是 CAN 总线开发与测试的专业工具,集海量存储示波器、网络分析仪、 误码率分析仪、协议分析仪及可靠性测试工具于一身,并把各种仪器有机的整合和关连;可对 CAN 网络通信正确性、可靠性、合理性进行多角度全方位的评估。详情参见CAN总线故障诊断与解决、测试方法。

6.3.3 Linux工具

can-utils工具可命令行收发CAN总线的消息。可apt install can-utils安装,开源地址为https://github.com/linux-can/can-utils。使用方法请百度,例如can-utils4.0.6使用方法。

6.4 记录与回放

CANoe和周立功的配套软件可以记录总线上的CAN帧数据,保存为文件:BINLOG files(.blf)、Vector ASCII logfiles(.asc)。根据这些记录,工具可以实现数据回放(见TSMaster快速入门篇(2)-报文回放 ),即往总线上按序重发这些数据。

6.5 标定

ECU的标定工作就是对ECU中的控制参数进行优化,使其满足发动机动力性、经济型、可靠性、安全性、排污性并确定各工况最佳空燃比、最佳点火提前角的要求。关于标定的目标,请参考发动机标定那些事-有驾。

这项工作有专门的岗位:标定工程师。为实现这一目的,标定工程师需要对不同参数进行获取(读操作)和标定(写操作),通过分析参数改变带来的性能变化,反复迭代更新后才能完成标定。为规范标定工作,常见的应用层标定标准有CCP(CAN Calibration Protocol,CAN标定协议)协议和XCP(Universal Measurement and Calibration Protocol)协议。其中XCP协议可在多种总线上使用,包括CAN。标定协议本身是不需要深入理解的,有多种现成的软件支持。关于软件怎么用,可参考视频:Vector CANAPE 标定基础视频_哔哩哔哩_bilibili

6.6 OBD

OBD,On-Board Diagnostics system。只讲些基础知识:

  1. OBD有一套独立规范,在OSI网络七层模型的物理层、数据链路层、网络层、会话层、应用层都有规范。这些规范使得诊断仪可以不局限于用在一个厂家或车型。规范内容已经超出了CAN的范畴,只是其中的物理层和数据链路层可以基于CAN也可以基于车载以太网。简单来说就是规定了诊断仪发哪些CAN ID消息,各ECU要怎样响应。注:OBD定义了几种专门用途的CAN ID,在电路设计时需要避开。ECU实现响应这些ID的消息就是实现了OBD。详细介绍:OBD(On-Board Diagnostic)介绍

  1. UDS:Unified Diagnostic Services,是诊断服务的统一化应用层规范,是OBD的增强型诊断。可以在CAN线上实现,也可以在车载以太网上再基于DoIP(Diagnostic over Internet Protocol)实现。UDS还不是行业标准,但已有很多车厂支持。更多介绍请参考:百度百科-UDS

  1. ECU需要实现OBD协议,其中一个要求是记录错误。诊断仪发出OBD请求时,ECU需答复上报这些记录。在诊断仪发出清空记录的命令前,ECU不主动删除记录。

  1. K线:在CAN未应用前,车辆主要使用K线进行诊断。是一条独立的双向传输线。

  1. L线:用来对控制单元进行查询的导线,此线在目前生产的车辆中已经不存在。

  1. OBD接口有I型和II型,分美标(SAE定义)和欧标(ISO定义)。使用CAN线做诊断时,需要注意接线位置。

7 知识体系

简单总结:

  1. MCU开发测试的知识量不算大,而是深度大,门槛是更高的,但掌握后,工作量相对很少。

  1. 信息量大,需要不断查阅软硬件规范,不太可能记住很多。这些信息量比Android App开发还多。

  1. 因为已经是计算机最底层,需要对原理的理解和掌握程度非常高。

  1. 软件开发方面,大头不在于写代码,而是验证程序逻辑符合各种规范和业务要求。

书籍入门:

  1. 汽车CAN总线系统原理、设计与应用

  1. CAN总线的技术及应用教程

  1. CAN总线轻松入门与实践

延伸了解:

  1. CAN是现场总线(Field Bus)的一种。Field之所以翻译成“现场”,是因为这些总线最初用于“现场解决问题”。更好理解是把Field翻译成“专业领域”。

  1. 车载总线还有这几个:LIN、FlexRay、MOST、车载以太网、LVDS。

  1. 轻松看懂汽车电路原理图

部分图片找不回原出处了,侵删,谢谢

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

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

相关文章

9 自编码器(Auto encoder)及python实现

1 数据集介绍 1.1 Mnist 手写数字数据库 &#xff08;LeCun 在1998年创造&#xff09; &#xff08;1&#xff09;手写数字 0-9共10类 &#xff08;2&#xff09;训练样本60000个&#xff0c;测试样本10000个。 &#xff08;3&#xff09;图像大小 28*28 二值图像。 &#xf…

[深入理解SSD系列 闪存实战2.1.5] NAND FLASH基本读操作及原理_NAND FLASH Read Operation源码实现

前言 上面是我使用的NAND FLASH的硬件原理图,面对这些引脚,很难明白他们是什么含义, 下面先来个热身: 问1. 原理图上NAND FLASH只有数据线,怎么传输地址? 答1.在DATA0~DATA7上既传输数据,又传输地址 当ALE为高电平时传输的是地址, 问2. 从NAND FLASH芯片手册可知,要…

TryHackMe-Lockdown(boot2root)

Lockdown 停留在 127.0.0.1。穿255.255.255.0。 端口扫描 循例 nmap Web枚举 进入80 发现跳转到了contacttracer.thm&#xff0c;将其添加进/etc/hosts 这里试了一下注入 结果这就进去了 在后台逛了一圈&#xff0c;最后还是把目光放在了图片上传点 试了一会&#xff0c;貌似…

SVN 版本控制软件

SVN 版本控制软件 属于C/S结构软件&#xff08;客户端与服务端&#xff09; 服务端软件&#xff1a;VisualSVN 网址&#xff1a;Downloads | VisualSVN 下载好&#xff1a;VisualSVN-Server-5.1.3-x64.msi 客户端软件&#xff1a;TortoiseSVN 网址&#xff1a;http://tor…

AI技术的应用场景和要注意的问题

AI技术可以应用到许多不同的业务场景中&#xff0c;以下这些仅仅是AI技术的一些应用场景&#xff0c;实际上&#xff0c;AI技术可以应用于任何需要处理大量数据、自动化决策和复杂问题的领域。今天和大家分享一下AI技术的应用场景和要注意的问题&#xff0c;希望对大家有所帮助…

借助采购管理数字化解决方案 帮助企业解决传统采购痛点

当今各行业热烈竞争中&#xff0c;企业最终服务交付的效率和质量是这个时代最重要的要素。传统的采购流程工作涉及大量的文书工作&#xff0c;且耗时长&#xff0c;往往容易出现操作出错&#xff0c;造成企业在成本上的大量损失。 作为管理者&#xff0c;企业采购决定你的业务…

2018年MathorCup数学建模B题品牌手机目标用户的精准营销解题全过程文档及程序

2018年第八届MathorCup高校数学建模挑战赛 A题 品牌手机目标用户的精准营销 原题再现&#xff1a; 随着我国电子商务和移动支付的快速发展,手机已经成为人们必不可少的工具。除了常规的通讯功能外, 手机还可以进行购物、支付、娱乐、学习和交流等。因此, 选择一个什么样的手机…

比特币仍使投资者悲观!数字美元可能会使加密货币清零?

当谈到比特币时&#xff0c;投资者仍然感到悲观。政府严厉的监管打击&#xff0c;美联储加息提速以及FTX的牺牲品——Silvergate的倒闭等因素&#xff0c;都在催促投资者要么卖出&#xff0c;要么坐以待毙。 FTX崩塌后&#xff0c;余波未了。在这几个月里&#xff0c;监管机构纷…

易优cms SQL获取数据库内容的标签

SQL获取数据库内容的标签 【基础用法】 标签&#xff1a;sql 描述&#xff1a;用于获取MySQL数据库内容的标签。 用法&#xff1a; {eyou:sql sql cachetime3600 empty没有数据} {$field.数据表相应的字段名称} {/eyou:sql} 属性&#xff1a; sql 需要查询的SQL语句 …

mac系統iTerm2+oh-my-zsh+solarized配色方案

文章目录1 下载并安装iTerm22 安装solarized主题3 安装oh-my-zsh并配置agnoster主题4 设置powerline5 隐藏用户名信息6 设置语法高亮和代码自动补全7 &#xff08;可选&#xff09;如果出现plugin ‘zsh-autosuggestions’ not found1 下载并安装iTerm2 brew install iterm2安…

C++基础

C基础 C语言新特性 2.1 C的新特性 C比 C 语言新增的数据类型是布尔类型&#xff08;bool&#xff09;。但是在新的 C 语言标准里已经有布尔类 型了&#xff0c;但是在旧的 C 语言标准里是没有布尔类型的&#xff0c;编译器也无法解释布尔类型。 在传统的 C 语言里&#xff0…

Linux安装后基础配置--网络--ssh--基本软件

安装教程比较多就不写了。 网络配置 设置虚拟网络 修改网络配置文件 vi /etc/sysconfig/network-scripts/ifcfg-ens33将ONBOOT由no改为yes&#xff1a; 修改为静态网络 /etc/sysconfig/network-scripts/ifcfg-eth33 BOOTPROTOstatic IPADDR192.168.1.129 GATEWAY192.168…

《c++ primer笔记》第九章 顺序容器

前言 知识点很多&#xff0c;这里只记录遗忘的。从这章开始会对前面章节的内容进行一个扩充&#xff0c;如果以前的忘了读起来会有点吃力。总的来说&#xff0c;本章节难度不大。 文章目录一、概述二、容器库概览2.1容器定义和初始化2.2赋值三、顺序容器操作3.1添加元素3.2删除…

Vue3通透教程【六】setup语法糖、computed函数、watch函数

文章目录&#x1f31f; 写在前面&#x1f31f; setup 语法糖&#x1f31f; computed函数&#x1f31f; watch 函数&#x1f31f; 写在最后&#x1f31f; 写在前面 专栏介绍&#xff1a; 凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章&#xff0c;应粉丝要求开始更新 Vue3 的…

体验Linux 块设备驱动实验(模拟块)

目录 一、块设备 二、块设备驱动框架 1、块设备的注册和注销 2、gendisk 结构体 3、block_device_operations 结构体 4、块设备 I/O 请求过程 ①、请求队列 request_queue ②、bio 结构 三、编写驱动之请求队列 1、修改makefile 2、基本的驱动框架​编辑 3、添加头文…

XWiki Annotation Displayer 存在任意代码执行漏洞(CVE-2023-26475)

漏洞描述 XWiki 是一个开源的企业级 Wiki 平台&#xff0c;Annotation Displayer 是 XWiki 中的一个插件&#xff0c;用于在 XWiki 页面上显示注释和其他相关内容。 该项目受影响版本存在任意代码执行漏洞&#xff0c;由于Annotation Displayer 对 Groovy 宏的使用没有限制&a…

机载SAR文献调研(CSDN_0027_20230219)

文献&#xff08;电子所&#xff09;文献名[1]&#xff1a;詹学丽, et al., 一种用于合成孔径雷达的数字去斜方法. 雷达学报, 2015. 4(04): p. 474-480文章摘要该文提出了一种用于合成孔径雷达&#xff08;SAR&#xff09;的数字去斜方法&#xff0c;适用于发射信号脉冲宽度能够…

女神节 | PHP和Java算什么,女工程师才是最美最好的语言!

世界上第一个程序员是女性 第一个发现Bug的也是女性 在智领云有一群追求快乐和独立的女性工程师 她们多有魅力&#xff1f; 工位上她们专注于数据与代码 平日里郊游、瑜伽、插花、科学养娃一件不落 不仅用0和1编织数字世界 也在用心装点自己的生活 今天是国际劳动妇女节…

Linux 虚拟机安装及与windows远程登录

说明&#xff1a; 本次学习是在windows上安装虚拟机进行的。所以需要先安装VMware WorkStation&#xff0c;这玩意需要秘钥。所以你懂的&#xff0c;资源网上很多 Linux镜像文件下载地址CentOS Linux​​​​​​ 一、 打开VMware&#xff0c;点击创建新的虚拟机 二、选择下载…

【FATE联邦学习】自定义数据集自定义神经网络模型下的横向纵向训练

前言 代码大部分来自 https://fate.readthedocs.io/en/latest/tutorial/pipeline/nn_tutorial/Hetero-NN-Customize-Dataset/#example-implement-a-simple-image-datasethttps://fate.readthedocs.io/en/latest/tutorial/pipeline/nn_tutorial/Homo-NN-Customize-your-Datase…