第一篇从全局角度出发,简单介绍了AUTOSAR的结构,从本篇开始我们一起详细了解一下AUTOSAR软件架构下内部的组成部分。下面,我们首先介绍第一个模块-通信。在AUTOSAR BSW中通信由三个部分组成,分别是:通信驱动、通信抽象、通信服务。涉及的通信类型包括但不仅限于LIN、CAN、FlexRay、Ethernet。实际车用最广泛还是LIN和CAN,但LIN总线由于带宽及通信质量等原因,大都是用于简单执行器的控制通信。而车载ECU之间、ECU与复杂传感器之间的通信大都采用CAN通信。而以太网通信是近年来由于车载娱乐及自动驾驶业务发展对车载通信要求的提高引入的。这里我们已典型的CAN通信作为切入点,介绍AUTOSAR架构下的通信。
CAN网络简介
CAN(Controller Area Network)网络通信是一种现代的串行通信协议,被广泛应用于汽车、工业控制和其他领域。它最初由德国BOSCH公司于1986年开发,旨在满足汽车电子系统中的通信需求。然而,由于其卓越的性能和可靠性,CAN通信很快就在其他行业中也得到了广泛采用。
CAN网络通信的特点:
- 分布式通信架构,允许多节点同时在总线收发消息;
- 差分信号设计,提高信号抗干扰性;
- 支持优先级仲裁,可组成多主机局部网络;
- 相对结构简单、成本低;
关于CAN的更多基础知识这里不再详细展开。对CAN总线完全不了解的朋友这里有一篇文章仅供参考:CAN通信讲解 - 知乎
在实际应用中,CNA通信的实现需要在硬件上有CAN控制器和CAN收发器的支持。应用比较广泛的独立的CAN控制器有NXP(恩智浦)的TJA1050,独立的CAN收发器有NXP的TJA1043、TJA1044等。但现在大多主控芯片都包含片内CAN控制器,只需要搭配合适的CAN收发器即可。
BSW中的CAN模块
在AUTOSAR架构中,CAN模块属于BSW层的MCAL,其作用就是作为CAN驱动软件,驱动CAN硬件,实现CAN报文的收发。在AUTOSAR中CAN模块负责驱动一个“CAN Hardware Unit”的实体。一个CAN Hardware Unit包含一个或多个一样的CAN控制器,可以是在主芯片内部(片内)也可以是在主芯片外部(板载)。下图所示为包含2个CAN控制器连接到两路物理CAN通道的CAN Hardware Unit。
CanHardwareUnit示意图
一个CAN模块提供访问一个CAN Hardware Unit的接口,如果应用存在多个不同类型的CAN Hardware Unit那么就要实现多个CAN模块。
CAN状态机
CAN模块状态机比较简单,共有4个状态,分别为:
- UNINIT(未初始化);
- STOPPED(停止);
- STARTED(启动);
- SLEEP(睡眠);
下图所示为CAN状态机转换图。
上电后,CAN首先进入UINIT状态,直到调用Can_Init()函数,进行CAN模块初始化,然后CAN模块进入STOPPED状态,此时表示CAN模块已经初始化完成,但是并不参与总线通信。然后当函数Can_SetControllerMode(CAN_CS_STARTED)被调用后,CAN模块进入STARTED模式,在STARTED模式下CAN模块正常工作,可进行CAN报文的收发。当函数Can_SetControllerMode(CAN_CS_STOPPED)被调用后,CAN状态进入STOPPED状态,此时CAN模块停止参与总线通信。当函数Can_SetControllerMode(CAN_CS_SLEEP)被调用后,CAN状态由STOPPED状态进入SLEEP状态。当Can_DeInit()被调用后,CAN状态机进入UNINIT状态。
另外,除了由软件触发的CAN模块状态机跳转,以下硬件条件也可出发CAN状态机跳转。
- 硬件唤醒:当CAN状态机处于SLEEP模式下时,收到硬件唤醒信号,CAN状态机跳转STOPPED状态
- Bus-Off:当CAN状态机处于STARTED状态时,如果发生BusOff,那么CAN状态机跳转STOPPED状态;
CAN报文发送
Can_Write()函数用于发送报文,报文成功发送后,CAN模块会调用CanIf_TxConfirmation()上报消息发送成功(CanIf层的通知回调,此处若不理解可浏览CanIf篇)。
Can报文的发送方式有两种:中断式和轮询式。若CAN报文以中断的方式发送,那么发送回调在中断服务中调用;若CAN报文以轮询的方式发送,那么发送回调在周期函数Can_MainFunction_Write()中调用。
CAN报文接收
当有CAN报文到来时,CAN模块调用接收指示回调函数CanIf_RxIndication()。
CAN报文的接收方式有两种:中断式和轮询式。中断式时相应硬件资源的接收中断服务程序调用回调函数CanIf_RxIndication;轮询模式时,周期函数Can_MainFunction_Read 调用回调函数CanIf_RxIndication。
基于硬件特性,看具体硬件支持FIFO、Queue、ShadowBuffer。CAN模块会将接收到报文数据存放到FIFO/Queue/ShadowBuffer,供后续使用。
是的,就这样就结束了!CAN模块在报文接收过程的作用仅仅时发出一个提示并缓存数据,后续报文的处理都是CanIf完成的,将在后续介绍。
总结
- CAN报文接收发送有两种模式:中断 或 轮询,不同模式决定任务处理方式不同;
- CAN状态机跳转条件:软件触发(Can_SetControllerMode)和硬件触发(BusOff、唤醒)