【CAN通讯系列3】如何学习CAN通讯?

对于汽车行业从业者,如何学习CAN通讯,最重要的是取决于你的岗位职责。一方面岗位职责的定义决定你所能获得的资源,另一方面敢岗位职责基本框定了你所使用的CAN通讯内容范围。

比如你不是做底层软件开发,那么你很难切身地深入理解CAN通讯的控制流和数据流,因为你没法像底层软件工程师那样能亲自使用调试工具去一行一行地调试代码,去追踪一个一个函数的调用关系。另外,你不是底层软件工程师的话,就算你懂很深入,也很难有详细设计的机会,从而很难产生最直接的价值。

当然并不是说你不需要就不要了解,其实知道的越多越好。汽车研发体系内有各种各样的角色,你了解的越多越广,将会非常助于你与不同角色的人员沟通,与对方进行同频道交流。除此之外,还存在很多可能性。

因此,不管你从事的具体是什么岗位,都可以去了解CAN通讯,总之自己的目标得定位好,比如你做系统集成的,别想着干底层软件的CAN通讯开发。而应该是基于自己岗位职责需要,首先需要知道CAN通讯的哪些内容,后续有余力有兴趣再去了解更多更深入的内容。那么,具体如何学习CAN通讯?从哪里开始?到何种程度?本文分享一些个人经验与思考。

1 CAN通讯是什么

在汽车上,任何形式的通讯,不管是LIN通讯,CAN通讯还是Ethernet通讯,其目的都是用来信息交互。即汽车上就是控制器(ECU)之间的信息交互。

图片

source:TBOX和CAN如何交互?

对于CAN通讯传递信息形式:同一个CAN网络的通讯,同样的传输速率,就如上图的动力网或车身网内部各个控制器之间通讯。不同CAN网络的通讯,可能是不同的传输速率,CAN网络需要通过网关才能通讯,就如上图的动力网的安全带控制器与车身网的车门控制器通讯。

总的来说,不管哪种CAN通讯传递信息形式,问题都要回归到这个信息具体如何进行传递,即下图的控制器1如何将信息传递给控制器2。

图片

可以细分为两方面的问题:

  • 从控制器1到控制器2:信息以怎样的承载方式进行传输?信息以多快的速度进行传输?信息如何能准确无误进行传输?

  • 关于信息,信息指的是什么?信息来自于控制器1的哪里?信息又要到控制器2的哪里?

2 CAN通讯基础

对于第一方面的问题,属于CAN通讯基础,应该适用于所有人汽车研发人员,需要参考CAN通讯的协议与标准,包括CAN2.0协议规范和 ISO 11898等,后续文章会结合这些进行介绍CAN通讯基础。

图片

source:CAN 总线 之三 CAN 国际标准 ISO 11898 解读_iso11898

对于第二方面的问题,我概括为两个部分:应用和实现。

3 CAN通讯应用

在整车层面,很多功能需要多个控制器来联合实现,因此就有了控制器间的信息交互,而这些信息是依赖于具体的整车功能,比如说新能源汽车要实现驱动功能,先需要整车控制器VCU计算目标转速或扭矩请求,再通过CAN通讯传输给电机控制器MCU;另外,VCU也需要根据驱动电机的实际状态(电流,温度等信息)来计算目标转速或扭矩请求,这时也需要MCU通过CAN通讯反馈这些信息给VCU。

总之就是控制器间需要进行信息交互,本质上来自于整车功能的需要,所以信息具体指的是什么,来自于整车功能的定义。因此,这个时候应用CAN通讯,主要目的获取信息,服务于整车功能,用来分析与验证整车功能的定义或策略等工作。此时,CAN通讯只是你获取信息的工具,你熟悉工具和DBC就好,比如CANalyzer或CANape的使用,可以参考它们的用户手册或者视频教程,如下所示:

图片

source: 01 新建工程及通道配置_哔哩哔哩_bilibili

图片

source: CAN通讯: DBC协议、DBC解析报文、Layout、C语言程序解析DBC报文实例

其实CAN通讯应用还包括另一个大功能:诊断。这是对于工具的使用要求会远高于上面所述,另外需要知道CDD文件。关于诊断主题可以先关注本公众号故障诊断系列文章。

4 CAN通讯实现

信息来自于控制器1的哪里?信息又要到控制器2的哪里?这两个问题涉及到CAN通讯实现。基于AutoSAR软件架构,信息来自于应用层软件或者底层软件,要到的也是应用层软件或者底层软件。那么,在软件中具体如何实现CAN通讯,包括两方面数据流和控制流,即一方面是数据是以怎样的形式在软件模块中传递,另一方面是CAN通讯相关的模块中,不同模块或同一模块的函数是怎样的调用关系。

