CAN-数据收发过程(数据链路层) _基于autosar架构

本文内容来自下面两篇文章的整合:

1. AUTOSAR架构的CAN通讯

2. CAN协议标准及相关内容

本文先简要描述了CAN收发通讯的整体过程。

然后,介绍了CAN协议的数据链路层结构中MAC和LLC层服务原语和数据帧格式。

最后,在了解数据链路层的服务原语和数据帧的前提下,详细描述了autosar架构中以下三者之间的通信信号传递过程:

【BSW 调度器】-【BSW模块中的communication模块】-【CAN控制器】

其中BSW- communication模块,选取了4个核心通信模块:

  • communication service(autosar com 模块,PDU Router模块),
  • communication hardware abstraction(CAN Interface 模块),
  • communication driver(CAN driver模块)。

CAN-数据收发过程(数据链路层) _基于autosar架构_第1张图片

↑ communication功能模块在autosar架构中的位置 

CAN-数据收发过程(数据链路层) _基于autosar架构_第2张图片

↑  核心通信模块在communicatio功能模块中的位置

目录

CAN通讯过程——收,发

CAN-数据链路层的结构

LLC子层

MAC子层

基于AUTOSAR的CAN通讯

CAN通讯——接收(Indication)

CAN通讯——发送(request,confirm)


CAN通讯过程——收,发

CAN通讯过程包括,数据的接收、发送、错误处理等,本文主要讲CAN通讯的收发过程。

发送时,用户先请求提供者,然后提供者发送,再向用户确认;

接收时,提供者通知用户,如下图。

CAN-数据收发过程(数据链路层) _基于autosar架构_第3张图片 

其中涉及3个服务原语

  • 请求(request),即服务用户向服务提供者发起请求服务;

  • 通知(indication),即服务提供者向服务用户通知一个对其重要的服务提供者内部事件;

  • 确认(confirm),即服务提供者向服务用户传达先前请求服务的结果,是成功还是失败,是完成还是未完成。

当信息经过LLC或MAC传输,即发送或者接收,同样地遵循上述的规则。

LLC和MAC是CAN数据链路层的子层。

CAN-数据链路层的结构

数据链路层在OSI模型中的位置,上接网络层,下接物理层。

数据链路层的作用是:在通信实体间建立数据链路联接,传输的基本单位为“帧”,并为网络层提供差错控制和流量控制服务。

数据链路层的结构:由MAC(介质访问控制子层)和LLC(逻辑链路控制子层)组成

LLC子层

对在同一条网络链路上的设备之间的通信进行管理。数据链路控制子层主要负责逻辑上识别不同协议类型,并对其进行封装,也就是说数据链路控制子层会接受网络协议数据、分组的数据包并且添加更多的控制信息,从而把这个分组传送到它的目标设备。

LLC数据帧

一个LLC数据帧由3个位段(bit field)组成,即id,长度和数据3段,基本对应于上篇文章的CAN协议帧的三段,其中id段稍有不同,它包含3个部分:基本id,扩展flag和扩展id,但在MAC子层会将id段处理成CAN协议帧的id段格式。

img

 在LLC层传输时,服务原语的使用格式为:

CAN-数据收发过程(数据链路层) _基于autosar架构_第4张图片

MAC子层

MAC层,介于LLC子层和PLS子层之间(提供上下的访问接口,解包接收数据、打包发送数据,接收、发送介质访问管理)。

MAC子层分为两条完全独立的操作部分,即发送和接收。MAC发送或接收的数据帧就是CAN协议帧。

发送部分,MAC子层要实现:数据打包和发送介质访问管理。

  1. 数据打包,包括:LLC数据帧的接收;CRC序列计算;MAC数据帧的构建(即增加SOF,SRR位,IDE位,RTR位,保留位,CRC,ACK和EOF到LLC数据帧)。
  2. 发送介质访问管理,包括:识别到总线空闲时发起发送;位填充;仲裁,仲裁失败转为接收模式;ACK检查等;向物理层发送一串位流(a serial bit stream)。

接收部分:MAC子层要实现:接收介质访问管理和数据解包。- 

  1. 接收介质访问管理,包括:从物理层接收一串位流;删除填充的位;发送ACK等。

  2. 数据解包,包括:移除数据帧的MAC特定信息;把LLC数据帧和接口控制信息给LLC子层。

MAC层的服务原语格式为:

CAN-数据收发过程(数据链路层) _基于autosar架构_第5张图片

MAC层数据帧

MAC发送或接收的数据帧就是CAN协议帧,格式为:

 

基于AUTOSAR的CAN通讯

CAN通讯——接收(Indication)

CAN-数据收发过程(数据链路层) _基于autosar架构_第6张图片

具体过程描述如下:

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

  2. CAN Driver模块的Can_MainFunction_Read函数将访问CanController(硬件)的寄存器,如前面文章所述的仲裁寄存器,数据寄存器和数据长度寄存器,并读取这些寄存器的数据;

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

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

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

上述第2步为什么需要读取仲裁寄存器,数据寄存器和数据长度寄存器?这是因为ISO 11898-1标准规定了LLC数据帧的格式(id,数据长度和数据3段),当然还需要根据对应的芯片手册定义来访问其他的寄存器,最终保证读取数据的有效性。

CAN通讯——发送(request,confirm)

CAN发送功能需使用请求(Request)服务和确认(Confirmation)服务,AUTOSAR架构的CAN发送功能如下图6、7所示。

CAN-数据收发过程(数据链路层) _基于autosar架构_第7张图片

 图6 CAN发送的流程图

图6描述了数据发送的具体过程,即:

  1. BSW调度器周期性调用Com模块的Com_MainFunction_Tx函数,Com模块将从其缓存器中读取需发送的数据;

  2. Com模块的Com_MainFunction_Tx函数将调用PduR模块的PduR_ComTransmit函数,将数据传给PduR模块;

  3. PduR模块路由到CAN Interface模块,调用CanIf_Transmit函数,这样数据从PduR模块传给了下层的CAN Interface模块;

  4. CAN Interface模块再调用Can Driver模块的Can_Write函数,将数据写入相应的寄存器;

  5. 与CAN接收功能一样,Can_Write函数将访问仲裁,数据长度和数据寄存器,将数据写入。

图7描述了数据发送后的确认过程,即:

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

  2. CAN Driver模块的Can_MainFunction_Write函数将访问CanController(硬件)有关寄存器,读取有关数据供向上层确认;

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

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

  5. PduR模块路由到Com模块,调用Com_TxConfirmation函数,确认发送状态。

CAN-数据收发过程(数据链路层) _基于autosar架构_第8张图片

 图7 CAN发送确认的流程图

你可能感兴趣的:(车联网,CAN,autosar,CAN收发通讯)