在线时间1 小时
UID2048281
注册时间2013-10-15
NXP金币0
该用户从未签到
注册会员

- 积分
- 73
- 最后登录
- 1970-1-1
|
用DT256单片机,实现CAN通信接收,并显示帧类型,是数据帧显示1,远程帧显示2. 函数ssss()和CANRCVFRM()。直接调用函数ssss()正常,但如果用CANRCVFRM(),不管接收什么类型的帧,都只显示2.
unsigned char ssss() {
unsigned char * CANRCVBUF;
unsigned char i;
unsigned char IDEFlag; //IDE标志
unsigned char RTRFlag; //RTR标志
unsigned char FrameFlag; //帧标志
unsigned char * addr; //接收帧首地址
if ((CAN0RFLG &(1 << RXF)) == 0)
return 0xFF; //未收到数据,返回0xFF
//RXF=1,表示收到数据,取数据处理
addr = (unsigned char *)(&CAN0RXFG);
for(i = 0; i < 16; i++)
CANRCVBUF = addr; //将CAN接收缓冲区中的数据取到临时缓冲区
CAN0RFLG = 0xFF; //清所有接收标志
//------判断是标准帧还是扩展帧-----------------------------------------
IDEFlag = (CANRCVBUF[1] & (1 << IDE)); //取标识符中IDE标志
if (IDEFlag == 0) //标准帧
{
RTRFlag = (CANRCVBUF[1] & (1 << RTR)); //取标识符中RTR标志
//判断是数据帧还是远程帧
FrameFlag = ((RTRFlag == 0)?DataFrm:RemoteFrm);
}
else //扩展帧
{
RTRFlag = (CANRCVBUF[3] & (1 << ERTR)); //取标识符中RTR标志
//判断是数据帧还是远程帧
FrameFlag = ((RTRFlag == 0)?DataFrm:RemoteFrm);
}
CAN0SND(0x1111,&FrameFlag,1);
return FrameFlag; //返回数据帧标志(1)或远程帧(2)标志
}
unsigned char CANRCVFRM()
{
return ssss();
}
|
|