图片

source:vector learning

了解这块内容,需要可以从实际开发工作入手,联合调试与测试工具,比如从CANalyzer中发送一条ECU接收列表已有ID的CAN信息,通过调试工具(比如trace32)断点功能,跟踪传输路径,包括函数调用和对应的数据信息。同时再结合AutoSAR文档,这样基本能摸清CAN通讯功能的主干。

图片

source: Lauterbach TRACE32工具的新增支持功能可简化MIPS和ARM CPU结合设计的调试工作

以上仅是CAN通讯开发的部分内容,还包括基于AutoSAR工具链对CAN通讯开发,比如采用Davinci configurator配置BSW和RTE,以及CAN通讯开发过程碰到各种问题。如果还更全面地说,对于软件开发而言,还涉及开发流程的执行,CAN通讯在ASW和BSW的分工等内容。

总的来说,CAN通讯实现包括开发,调试,测试和debug等工作,最重要的是实践,在实践需要理论支持,这是可去参考:微控制器用户手册,AutoSAR文档和调试工具帮助文档等资料。

5 小结

以上就是涉及到CAN通讯方面,个人的一些学习经验。对于CAN通讯,实际上还与功能安全和信息安全两个主题相关,上文并未提及,有兴趣的也可以自行了解。

希望通过本文和上篇文章,能帮大家有所了解:

  • CAN通讯与汽车研发的关系

  • 不同角色用CAN通讯做什么,需要掌握多少

  • 你真正想了解CAN通讯哪些内容,到何种程度

  • 你可以怎样去学

本系列接下来的文章将详细介绍CAN通讯相关知识,请持续关注后续文章。

-------------------------------------------------------------------------------------------------------------------------

创作不易,欢迎点赞收藏关注。

汽车研发交流群,有兴趣的朋友请添加群主:prOmiseyes,备注:公司+职务入群。仅限汽车行业从业人员。

很抱歉,我是一名语言模型AI,无法进行编程操作。但是我可以给您提供一些帮助,希望对您有所帮助。 280049C芯片是一种基于ARM Cortex-M0内核的微控制器,它支持CAN总线通信协议。下面是一个简单的CAN通讯程序设计过程: 1. 初始化CAN模块 首先,需要初始化CAN模块,包括设置CAN模块的工作模式、波特率、滤波器等参数。可以使用芯片提供的CAN初始化函数,例如: CAN_InitTypeDef CAN_InitStructure; CAN_InitStructure.CAN_TTCM = DISABLE; CAN_InitStructure.CAN_ABOM = DISABLE; CAN_InitStructure.CAN_AWUM = DISABLE; CAN_InitStructure.CAN_NART = ENABLE; CAN_InitStructure.CAN_RFLM = DISABLE; CAN_InitStructure.CAN_TXFP = ENABLE; CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; CAN_InitStructure.CAN_BS1 = CAN_BS1_5tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_2tq; CAN_InitStructure.CAN_Prescaler = 4; CAN_Init(CAN1, &CAN_InitStructure); 2. 设置CAN过滤器 在CAN模块初始化完成后,需要设置CAN过滤器以过滤接收到的CAN消息。可以使用芯片提供的CAN过滤器设置函数,例如: CAN_FilterInitTypeDef CAN_FilterInitStructure; CAN_FilterInitStructure.CAN_FilterNumber = 0; CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000; CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000; CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0; CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; CAN_FilterInit(&CAN_FilterInitStructure); 3. 发送CAN消息 可以使用芯片提供的CAN消息发送函数,例如: CanTxMsg TxMessage; TxMessage.StdId = 0x321; TxMessage.ExtId = 0x01; TxMessage.RTR = 0; TxMessage.IDE = CAN_ID_STD; TxMessage.DLC = 2; TxMessage.Data[0] = 0x01; TxMessage.Data[1] = 0x02; CAN_Transmit(CAN1, &TxMessage); 4. 接收CAN消息 可以使用芯片提供的CAN消息接收函数,例如: CanRxMsg RxMessage; if (CAN_GetFlagStatus(CAN1, CAN_FLAG_FMP0) != RESET) { CAN_Receive(CAN1, CAN_FIFO0, &RxMessage); // 处理接收到的CAN消息 } 以上是一个简单的CAN通讯程序设计过程,具体实现可以根据实际需求进行调整。希望对您有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值