Can驱动测试.docx

上传人:b****1 文档编号:3196921 上传时间:2023-05-05 格式:DOCX 页数:20 大小:24.08KB
下载 相关 举报
Can驱动测试.docx_第1页
第1页 / 共20页
Can驱动测试.docx_第2页
第2页 / 共20页
Can驱动测试.docx_第3页
第3页 / 共20页
Can驱动测试.docx_第4页
第4页 / 共20页
Can驱动测试.docx_第5页
第5页 / 共20页
Can驱动测试.docx_第6页
第6页 / 共20页
Can驱动测试.docx_第7页
第7页 / 共20页
Can驱动测试.docx_第8页
第8页 / 共20页
Can驱动测试.docx_第9页
第9页 / 共20页
Can驱动测试.docx_第10页
第10页 / 共20页
Can驱动测试.docx_第11页
第11页 / 共20页
Can驱动测试.docx_第12页
第12页 / 共20页
Can驱动测试.docx_第13页
第13页 / 共20页
Can驱动测试.docx_第14页
第14页 / 共20页
Can驱动测试.docx_第15页
第15页 / 共20页
Can驱动测试.docx_第16页
第16页 / 共20页
Can驱动测试.docx_第17页
第17页 / 共20页
Can驱动测试.docx_第18页
第18页 / 共20页
Can驱动测试.docx_第19页
第19页 / 共20页
Can驱动测试.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

Can驱动测试.docx

《Can驱动测试.docx》由会员分享,可在线阅读,更多相关《Can驱动测试.docx(20页珍藏版)》请在冰点文库上搜索。

Can驱动测试.docx

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

//人工干预中断退出

}

//计时结束

//打印运行信息:

报文个数、错误个数、运行时间、每次循环的间隔时间、状态寄

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2