Can驱动测试.docx
《Can驱动测试.docx》由会员分享,可在线阅读,更多相关《Can驱动测试.docx(20页珍藏版)》请在冰点文库上搜索。
Can驱动测试
Can驱动测试方案
一、测试目的
测试can驱动程序的正确性及稳定性
二、测试环境及设备
硬件:
待测can网设备(基于can2.0B协议)、can分析仪
待测设备单CAN网时测试连接图:
1H
1L
软件:
测试用例、待测系统支撑软件及CAN驱动。
CAN驱动应提供中断模式下的驱动接口。
三、测试内容
针对不同can芯片的驱动,按照测试用例(与操作系统无关)逐项测试,得到测试结果。
1.CAN自环测试
由驱动开发者提供测试函数接口,这个环节一般在驱动提交前应经过开发者测试。
2.单CAN网设备收发测试
采用低速、高速、单包、多包的组合进行测试[1]
采用待测CAN网与CAN分析仪进行收发测试验证,
测试内容:
1)待测CAN循环[2]发送报文,CAN分析仪接收报文
2)待测CAN循环[2]接收报文,CAN分析仪发送报文
3)待测CAN发送、间隔时间后接收,CAN测试仪发送、间隔时间后接收
4)干扰或者节点失灵情况下的收发情况(需组网)
注1.为了方便检测接收报文的正确性,测试用例中的报文应符合一定的规律。
注2.循环时间间隔选取要考虑到接收端溢出及发送端溢出的极端情况。
3.CAN报文过滤功能测试
待测CAN设置接收过滤功能,CAN分析仪发送不同的帧ID,观察待测CAN的报文接收情况。
4.CAN报文优先级测试
在待测CAN循环发送报文过程中,插入优先发送报文,观察CAN分析仪中的报文接收情况。
5.其他测试(需要组网)
◆节点休眠唤醒功能测试
◆节点故障自恢复能力测试
◆Can总线负载、峰值负载
◆错误统计、发送延迟
◆Can总线的实时性
四、测试结果
表1:
控制芯片类型__发送(接收)间隔时间__
测试时间__报文数量__
测试项目
低速-125K
高速-1M
错误
计数
状态寄存器值
中断状态寄存器值
待测CAN发送
待测CAN接收
待测CAN收发
待测CAN优先级发送
待测CAN过滤功能
五、测试用例
/*can_test.c包含CAN功能测试函数的文件,适用于PhilipsSJA1000和XilinxXCAN*/
/*说明:
本模块包含了对PhilipsSJA1000和XilinxXCAN驱动的测试函数
************************************************************************
CAN驱动应提供一下函数接口
canInit-initializeCANchip
canStart-
canSetBitTiming-setCANbaudrate
canEnterMode-enteroneofmode(NORMAL/CONFIG/SLEEP)
canIntEnable-
canRecv-receivemessagefromCAN
canSend-sendmessagetoCAN
canSendHighPriority-sendsaCANHighPrioritymessage
canAcceptFilterSet-
canAcceptFilterEnable-
canInterruptGetStatus-
canGetStatus-
*************************************************************************/
#ifdefined(SJA1000)
#defineFRAME_NUM_POS1
#defineFRAME_TYPE_POS4
#defineFRAME_START0xf8
#defineFRAME_LENGTH13
#elifdefined(FPGA_CAN)
#defineFRAME_NUM_POS0
#defineFRAME_TYPE_POS3
#defineFRAME_START0x3e
#defineFRAME_LENGTH16
#endif
voidtestOneMsgRecv(intcanId,UINT8baudMode,intdelayTime);
voidtestOneMsgSend(intcanId,UINT8baudMode,intdelayTime);
voidtestMultiMsgRecv(intcanId,UINT8baudMode,intdelayTime);
voidtestMultiMsgSend(intcanId,UINT8baudMode,intdelayTime);
voidtestAcceptFilter(intcanId,UINT8baudMode,intdelayTime);
voidtestOneMsgHighPriSend(intcanId,UINT8baudMode,intdelayTime);
/************************************************************************
根据驱动芯片及提供的驱动程序不同,测试时会根据需要修改下列宏定义
************************************************************************/
#defineCAN_MESSAGE_LEN
#defineINIT_CAN(canId)
#defineSET_CAN_BAUD(baudMode)
#defineCAN_INT_CONNECT(canId)
#defineCAN_START(canId)
#defineCAN_RECV
#defineCAN_SEND
#defineCAN_SEND_HIGH_PRIORITY
/*单包接收测试
测试过程:
CAN分析仪发送报文,待测CAN接收报文,根据报文序列的连贯性判断接受是否有误
1.采用接收中断方式处理
2.为方便报文检查,每次接收报文的字节数定义为该CAN控制芯片一个消息的字节数
3.报文序列规则:
取决于CAN分析仪的发送报文规则
参数:
canId-多CAN时的CAN序号,用以区分实例化CAN
baudMode-用以区分不同的波特率设置
0:
125K
1:
1M
delayTime-两次接收过程间隔
*/
voidtestOneMsgRecv(intcanId,UINT8baudMode,intdelayTime)
{
UINT8recvPack[16];
UINT16recvLen;
interrorNum=0;
longrecvNum=0;
//初始化CAN,
INIT_CAN(canId);
//设置CAN速率
SET_CAN_BAUD(baudMode);
//挂接CAN中断
CAN_INT_CONNECT(canId);
//启动CAN,进入正常模式
CAN_START(canId);
//计时开始
while
(1)
{
recvLen=CAN_RECV(canId,CAN_MESSAGE_LEN,recvPack);
if(recvLen==CAN_MESSAGE_LEN)
{
//判断报文正确性,如果错误,则累加错误计数,
//可通过控制台显示循环次数、错误计数及接收报文
recvNum++;
}
elseif(recvLen>0)
{
//不完整的消息
errorNum++;
}
//延时delayTime
//人工干预中断退出
}
//计时结束
//打印运行信息:
报文个数、错误个数、运行时间、每次循环的间隔时间、状态寄存器值、中断状态寄存器值、
}
/*单包发送测试
测试过程:
待测CAN发送报文,CAN分析仪接收报文,根据报文序列的连贯性人工判断接收是否有误
1.采用中断方式发送
2.为方便报文检查,每次发送报文的字节数定义为该CAN控制芯片一个消息的字节数
3.报文序列规则:
参数:
canId-多CAN时的CAN序号,用以区分实例化CAN
baudMode-用以区分不同的波特率设置
0:
125K
1:
1M
delayTime-两次发送过程间隔
*/
voidtestOneMsgSend(intcanId,UINT8baudMode,intdelayTime)
{
UINT8sendPack[16];
intflag;
interrorNum=0;
longrunNum=0;
//pack包定义
//初始化CAN,
INIT_CAN(canId);
//设置CAN速率
SET_CAN_BAUD(canId,baudMode);
//挂接CAN中断
CAN_INT_CONNECT(canId);
//启动CAN,进入正常模式
CAN_START(canId);
//计时开始
while
(1)
{
flag=CAN_SEND(canId,CAN_MESSAGE_LEN,pack);
if(flag>0)
{
//可通过控制台显示循环次数、错误计数及接收报文
runNum++;
}
//查询有关错误的状态寄存器值,如果错误,则累加错误计数,
//延时delayTime
//人工干预中断退出
}
//计时结束
//打印运行信息:
报文个数、错误个数、运行时间、每次循环的间隔时间、状态寄存器值、中断状态寄存器值、
}
/*多包接收测试
测试过程:
CAN分析仪发送报文,待测CAN根据规则接收完整报文,根据报文序列的连贯性人工判断接受是否有误
1.采用中断方式发送
2.报文序列规则:
在每个报文中包含消息个数及消息长度?
取决于CAN分析仪的发送报文规则
报文格式:
ID(28:
0)
28:
21-起始帧中为帧数,中间帧中为帧序号
20:
13-0
12:
5-0
4:
0-起始帧为0x1f,非起始帧为0x10
对于SJA1000控制器:
报文格式为0x88帧数000xf8/0x80其他为8字节数据
对于FPGA的CAN控制器:
报文格式为帧数0x1800x3e/0x200x80000其他为8字节数据
参数:
canId-多CAN时的CAN序号,用以区分实例化CAN
baudMode-用以区分不同的波特率设置
0:
125K
1:
1M
delayTime-两次完整报文接收过程间隔
*/
voidtestMultiMsgRecv(intcanId,UINT8baudMode,intdelayTime)
{
UINT8recvPack[16];
UINT8msgPack[1024];
UINT16recvLen=0;
UINT16packLen=0;
interrorNum=0;
longrunNum=0;
UINT16frameNum,frameNo;
inti;
//初始化CAN,
INIT_CAN(canId);
//设置CAN速率
SET_CAN_BAUD(canId,baudMode);
//挂接CAN中断
CAN_INT_CONNECT(canId);
//启动CAN,进入正常模式
CAN_START(canId);
//计时开始
while
(1)
{
recvLen=CAN_RECV(canId,CAN_MESSAGE_LEN,recvPack);
if(recvLen>0)
{
if(recvPack[FRAME_TYPE_POS]==FRAME_START)
{
frameNum=recvPack[FRAME_NUM_POS];
}
else
{
frameNo=recvPack[FRAME_NUM_POS];
}
for(i=0;i{
msgPack[FRAME_LENGTH*frameNo+i]=recvPack[i];
}
if((frameNo+1)>=frameNum)
{
//收到完整报文
//判断报文正确性,如果错误,则累加错误计数,
//可通过控制台显示循环次数、错误计数及接收报文
}
runNum++;
}
//查询有关错误的状态寄存器值,
//延时delayTime
//人工干预中断退出
}
//计时结束
//打印运行信息:
报文个数、错误个数、运行时间、每次循环的间隔时间、状态寄存器值、中断状态寄存器值、
}
/*多包发送测试
测试过程:
待测CAN发送报文,CAN分析仪根据规则接收完整报文,根据报文序列的连贯性判断接受是否有误
1.采用接收中断方式处理
2.报文序列规则:
在每个报文中包含消息个数及消息长度?
取决于CAN分析仪的发送报文规则
报文格式:
ID(28:
0)
28:
21-起始帧中为帧数,中间帧中为帧序号
20:
13-0
12:
5-0
4:
0-起始帧为0x1f,非起始帧为0x10
对于SJA1000控制器:
报文格式为0x88帧数000xf8/0x80其他为8字节数据
对于FPGA的CAN控制器:
报文格式为帧数0x1800x3e/0x200x80000其他为8字节数据
参数:
canId-多CAN时的CAN序号,用以区分实例化CAN
baudMode-用以区分不同的波特率设置
0:
125K
1:
1M
delayTime-两次完整报文发送过程间隔
*/
voidtestMultiMsgSend(intcanId,UINT8baudMode,intdelayTime)
{
UINT8sendPack[16];
UINT8msgPack[1024];
UINT16sendLen=0;
UINT16packLen=0;
interrorNum=0;
longrunNum=0;
UINT16frameNum,frameNo;
inti=0,j=0,k=0;
//初始化CAN,
INIT_CAN(canId);
//设置CAN速率
SET_CAN_BAUD(canId,baudMode);
//挂接CAN中断
CAN_INT_CONNECT(canId);
//启动CAN,进入正常模式
CAN_START(canId);
//计时开始
while
(1)
{
i=0;
//每次发送8帧消息
for(j=0;j<8;j++)
{
#ifdefined(SJA1000)
if(j==0)//起始帧
{
sendPack[i++]=0x88;
sendPack[i++]=8;
sendPack[i++]=0;
sendPack[i++]=0;
sendPack[i++]=0xf8;
}
else//非起始帧
{
sendPack[i++]=0x88;
sendPack[i++]=j;
sendPack[i++]=0;
sendPack[i++]=0;
sendPack[i++]=0x80;
}
#elifdefined(FPGA_CAN)
if(j==0)//起始帧
{
sendPack[i++]=8;
sendPack[i++]=0x18;
sendPack[i++]=0;
sendPack[i++]=0x3e;
}
else//非起始帧
{
sendPack[i++]=j;
sendPack[i++]=0x18;
sendPack[i++]=0;
sendPack[i++]=0x20;
}
sendPack[i++]=0x80;
sendPack[i++]=0;
sendPack[i++]=0;
sendPack[i++]=0;
#endif
sendPack[i++]=k;
sendPack[i++]=k;
sendPack[i++]=k;
sendPack[i++]=k;
sendPack[i++]=k;
sendPack[i++]=k;
sendPack[i++]=k;
sendPack[i++]=k;
//报文内容变化
k++;
}
sendLen=CAN_SEND(canId,CAN_MESSAGE_LEN*8,sendPack);
if(sendLen>0)
{
runNum++;
}
//查询有关错误的状态寄存器值,
//延时delayTime
//人工干预中断退出
}
//计时结束
//打印运行信息:
报文个数、错误个数、运行时间、每次循环的间隔时间、状态寄存器值、中断状态寄存器值、
}
/*接收过滤测试-采用单包接收方式
发送端采用变化ID发送数据,观察接收端的报文接收情况
1.在CAN2.0B模式下,SJA1000只有一个过滤器,XILNIX-XCAN最多可以设置四个过滤器
2.MaskValue-掩码
3.IdValue-接收过滤ID值
*/
voidtestAcceptFilter(intcanId,UINT8baudMode,intdelayTime,intFilterIndex,UINT32MaskValue,UINT32IdValue)
{
UINT8recvPack[16];
UINT16recvLen;
interrorNum=0;
longrunNum=0;
//初始化CAN,
INIT_CAN(canId);
//设置CAN速率
SET_CAN_BAUD(canId,baudMode);
//挂接CAN中断
CAN_INT_CONNECT(canId);
//设置接收过滤
SET_CAN_RXFILTER(canId,FilterIndex,MaskValue,IdValue);
//使能接收过滤
#ifdefFPGA_CAN
CAN_RXFILTER_ENABLED(canId,FilterIndex);
#endif
//启动CAN,进入正常模式
CAN_START(canId);
//计时开始
while
(1)
{
recvLen=CAN_RECV(canId,CAN_MESSAGE_LEN,recvPack);
if(recvLen==CAN_MESSAGE_LEN)
{
//判断接收报文的ID是否符合过滤原则,如果错误,则累加错误计数,
//可通过控制台显示循环次数、错误计数及接收报文
runNum++;
}
elseif(recvLen>0)
{
//不完整的消息
errorNum++;
runNum++;
}
//查询有关错误的状态寄存器值,
//延时delayTime
//人工干预中断退出
}
//计时结束
//打印运行信息:
报文个数、错误个数、运行时间、每次循环的间隔时间、状态寄存器值、中断状态寄存器值、
}
/*发送高优先级报文测试
测试过程:
待测CAN发送报文,CAN分析仪接收报文,在报文正常发送过程中插入高优先级报文,根据报文序列的连贯性人工判断接收是否有误
1.采用中断方式发送
2.为方便报文检查,每次发送报文的字节数定义为该CAN控制芯片一个消息的字节数
3.报文序列规则:
参数:
canId-多CAN时的CAN序号,用以区分实例化CAN
baudMode-用以区分不同的波特率设置
0:
125K
1:
1M
*/
voidtestOneMsgHighPriSend(intcanId,UINT8baudMode,intdelayTime)
{
UINT8sendPack[16];
intflag;
interrorNum=0;
longrunNum=0;
//pack包定义
//初始化CAN,
INIT_CAN(canId);
//设置CAN速率
SET_CAN_BAUD(canId,baudMode);
//挂接CAN中断
CAN_INT_CONNECT(canId);
//启动CAN,进入正常模式
CAN_START(canId);
//计时开始
while
(1)
{
flag=CAN_SEND(canId,CAN_MESSAGE_LEN,sendPack);
if(flag>0)
{
//可通过控制台显示循环次数、错误计数及接收报文
runNum++;
}
flag=CAN_SEND_HIGH_PRIORITY(canId,CAN_MESSAGE_LEN,sendPack);
if(flag>0)
{
//可通过控制台显示循环次数、错误计数及接收报文
runNum++;
}
//查询有关错误的状态寄存器值,如果错误,则累加错误计数,
//延时delayTime
//人工干预中断退出
}
//计时结束
//打印运行信息:
报文个数、错误个数、运行时间、每次循环的间隔时间、状态寄