二、LIN总线帧结构干扰
LIN帧的不同场格式需要按照协议进行开发,为了测试样件是否不响应错误的帧结构,就需要对LIN帧中各个场分别进行干扰以达到所需要的测试目的。实现干扰的方式有很多,本文通过CAPL自带函数来进行相应的干扰,下面将对CAPL函数linSendHeaderError()、linInvertRespBit()、linInvertHeaderBit()
进行介绍。
1. linSendHeaderError()
该函数用于干扰报文头,包含三个参数,一个是syncByte,用于设置同步场位;一个是idWithParity,用于设置标识符场;最后一个是StopAfterError,该位置1表示如果报头中一旦有某个场出现错误,则终止之后报头场的发送。
下面通过一个干扰ID为0x33的报文PID场中奇偶校验位的实例,来帮助大家进一步深入理解该函数。
// Force an error in header of LIN frame with ID=0x33 by setting wrong protected ID
on key 'h'
{
byte linID, protectedID, corParity, errParity, errPID;
// calculate protected ID with wrong parity bits
linID = 0x33; // use frame ID=0x33
protectedID = linGetProtectedID(linID); // get protected ID
corParity = (protectedID & 0xC0) >> 6; // extract parity (0xC=0=11000000)
errParity = (corParity ^ 0x2) & 0x3; // calculate wrong parity using XOR
errPID = linID | (errParity << 6); // calculate PID with wrong parity
linSendHeaderError(0x55, errPID, 0);
}
给大家大致解释一下脚本的实现逻辑,首先通过linGetProtectedID()可以获取该报文正确的PID值,然后通过corParity = (protectedID & 0xC0) >> 6提取出奇偶校验位,与0x2异或干扰校验位,最后通过errPID = linID | (errParity << 6)得出一个干扰过奇偶校验位的PID值并赋值给自己先前声明的errPID即得到了一个带有错误奇偶校验位的PID值,通过函数linSendHeaderError(0x55,errPID,0)发送错误PID值的LIN报头,即实现了对PID场的干扰。
2.linInvertRespBit()
该函数用于干扰响应,主要关注的参数如下,byteIndex用来指定干扰数据场第几字节(如果该参数值设置为报文长度,则干扰的是校验位长度);bitIndex用来指定干扰相对应第几位;level值为0的话,则把相应位从隐形干扰成显性,如果为1则反之从显性干扰成隐性;numberOfExecutions这个参数用来定义干扰的个数。
下面通过下面的示例,来帮助大家进一步深入理解该函数。
on key 'i'
{
...
// Invert first bit of byte field 8 for LIN frame with ID=0x33
linInvertRespBit(0x33, 7, 0);
...
// Invert bit 7 of checksum byte field for LIN frame with ID=0x33
linInvertRespBit(0x33, 8, 6);
...
// Invert stop bit of byte field 8 for LIN frame with ID=0x33
linInvertRespBit(0x33, 7, 8);
...
}
第一个函数是干扰第8个比特,由于bitIndex是0,所以干扰的是该比特的第一个位,其中第二个函数如果byteIndex的长度和DLC长度一样,则说明干扰的是该报文的checksum位。
3.linInvertHeaderBit()
该函数用于干扰报头,主要关注的参数如下,byteIndex用来指定干扰数据场类型,如果为-1,则是干扰间隔场,如果为0干扰同步场,如果为1干扰PID场;bitIndex用来指定干扰相对应第几位,如果为8则是干扰stopbit;level值为0的话,则把相应位从隐形干扰成显性,如果为1则反之从显性干扰成隐性;numberOfExecutions这个参数用来定义干扰的个数;disturbAfterHeaderID这个参数用来指定在该ID之后进行干扰,这个参数需要搭配waitForHeaders使用,如果设置waitForHeaders为0,disturbAfterHeaderID为5,则是等收到ID为5的报文后,在下一个报头直接进行干扰。
三、小结
通过上述的介绍,大家应该对基于CAPL对LIN报文各场干扰有了一定的了解了。通过发送干扰的报头或者对从节点的响应进行干扰,然后再发送正常帧,即可通过该正常帧的数据,对ResponseError位是否能正确置位进行测试了。
北汇信息作为Vector中国的合作伙伴,致力于为中国汽车客户提供优质的工具支持、解决方案以及测试服务。
图片来源:LIN Specification Package Revision 2.1以及Vector