AUTOSAR实现应用报文延时发送,保证唤醒首帧是网络管理报文的配置方法

一. 背景

二. 配置方法

三. SWC代码实现参考


一. 背景

1. 汽车CAN网络中,由于部分的CAN可能是私CAN连接(即网络上只有两个节点),并且对端节点使用了支持硬件过滤唤醒的CAN收发器(如1145等),那么如果主动唤醒的ECU发送的首帧报文是应用报文,是无法唤醒对端ECU的,那么总线上体现为错误帧,如果ECU一直重发这一帧的话,那么就会导致总线上一直是该错误帧,继而无法发送出网络管理报文来唤醒对端ECU

2. 部分车厂会要求唤醒时,应用报文需要在网络管理发出至少xx毫秒才能发出,来保证对端ECU有足够的时间启动完毕并且接收每条应用报文的首帧。

因此,在项目开发的过程中,有必要对唤醒时应用报文的发送进行延时的配置,本文基于vector的AUTOSAR协议栈进行思路以及配置的分享。

实现思路主要是通过在BSWM创建规则,SWC根据当前网络管理的状态判断是否需要进行发送延时,进行报文的收发控制。

二. 配置方法

1. 打开对应工程的DaVinci Developer,单击Object Browser,在Mode Declaration Groups->New Mode Declaration Group…

 2. 按照如下配置TxDisable/TxEnable的值,并且将TxDisable设置成初始值

 3. 打开对应工程的DaVinci Developer,单击Object Browser,在Application Port Interfaces->Application Port Interfaces->New Mode Port Interfaces…

 4. 输入端口的名字(如果有多路CAN需要配置延时规则,那么命名最好带上对应CAN的名称作区分)

5. New创建,并且选择上面创建的Declaration Group,配置完成后点击确定即可。 

注意:如果有多路CAN需要配置应用报文延迟发送规则,那么需要配置多个Mode Port Interface

 6. 在网络管理控制相关的SWC上,右键->New Port Prototype…->New Mode R-Port Prototype

 7. 在对应的RunnableAccess Points中,加入对应的Send Mode SwitchesRead Sent Mode,至此, DaVinci Developer的配置完成,点击保存即可

8. 打开对应的DaVinciConfig的界面,在BSW Management中,在Mode Switch Ports右键,Add Mode Switch Port

9. 选择SWC中建立的对应的BSW模式控制的接口

 

 10. 点击Mode Notification Port右键,Create Mode Notification Port…

 11. 参考如下的配置,配置初始值为TxDisable

12. 在发送的规则中,点击第2点处对Rules进行修改 

 

13. 按住新增加的控制规则,拖拽至右侧

14. 设置为等于TxEnable模式,点击Finish即可。即可设置该路CAN的发送规则为,当CanTxControl SWC写成TxEnable之后,才会发送CAN报文

注意:如果重新自动生成BSWM Rules时,其会提示是否删除对应手动创建的Rules,我们不要勾选,否则就会把我们手动建立的Rule删除了。

 

15. 在最后一步需要将SWC的模式控制的接口和BSWM进行连接,选中需要连接的接口,右键Connect 

16. 选择对应的BswM端口进行连接即可

 17. 完成以上配置之后,即可进行BSWSWC的代码生成

三. SWC代码实现参考

#define DELAY_OPEN_CAN_COMM_TIME           (200/10)   //延时时间按照此进行调整
boolean g_isCanCommOpen = FALSE;
boolean g_isNeedDelayOpen = TRUE;

/**
 * @description: 
 * @param {NetworkHandleType} nmNetworkHandle
 * @param {Nm_StateType} nmPreviousState
 * @param {Nm_StateType} nmCurrentState
 * @return {*}
 */
void Sys_StateChangeCallback(const NetworkHandleType nmNetworkHandle, const Nm_StateType nmPreviousState, const Nm_StateType nmCurrentState )
{
    if((nmPreviousState == NM_STATE_PREPARE_BUS_SLEEP || nmPreviousState == NM_STATE_BUS_SLEEP) \
       && nmCurrentState == NM_STATE_REPEAT_MESSAGE)
    {
        g_isCanCommOpen = TRUE;
    }
    else if(nmCurrentState == NM_STATE_PREPARE_BUS_SLEEP || nmCurrentState == NM_STATE_BUS_SLEEP)
    {
        g_isCanCommOpen = FALSE;
        g_isNeedDelayOpen = TRUE;
        Rte_Switch_PiComTxCommControl_Mode(RTE_MODE_ComTxMode_TxDisable);
    }
    else
    {
        /*do nothing*/
    }
}

/**
 * @description: 
 * @return {*}
 */
void Sys_delayOpenCanCommMainFunction(void)
{
    static uint8 u8DelayCnt = 0U;

    if(g_isCanCommOpen == TRUE && g_isNeedDelayOpen == TRUE)
    {
        if(u8DelayCnt < DELAY_OPEN_CAN_COMM_TIME)
        {
            u8DelayCnt++;
        }
        else
        {
            u8DelayCnt = 0U;
            g_isNeedDelayOpen = FALSE;

            Rte_Switch_PiComTxCommControl_Mode(RTE_MODE_ComTxMode_TxEnable);
        }
    }
}

1.Sys_delayOpenCanCommMainFunction需要放在轮询的Runnable中调用(如10msRunnable中)

2. Sys_StateChangeCallback需要放在Nm的状态切换回调里面调用(不知道如何配置Nm状态切换的回调可以参考下图

附:

如果对应的CAN还存在时间同步报文Master的角色,那么还需要单独增加代码控制时间同步报文的发送,因为时间同步报文不属于应用报文,所以不受COM模块的控制,上述配置的BswM Rule无法对其发送起到控制作用。

控制方法:可以通过CanTSyn_SetTransmissionMode控制时间同步的开关(可放在上一步代码实现中对BswM进行开关的代码处)

注意:该API的第一个传参是CtrlIdx,指的是CanIf模块的CtrlId,并非CanTSyn的索引。

以上就是本文分享的全部内容。

  • 10
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值