查看: 1672|回复: 1

[其他] 请教:飞思卡尔16位单片机,CAN口接收故障。

[复制链接]

该用户从未签到

10

主题

15

帖子

0

注册会员

Rank: 2

积分
73
最后登录
1970-1-1
发表于 2014-10-23 09:30:18 | 显示全部楼层 |阅读模式
用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();
}


我知道答案 目前已有1人回答
回复

使用道具 举报

该用户从未签到

124

主题

3600

帖子

0

金牌会员

Rank: 6Rank: 6

积分
5781
最后登录
1970-1-1
发表于 2014-10-23 09:49:45 | 显示全部楼层
你好,楼主!
鉴于你的问题的特点,建议你创建SR以获得技术支持。
创建SR的流程,请参考此贴内容,此贴链接如下所示。
https://www.nxpic.org.cn/module/forum/thread-578569-1-1.html
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-9-11 22:57 , Processed in 0.092052 second(s), 22 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表