打印
[CAN-bus/DeviceNet]

我的CAN应该行的,但总是不行,不知为何?麻烦各位帮我看

[复制链接]
2062|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lyons|  楼主 | 2007-4-28 06:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我是按照ZLGMCU网站上的“PHILIPS CAN控制器SJA1000的BasicCAN控制模块”资料(http://www.zlgmcu.com/download/downs.asp?ID=668,那个资料很详细)做的CAN收发器,只是去除与PC的串行通信,改用7279在数码管上显示相关信息。电路基本上按照资料上的“图6节点接口简图”。区别只是:
1、不用光偶直接将TX0和RX0连到TXD和RXD;
2、TX1悬空,RX1连至82C250的Vref,万用表测电压2.49V;
3、/RESET采用RC复位,R=10K,C=10uF,书上说RC复位R=50K,C=1uF,算算时间常数应该可以。
软件 在其基础上稍微改改,所有子程序没有改一个字符。
发送程序如下:
void       main(void)
{   
         uchar status;                   //状态字 
    Delay_50us(100) ;               //50us*100=5ms
         status=Config_SJA();      //配置sja1000
    InitCPU();                            //初始化
    if(status!=0) write7279(DECODE1,status&0x0f); //配置sja1000出现错误,显示错误代码
    else
          write7279(DECODE1,0);                                //配置sja1000正常显示0
     }

    SetSystemBuf[0]=0xaa;         //简单的发送测试,送一个字节0X55
    SetSystemBuf[1]=0x03;
    SetSystemBuf[2]=0x55;
    if(BCAN_DATA_WRITE(SetSystemBuf)) write7279(DECODE1+1,2);
        else write7279(DECODE1+1,3);         //写入缓冲区正常显示3,不正常显示2
    if(BCAN_CMD_PRG(TR_CMD)) write7279(DECODE1,2);
         else write7279(DECODE1,3);            //启动发送正常正常显示3,不正常显示2

loop:goto loop;
}
//以下的InitCPU和Config_SJA子程序和资料上一模一样,没改过。
void  InitCPU(void)
{
EA         =1;
IT0        =1;
EX0        =1;
PX0        =1; 
//InitUart();        //初始化串口 
}                                             
////
uchar  Config_SJA(void)

  uchar  data   status=0;
  Delay_50us(100) ;
  TimeOut_Start(20);
  BandRateBuf = ByteRate_1000k;
  BCAN_ENTER_RETMODEL();
  if(BCAN_CREATE_COMMUNATION())//
    {
    status = CAN_INTERFACE_ERR;
    return(status);
  }
  if(BCAN_SET_BANDRATE(BandRateBuf))//初始化系统默认值波特率100kbps
   {
    status = CAN_INITBTR_ERR ;
    return(status);
  }
  if(BCAN_SET_OBJECT(0xaa,0x00))
  {
    status =CAN_INITOBJECT_ERR;
    return(status);
  }
  
  if(BCAN_SET_OUTCLK(0xaa,0x48))
  {
    status =CAN_INITOUTCTL_ERR;
    return(status);
  }
  if(BCAN_QUIT_RETMODEL())
  {
    status = CAN_QUITRESET_ERR;
    return(status);
  }
  
  SJA_BCANAdr=REG_CONTROL;
  *SJA_BCANAdr=0X1E;
  
  return  status; 
}

接收程序:
void  ex0_Val(void)  interrupt   0   using  1

  SJA_BCANAdr=REG_INTERRUPT;
  CanBusFlag=*SJA_BCANAdr;                        //保存sja1000中断标志
////////////////////////////////////////////////////////////////
//接收测试:若有帧收到产生中断,在数码管上显示8,没有帧收到初始化正常显示0,初始化不正常显示错误代码。我的机器上一直显示0
    write7279(DECODE1,8);
loop1:goto loop1;       
//////////////////////////////////////////////////////
}


void       main(void)
{   
         uchar status;             //状态字 
    Delay_50us(100) ;               //50us*100=5ms
         status=Config_SJA();          //配置sja1000
    InitCPU();             //初始化
    if(status!=0) write7279(DECODE1,status&0x0f);//Error_disp(status);                                    //配置sja1000出现错误
    else
    {       write7279(DECODE1,0);             //初始化正常显示0
     }

    while(1)
    {if(_testbit_(CanRcv_Good))  CanRcv_Prg();//是接收中断标志
    if(_testbit_(CanSend_Good)) CanSend_Prg();//是发送中断标志
        if(_testbit_(CanErrFlag))   CanErr_Prg();//是错误中断标志
    if(_testbit_(CanDtOverFlag))CanDtOver_Prg();//是超载中断标志
        if(_testbit_(CanWuiFlag))   CanWui_Prg();//是唤醒中断标志
     }
}
InitCPU和Config_SJA子程序和资料上一模一样,没改过。
我的接收节点一直显示0,表示没有进入/INT0,没有收到帧,不知为何?麻烦各位指点迷津。

相关帖子

沙发
桂电飞天鼠| | 2007-4-28 12:31 | 只看该作者

RT

我当初刚开始的时候也遇到过这个问题,后来检查发现原因有:

1,波特率没设好;(你用的晶振跟所用驱动的是一致的了吗?)


2,帧结构没正确赋值(就是说ID,长度等位置没有对上);

你试试看?

使用特权

评论回复
板凳
lyons|  楼主 | 2007-4-29 21:46 | 只看该作者

我没有修改原来的配置文件,这些设置应该都正确吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

65

帖子

0

粉丝