1.配置网络管理报文id范围
配置dbc(导入)
网管报文genmsgilsupport设置yes:相当于当成应用报文使用,可以手动设置byte2->byte7的数据
配置can邮箱的筛选器(直接配置)
can邮箱接收到can报文进行中断,送到canif中,进行下一步分类
其他报文要设置CanIfRxPduCanId:通过此参数设置接收到的CAN L-PDU的CAN标识符。如果只给Rx-PDU分配了一个CAN标识符,则使用此参数。如果额外配置了CanIfRxPduCanIdMask参数,则定义了CAN标识符的范围。 网管报文是范围所以不设置
2.配置网络管理报文参数
根据需求表
T_START_NM_TX:进入重复消息状态,到发送第一帧网络管理报文时间限制
T_STARTx_AppFrame:网管报文发出到发出应用报文时间限制
T_NM_immediateCycleTime:快发网管报文周期
T_NM_MessageCycle:网管报文发送周期
T_WAKEYP:休眠状态接收到报文到发出报文时间间隔
·
MsgTimeoutTime:
指定NM pdu的传输超时时间。如果在此超时时间内CAN接口没有发送确认,则canm模块将给出错误通知。
限制:当(CanNmPassiveModeEnabled == False)时,此参数才有意义。它应该是CanNmMainFunctionPeriod的倍数,且小于CanNmMsgCycleTime。如果CanNmBusLoadReductionActive为True,它也应该小于CanNmMsgReducedTime。
MsgReducedTime:
该值指定在减少总线负载的周期性传输模式下节点特定的总线周期时间。
限制:此参数仅在(CanNmBusLoadReductionEnabled == True)和(CanNmBusLoadReductionActive == True)和(CanNmPassiveModeEnabled == False)时相关。
该值在网络中必须唯一,且有如下限制:(0,5 * CanNmMsgCycleTime) <= CanNmMsgReducedTime < CanNmMsgCycleTime
NodeId:
指定本地节点的节点标识符。
如果canmpdunidposition = CANNM_PDU_OFF),则在网络管理消息中传输'NodeId'。
节点标识符用于检测当前节点,并且可以由应用程序在任何时候读取。
备注:该值在NM消息中传递。
PduCbvPosition:
该值指定控制位向量在NM PDU中的位置。
该参数的值表示控制位向量在NM PDU中的位置(CANNM_PDU_BYTE_0表示字节0,CANNM_PDU_BYTE_1表示字节1,CANNM_PDU_OFF表示控制位向量不属于NM PDU)。
限制:如果(CanNmPduCbvPosition != CANNM_PDU_OFF),那么(CanNmPduCbvPosition != CanNmPduNidPosition)和(cannmpdullength >= CanNmPduCbvPosition)。
如果(CanNmPduNidPosition == CANNM_PDU_OFF)则(CanNmPduCbvPosition != CANNM_PDU_BYTE_1)。
PduNidPosition:
该值指定源节点标识符在NM PDU中的位置。(vcu地址)
该参数的值表示源节点标识符在NM PDU中的位置(CANNM_PDU_BYTE_0表示字节0,CANNM_PDU_BYTE_1表示字节1,CANNM_PDU_OFF表示源节点标识符不属于NM PDU)。
注意:如果'CanNmNodeIdEnabled'是ON,则允许为每个通道设置'CanNmPduNidPosition'为CANNM_PDU_OFF。
限制:如果(CanNmPduNidPosition != CANNM_PDU_OFF),那么(CanNmPduNidPosition != CanNmPduCbvPosition)和(cannmpdullength >= CanNmPduNidPosition)。
如果(CanNmPduCbvPosition == CANNM_PDU_OFF),则(CanNmPduNidPosition != CANNM_PDU_BYTE_1)。
CanNmActiveWakeupBitEnabled=>CRV 的bit4 区别是主动唤醒还是被动
CanNmNodeDetectionEnabled=>CRV 的Bit 0: Repeat Message Request 置1时候要跳转重复消息状态 检测总线当前存在的网络节点
3.配置网络管理报文数据初始化
网管状态回调函数,相当于状态机,网管状态改变,就会调用这个函数
void NmStateChangeIndCallback(UINT8 nmNetworkHandle,UINT8 nm_Previous_State,UINT8 nm_Current_State)
4.网络管理需求配置
1.首帧为网管报文 2. data0:0x1为报文唤醒 0x2为硬线唤醒 3.节点地址配置
1配置第一帧发送网管报文
任务调度时,先打开can通道再发送网管报文,所以task里面cansm要在cannm上面。
任务从睡眠或者预睡眠 ->重复消息状态,且当前是重复消息状态,更新信号源
2. data0:0x1为报文唤醒 0x2为硬线唤醒
void NmStateChangeIndCallback(UINT8 nmNetworkHandle,UINT8 nm_Previous_State,UINT8 nm_Current_State)
{
U8 u8_canUserData[6]={0};
if(nmNetworkHandle == ComMConf_ComMChannel_CN_PT_CarFLZCU_VCU_BDMessagelis_78603eb3)
{
switch(nm_Previous_State)
{
case NM_STATE_BUS_SLEEP:
if(nm_Current_State == NM_STATE_REPEAT_MESSAGE)
{
//主动唤醒
u8_canUserData[0]=0x01
}
break;
case NM_STATE_READY_SLEEP:
if(nm_Current_State == NM_STATE_REPEAT_MESSAGE)
{
//被动唤醒
u8_canUserData[0]=0x02
}
break;
default:
break;
}
CanNm_SetUserData(ComMConf_ComMChannel_CN_PT_CarFLZCU_VCU_BDMessagelis_78603eb3, u8_canUserData);
3.节点地址配置(ecu地址byte1)