目录
LIN NM
在CANoe中,软件已经集成好了LIN的网络管理失眠唤醒模块LIN NM
在这个模块中适用于所有LIN的网络管理
在这个模块中,定义了开始start state,和action
start state:
定义了两种上电状态,在oe工程启动时候的初始化状态
1.awake:一般选择awake
2.asleep:
action:
定义了网络行为
1.sleep:立即进入睡眠
2.wakeup:立即唤醒
注:如果使用此模块的时候,wakeup:唤醒帧默认为1ms左右的显性电平;sleep:默认使用睡眠:0x3C:00 FF FF FF FF FF FF FF
自定义睡眠唤醒
如果我们不能满足于系统给定的睡眠唤醒行为,这时候我们可以自定义睡眠唤醒行为
此时,我们需要用到CAPL中的睡眠唤醒函数
上图是所有的睡眠唤醒函数
linSendWakeup
lingotosleep
有三种函数允许我们调用,同时等效于linwake和linsetwakeuptimings这两个函数
on key 'b'
{
if(1== a)
{
writeex(-3,1,"睡眠");
linGotoSleep();
a = 2;
}
else if(2 == a)
{
writeex(-3,1,"发送唤醒指令");
linSendWakeup();
a = 3;
}
else if(3 == a)
{
writeex(-3,1,"睡眠");
linGotoSleep();
a = 4;
}
else if(4 == a)
{
writeex(-3,1,"发送唤醒指令");
linSendWakeup(150,3,2000);
a = 5;
}
}
配置自定义睡眠
如果我们使用使用睡眠不是0xFF的时候;这时候我们需要自己配置睡眠指令
on key 'b'
{
if(1== a)
{
writeex(-3,1,"睡眠");
linGotoSleep();
a = 2;
}
else if(2 == a)
{
writeex(-3,1,"发送唤醒指令");
linSendWakeup();
a = 3;
}
else if(3 == a)
{
writeex(-3,1,"睡眠");
master_msg.byte(0) = 0;
master_msg.byte(1) = 0x1;
master_msg.byte(2) = 0x2;
master_msg.byte(3) = 0x3;
master_msg.byte(4) = 0x4;
master_msg.byte(5) = 0x5;
master_msg.byte(6) = 0x6;
master_msg.byte(7) = 0x7;
master_msg.rtr = 0;
output(master_msg);
master_msg.rtr = 1;
output(master_msg);
a = 4;
}
else if(4 == a)
{
writeex(-3,1,"发送唤醒指令");
linSendWakeup(150,3,2000);
a = 5;
}
}
内部唤醒
如果我们想用其他id唤醒网络的话,我们可以使用内部唤醒函数进行网络唤醒
testcase NewTestCase()
{
byte i;
linFrame 0x3 msg_wk;
linFrame 0x3 tst_Frame;
linChangeDlc(msg_wk.id, 5);
tst_Frame.MsgChannel = 1;
//tst_Frame.ID = 5;
tst_Frame.DLC = 5;
for (i=0; i < 8; ++i)
{
tst_Frame.byte(i) = 0xFF;
}
tst_Frame.RTR=0;
output(tst_Frame);
linSetRespCounter(msg_wk.id,-1);
if(0 == linBusIsAwake())
{
write("11");
// Util_ResetResponseData(msg_wk.id,5);
// linSetRespCounter(msg_wk.id,-1);
linChangeWakeupSettings(0, msg_wk.id);
linSilentWakeup();
// //Util_SendHeader(msg_wk.id);
}
}
void Util_SendHeader (byte frameId)
{
linFrame 0x0 tst_Frame;tst_Frame.MsgChannel = 1;
tst_Frame.ID = frameId;
tst_Frame.RTR=1;
output(tst_Frame);
}
void Util_ResetResponseData(byte frameId, int length)
{
long i;
linFrame 0x0 tst_Frame;
linChangeDlc(frameId, length);
tst_Frame.MsgChannel = 1;
tst_Frame.ID = frameId;
tst_Frame.DLC = length;
for (i=0; i < length; ++i)
{
tst_Frame.byte(i) = 0xFF;
}
tst_Frame.RTR=0;
output(tst_Frame);
}void MainTest ()
{
NewTestCase();
}
testcase NewTestCase()
{
linFrame 0x3 msg_wk;if(0 == linBusIsAwake())
{
write("11");
// linETFSetDirtyFlag(0x10,1);
linChangeDlc(msg_wk.id,5);
msg_wk.byte(0) = 0xFF;
msg_wk.byte(1) = 0xFF;
msg_wk.byte(2) = 0xFF;
msg_wk.byte(3) = 0xFF;
msg_wk.byte(4) = 0xFF;
msg_wk.byte(5) = 0xFF;
msg_wk.byte(6) = 0xFF;
msg_wk.byte(7) = 0xFF;
msg_wk.rtr = 0;
msg_wk.msgChannel = 1;
msg_wk.id = 3;
msg_wk.dlc = 5;
output(msg_wk);
linSetRespCounter(msg_wk.id,-1);
linChangeWakeupSettings(0, msg_wk.id);
linSilentWakeup();
}
}void MainTest ()
{
NewTestCase();
}
其他函数具体参考help手册就行