CAN报文收发流程

在汽车电子系统中,CAN(Controller Area Network)总线是一种高度可靠、实时性强的数据通信协议。AUTOSAR(AUTomotive Open System ARchitecture)框架提供了一组标准化的软件模块,用于处理CAN总线通信的各种操作。本文将详细介绍AUTOSAR框架内CAN报文的收发流程,涉及从应用程序接口到硬件驱动层的各个步骤。

CAN通信相关的AUTOSAR模块

在AUTOSAR架构中,与CAN通信相关的主要模块包括:

  1. CanIf(CAN Interface):CAN接口模块,提供CAN Driver和上层的PDU Router之间的接口。
  2. CanDrv(CAN Driver):CAN驱动模块,负责与CAN控制器硬件的直接交互。
  3. PduR(PDU Router):PDU路由模块,负责在不同的通信模块之间路由PDUs(Protocol Data Units)。
  4. Com(Communication Manager):通信管理模块,负责数据的打包和解包,并与应用层交互。
  5. Application(应用层):应用层,最终发送和接收数据的实现部分。

CAN数据发送流程

以下是AUTOSAR CAN报文发送流程的详细步骤:

1. 应用层(Application)

应用层通过调用COM模块的接口函数,提交一个发送请求。

#include "Com.h"

void Application_SendData(uint8_t* data, uint8_t length) {
    Com_SendSignal(signalId, data);
}
2. 通信管理模块(Com)

COM模块接收到数据后,进行必要的数据处理,如打包、编码等。然后,将数据发送给PduR(PDU Router)模块。

#include "Com.h"
#include "PduR.h"

void Com_SendSignal(signalId, const uint8_t* data) {
    // 数据打包和处理
    PduR_ComTransmit(PduId, data);
}
3. PDU路由模块(PduR)

PduR负责将数据路由到相应的下层模块,如CanIf。

#include "PduR.h"
#include "CanIf.h"

void PduR_ComTransmit(PduId, const uint8_t* data) {
    // 路由到CAN接口模块
    CanIf_Transmit(CanTxPduId, data);
}
4. CAN接口模块(CanIf)

CanIf接收到PDU后,调用CAN驱动模块(CanDrv),将数据传输给CAN控制器硬件。

#include "CanIf.h"
#include "Can.h"

void CanIf_Transmit(CanTxPduId, const uint8_t* data) {
    // 调用CAN驱动模块
    Can_Write(CanTxPduId, data);
}
5. CAN驱动模块(CanDrv)

CanDrv与CAN控制器的硬件寄存器直接交互,将数据写入CAN控制器的发送缓冲区,并启动数据传输。

#include "Can.h"

void Can_Write(CanTxPduId, const uint8_t* data) {
    // 写数据到CAN控制器硬件寄存器
    CAN_CONTROLLER->TX_BUFFER[CanTxPduId] = data;
    // 启动CAN传输
    CAN_CONTROLLER->COMMAND = CAN_TRANSMIT;
}

CAN数据接收流程

以下是AUTOSAR CAN报文接收流程的详细步骤:

1. CAN控制器硬件

当CAN报文到达时,CAN控制器硬件会将数据存储到接收缓冲区,并触发接收中断。

void CAN_Receive_IRQHandler(void) {
    if (CAN_CONTROLLER->STATUS & CAN_RX_PENDING) {
        // 数据已到达接收缓冲区
        uint8_t* data = CAN_CONTROLLER->RX_BUFFER;
        // 通知CAN驱动模块
        Can_RxIndication(data);
    }
}
2. CAN驱动模块(CanDrv)

CAN驱动模块的接收中断服务程序将数据提交给CAN接口模块(CanIf)。

#include "Can.h"
#include "CanIf.h"

void Can_RxIndication(uint8_t* data) {
    // 将数据传输给CanIf模块
    CanIf_RxIndication(CanRxPduId, data);
}
3. CAN接口模块(CanIf)

CanIf接收到数据后,将其传输给PduR模块。

#include "CanIf.h"
#include "PduR.h"

void CanIf_RxIndication(CanRxPduId, const uint8_t* data) {
    // 将数据传输给PduR模块
    PduR_CanIfRxIndication(CanRxPduId, data);
}
4. PDU路由模块(PduR)

PduR将数据路由到COM模块。

#include "PduR.h"
#include "Com.h"

void PduR_CanIfRxIndication(CanRxPduId, const uint8_t* data) {
    // 调用COM模块的接口函数
    Com_RxIndication(PduId, data);
}
5. 通信管理模块(Com)

COM模块接收到数据后,进行必要的解包和处理,然后通知应用层。

#include "Com.h"

void Com_RxIndication(PduId, const uint8_t* data) {
    // 数据解包和处理
    Application_RxIndication(data);
}
6. 应用层(Application)

应用层接收到COM模块传递的数据,进行相应的处理和业务逻辑。

#include "Application.h"

void Application_RxIndication(const uint8_t* data) {
    // 处理接收到的数据
    ProcessReceivedData(data);
}

总结

AUTOSAR框架内的CAN报文收发流程通过模块化、标准化的设计,确保了通信的可靠性和一致性。通过层层调用,数据从应用层传输到硬件,并在接收时从硬件传回到应用层。整个流程涉及多个AUTOSAR标准模块,如CanIf、CanDrv、PduR和Com,这些模块相互协作,共同完成了CAN报文的发送和接收。

了解并正确实现AUTOSAR CAN报文的收发流程,对于构建稳定可靠的汽车电子系统至关重要。如果你有更多具体问题或需要进一步的技术支持,请随时告诉我!


References

[ 搞一点AutoSar ]一张图帮你理解CAN通信全过程-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值