打印
[ZLG-MCU]

CAN总线不能进入接收中断

[复制链接]
2833|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
林必忠|  楼主 | 2008-1-17 17:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个是发送的程序:
/************************************************************************
 *   广州周立功单片机发展有限公司    http://www.zlgmcu.com                 *
 ************************************************************************/
/************************************************************************
 *                                                                      *
 *  SJA1000 BasicCAN模式的通讯测试                                        *
 *                                                                      *
 ************************************************************************/
/************************************************************************
 *                                                                      *
 *  目的:      建立直观的BasicCAN测试平台                                   *                                    
 *  文件名:         main.c                                              *
 *                                                                      *
 *  模块名:         sjanetdemo                                             *
 *                                                                      *
 *  目标系统:   任何基于任何兼容8051指令的微处理器同SJA1000组成的CAN系统*
 *                                                                      *
 *  应用语言:   Keil C51                                                *
 *                                                                      *
 ************************************************************************
 *  版本 :V1.0                                                          *
 *                                                                      *
 ************************************************************************
 *  广州周立功单片机发展有限公司 保留所有的版权                         *
 ************************************************************************/

#include <REG51.H>   
#include <intrins.h>     
#include  "time_module.C"                        
#include  "sja_bcanFunc.C"
//#include    "sja_peliConf.h"
#include  "seriele.c"
//#include  "keyled.c"
//数据类型定义
#define   uchar  unsigned char                
#define   ulong  unsigned long
#define   uint   unsigned int  


//设置系统数据缓冲区
static    uchar  data       SetSystemBuf[10];   //系统设置数据缓冲区     

static    uchar  data       BandRateBuf;        //设置总线波特率值缓冲区  

static    uchar  idata      EditMsSendCount;    //编辑自动发送的频率
static    uchar  idata      EditMsSendSave;        //保存自动发送的频率

static    uchar  idata      SendDataCount;        //发送数据显示

//键盘操作函数
extern void          Write_Xdata(uint Xadr,uchar Info);    // 将info送入外部地址xadr中
extern uchar      Read_Xdata(uint Xadr);                //从外部地址xadr中读取数据
extern void         Key_Scan(void);                        //键盘扫描程序
extern uchar      Key_Get(void);                        //取键盘值
extern void       PushKey(uchar keynum);                //将键值送入按键处理队列
extern uchar      PopKey(void);                            //

void      Key_handle(void);                        //处理键值

void      FundationKey(void);                   //功能键
void      MoveKey(void);                        //移位键
void      SearchKey(void);                      //检索键
void      EnterKey(void);                       //确认键
void      IncKey(void);                         //增加键
void      QuitKey(void);                        //退出键
void      CanSendKey(void);                        //发送键

void      EnterNext(void);                      //按确认键后进入下一小项处理
//led  送显
#define      LED_SelBit()      disp_pt++;if(disp_pt>4)disp_pt=0//位选           
extern    void      Show_LED(void);                        //显示处理
extern    void      Write_DispBuf(uchar buf0,uchar buf1,uchar buf2,uchar buf3,uchar buf4);//写入显示缓冲区
extern    uchar     GetLedData(void);                     //将显示的值换算
extern    void      Error_disp(uchar ErrByte);            //将错误字送显

void      InitCPU(void);                        //初始化函数
// 配置sja1000
uchar  Config_SJA(void);                        //配置sja1000
void   CanRcv_Prg(void);                        //can总线数据接收后处理
void   CanSend_Prg(void);                         //can发送数据
void   CanErr_Prg(void);                        //发现错误后处理
void   CanDtOver_Prg(void);                     //超载处理
void   CanWui_Prg(void);                        //唤醒中断处理

void   UartRcv_Prg(void);                        //串口接收到数据处理

void   DrecDisplay(uchar *databuf);             //直通显示处理函数
void   TestDispPrg(void);                       //测试处理函数
void   ClearDispPrg(uchar *databuf);            //消隐处理函数
void   FlightDispPrg(uchar *databuf);             //闪烁处理函数    
void   LiftCrcDispPrg(uchar *databuf);          //左循环显示处理
void   RightCrcDispPrg(uchar *databuf);         //右循环显示处理

void   AutoSendDataToCanBus(void);                //自动发送

// 外部中断0
static   uchar  bdata    CanBusFlag=0;          //can标志
sbit     CanRcv_Good=CanBusFlag^0;                 //成功接收标志
sbit     CanSend_Good=CanBusFlag^1;                //成功发送标志
sbit     CanErrFlag=CanBusFlag^2;                //can总线错误标志
sbit     CanDtOverFlag=CanBusFlag^3;            //can总线超载标志
sbit     CanWuiFlag=CanBusFlag^4;                  //can总线唤醒中断

/*-------------------------------------------------------------------------------------------
 外部中断0处理程序                     
 -------------------------------------------------------------------------------------------*/ 
void  ex0_Val(void)  interrupt   0   using  1

  SJA_BCANAdr=REG_INTERRUPT;
  CanBusFlag=*SJA_BCANAdr;                        //保存sja1000中断标志
  P1=CanBusFlag;
}
void      Error_disp(uchar ErrByte)
{
 uchar    temp=ErrByte;
 P1=ErrByte;
}
/*-------------------------------------------------------------------------------------------
 main程序               
 -------------------------------------------------------------------------------------------*/ 
void       main(void)
{   
    uchar status;                                //状态字 
    Delay_50us(100) ;                           //50us*100=5ms
    status=Config_SJA();                        //配置sja1000
    InitCPU();  
                                   //初始化
    if(status!=0) 
    {
    // status=0X01;
   // Error_disp(status);           //配置sja1000出现错误
     Exe_Scon(0xa1,0,0);
    Delay_50us(100) ;  
    }
    else
    { 
    // status=0X03;
    // Error_disp(status);
     // Disp_Can();                               //无措显示CAN1
      Exe_Scon(0xaa,0,0);
    Delay_50us(100) ;  
    }                                                //设置并行方式
    TimeOut_Start(20);                            //20*50us=1ms,定时周期1ms
    P1=0X00;
    while(1)
    {
        if(_testbit_(T0IR))                        //1ms时间到
        {
         
          AutoSendDataToCanBus();
          TimeOut_Start(20);                    //20*50us=1ms,定时周期1ms
        }
    //    CanBusFlag=Read_Xdata(REG_INTERRUPT);
          if(_testbit_(CanRcv_Good))  
        {
         CanRcv_Prg();    //是接收中断标志
    //    Error_disp(0x01);
      }
      else if(_testbit_(CanSend_Good)) 
       {
       CanSend_Prg();    //是发送中断标志
      //  Error_disp(0x03);
      }
       else if(_testbit_(CanErrFlag)) 
        { 
        CanErr_Prg();    //是错误中断标志
    //    Error_disp(0x07);
      }
     else  if(_testbit_(CanDtOverFlag))
      {
       CanDtOver_Prg();//是超载中断标志
    //    Error_disp(0x0f);
     }
     else if(_testbit_(CanWuiFlag))  
      {
      CanWui_Prg();    //是唤醒中断标志
     // Error_disp(0x1f);
   }    
   else if(_testbit_(UartRcvGood)) 
     { 
    UartRcv_Prg();    //串口接收成功标志
    }
    /*else
    {
     Error_disp(0x3f);
     }*/
    }

}


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   CanRcv_Prg(void)
{
  
}

void   CanSend_Prg(void)                         //can发送数据
{
    // Error_disp(0x03);
}
void   CanErr_Prg(void)                         //发现错误后处理
{
 // Error_disp(CAN_BUS_ERR); 
  Config_SJA();                                    //
}
void   CanDtOver_Prg(void)                      //超载处理
{
//  BCAN_CMD_PRG(COS_CMD);
}
void   CanWui_Prg(void)                         //唤醒中断处理
{
  
}

void   UartRcv_Prg(void)                        //串口接收到数据处理
{
    BCAN_DATA_WRITE(RcvBuf);                    //将编辑的数据发送到can总线
    BCAN_CMD_PRG(TR_CMD);
}

//自动发送
void   AutoSendDataToCanBus(void)
{
   uchar i;
      SetSystemBuf[0]=0x08;
        SetSystemBuf[1]=0x08;
        for(i=2;i<10;i++)
              SetSystemBuf=0x08;
        BCAN_DATA_WRITE(SetSystemBuf);                //将编辑的数据发送到can总线
        BCAN_CMD_PRG(TR_CMD); 
}
这个是接收的程序:
/************************************************************************
 *   广州周立功单片机发展有限公司    http://www.zlgmcu.com                 *
 ************************************************************************/
/************************************************************************
 *                                                                      *
 *  SJA1000 BasicCAN模式的通讯测试                                        *
 *                                                                      *
 ************************************************************************/
/************************************************************************
 *                                                                      *
 *  目的:      建立直观的BasicCAN测试平台                                   *                                    
 *  文件名:         main.c                                              *
 *                                                                      *
 *  模块名:         sjanetdemo                                             *
 *                                                                      *
 *  目标系统:   任何基于任何兼容8051指令的微处理器同SJA1000组成的CAN系统*
 *                                                                      *
 *  应用语言:   Keil C51                                                *
 *                                                                      *
 ************************************************************************
 *  版本 :V1.0                                                          *
 *                                                                      *
 ************************************************************************
 *  广州周立功单片机发展有限公司 保留所有的版权                         *
 ************************************************************************/

#include <REG51.H>   
#include <intrins.h>     
#include  "time_module.C"                        
#include  "sja_bcanFunc.C"
//#include    "sja_peliConf.h"
#include  "seriele.c"
//#include  "keyled.c"
//数据类型定义
#define   uchar  unsigned char                
#define   ulong  unsigned long
#define   uint   unsigned int  


//设置系统数据缓冲区
static    uchar  data       SetSystemBuf[10];   //系统设置数据缓冲区     

static    uchar  data       BandRateBuf;        //设置总线波特率值缓冲区  

static    uchar  idata      EditMsSendCount;    //编辑自动发送的频率
static    uchar  idata      EditMsSendSave;        //保存自动发送的频率

static    uchar  idata      SendDataCount;        //发送数据显示

//键盘操作函数
extern void          Write_Xdata(uint Xadr,uchar Info);    // 将info送入外部地址xadr中
extern uchar      Read_Xdata(uint Xadr);                //从外部地址xadr中读取数据
extern void         Key_Scan(void);                        //键盘扫描程序
extern uchar      Key_Get(void);                        //取键盘值
extern void       PushKey(uchar keynum);                //将键值送入按键处理队列
extern uchar      PopKey(void);                            //

void      Key_handle(void);                        //处理键值

void      FundationKey(void);                   //功能键
void      MoveKey(void);                        //移位键
void      SearchKey(void);                      //检索键
void      EnterKey(void);                       //确认键
void      IncKey(void);                         //增加键
void      QuitKey(void);                        //退出键
void      CanSendKey(void);                        //发送键

void      EnterNext(void);                      //按确认键后进入下一小项处理
//led  送显
#define      LED_SelBit()      disp_pt++;if(disp_pt>4)disp_pt=0//位选           
extern    void      Show_LED(void);                        //显示处理
extern    void      Write_DispBuf(uchar buf0,uchar buf1,uchar buf2,uchar buf3,uchar buf4);//写入显示缓冲区
extern    uchar     GetLedData(void);                     //将显示的值换算
extern    void      Error_disp(uchar ErrByte);            //将错误字送显

void      InitCPU(void);                        //初始化函数
// 配置sja1000
uchar  Config_SJA(void);                        //配置sja1000
void   CanRcv_Prg(void);                        //can总线数据接收后处理
void   CanSend_Prg(void);                         //can发送数据
void   CanErr_Prg(void);                        //发现错误后处理
void   CanDtOver_Prg(void);                     //超载处理
void   CanWui_Prg(void);                        //唤醒中断处理

void   UartRcv_Prg(void);                        //串口接收到数据处理

void   DrecDisplay(uchar *databuf);             //直通显示处理函数
void   TestDispPrg(void);                       //测试处理函数
void   ClearDispPrg(uchar *databuf);            //消隐处理函数
void   FlightDispPrg(uchar *databuf);             //闪烁处理函数    
void   LiftCrcDispPrg(uchar *databuf);          //左循环显示处理
void   RightCrcDispPrg(uchar *databuf);         //右循环显示处理

void   AutoSendDataToCanBus(void);                //自动发送

// 外部中断0
static   uchar  bdata    CanBusFlag=0;          //can标志
sbit     CanRcv_Good=CanBusFlag^0;                 //成功接收标志
sbit     CanSend_Good=CanBusFlag^1;                //成功发送标志
sbit     CanErrFlag=CanBusFlag^2;                //can总线错误标志
sbit     CanDtOverFlag=CanBusFlag^3;            //can总线超载标志
sbit     CanWuiFlag=CanBusFlag^4;                  //can总线唤醒中断

/*-------------------------------------------------------------------------------------------
 外部中断0处理程序                     
 -------------------------------------------------------------------------------------------*/ 
void  ex0_Val(void)  interrupt   0   using  1

  SJA_BCANAdr=REG_INTERRUPT;
  CanBusFlag=*SJA_BCANAdr;                        //保存sja1000中断标志
  P1=CanBusFlag;
}
void      Error_disp(uchar ErrByte)
{
 uchar    temp=ErrByte;
 P1=ErrByte;
}
/*-------------------------------------------------------------------------------------------
 main程序               
 -------------------------------------------------------------------------------------------*/ 
void       main(void)
{   
    uchar status;                                //状态字 
    Delay_50us(100) ;                           //50us*100=5ms
    status=Config_SJA();                        //配置sja1000
    InitCPU();                              //初始化
    if(status!=0) 
    {
    // status=0X01;
   // Error_disp(status);           //配置sja1000出现错误
     Exe_Scon(0xa1,0,0);
    Delay_50us(100) ;  
    }
    else
    { 
    // status=0X03;
    // Error_disp(status);
     // Disp_Can();                               //无措显示CAN1
      Exe_Scon(0xaa,0,0);
    Delay_50us(100) ;  
    }                                            //设置并行方式
    TimeOut_Start(20);                            //20*50us=1ms,定时周期1ms
    P1=0X00;
    while(1)
    {
        if(_testbit_(CanRcv_Good))  
        {
         CanRcv_Prg();    //是接收中断标志
    //    Error_disp(0x01);
      }
      else if(_testbit_(CanSend_Good)) 
       {
       CanSend_Prg();    //是发送中断标志
    //    Error_disp(0x03);
      }
       else if(_testbit_(CanErrFlag)) 
        { 
        CanErr_Prg();    //是错误中断标志
    //    Error_disp(0x07);
      }
     else  if(_testbit_(CanDtOverFlag))
      {
       CanDtOver_Prg();//是超载中断标志
    //    Error_disp(0x0f);
     }
     else if(_testbit_(CanWuiFlag))  
      {
      CanWui_Prg();    //是唤醒中断标志
    //  Error_disp(0x1f);
   }    
   else if(_testbit_(UartRcvGood)) 
     { 
    UartRcv_Prg();    //串口接收成功标志
    }
   /* else
    {
     Error_disp(0x3f);
     }*/
   }
}
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   CanRcv_Prg(void)
{
  
}

void   CanSend_Prg(void)                         //can发送数据
{
    // Error_disp(0x03);
}
void   CanErr_Prg(void)                         //发现错误后处理
{
 // Error_disp(CAN_BUS_ERR); 
  Config_SJA();                                    //
}
void   CanDtOver_Prg(void)                      //超载处理
{
//  BCAN_CMD_PRG(COS_CMD);
}
void   CanWui_Prg(void)                         //唤醒中断处理
{
  
}

void   UartRcv_Prg(void)                        //串口接收到数据处理
{
    BCAN_DATA_WRITE(RcvBuf);                    //将编辑的数据发送到can总线
    BCAN_CMD_PRG(TR_CMD);
}

//自动发送
/*void   AutoSendDataToCanBus(void)
{
   uchar i;
      SetSystemBuf[0]=0x08;
        SetSystemBuf[1]=0x08;
        for(i=2;i<10;i++)
              SetSystemBuf=0x08;
        BCAN_DATA_WRITE(SetSystemBuf);                //将编辑的数据发送到can总线
        BCAN_CMD_PRG(TR_CMD); 
 /* uchar i;
 if((DispBuf[1]==0x05)&&(DispBuf[2]==0x0d))
 {
    
    if(EditMsSendCount ==0){
        EditMsSendCount    = EditMsSendSave;
        SendDataCount++;
        SetSystemBuf[0]++;
        SetSystemBuf[1]=0x08;
        for(i=2;i<10;i++)
              SetSystemBuf=SendDataCount;
        BCAN_DATA_WRITE(SetSystemBuf);                //将编辑的数据发送到can总线
        BCAN_CMD_PRG(TR_CMD); 
        DispBuf[3]=SendDataCount>>4;
        DispBuf[4]=SendDataCount&0x0f;
    }
    else{
     EditMsSendCount--;
    }
 }*/
我是按照ZLG的PHILIPS CAN控制器SJA1000的BasicCAN控制模块改的。大家可知道什么问题?
沙发
林必忠|  楼主 | 2008-1-17 18:32 | 只看该作者

CAN总线不能进入接收中断

我的硬件电路没有问题,
接收的程序为;
/************************************************************************
 *   广州周立功单片机发展有限公司    http://www.zlgmcu.com                 *
 ************************************************************************/
/************************************************************************
 *                                                                      *
 *  SJA1000 BasicCAN模式的通讯测试                                        *
 *                                                                      *
 ************************************************************************/
/************************************************************************
 *                                                                      *
 *  目的:      建立直观的BasicCAN测试平台                                   *                                    
 *  文件名:         main.c                                              *
 *                                                                      *
 *  模块名:         sjanetdemo                                             *
 *                                                                      *
 *  目标系统:   任何基于任何兼容8051指令的微处理器同SJA1000组成的CAN系统*
 *                                                                      *
 *  应用语言:   Keil C51                                                *
 *                                                                      *
 ************************************************************************
 *  版本 :V1.0                                                          *
 *                                                                      *
 ************************************************************************
 *  广州周立功单片机发展有限公司 保留所有的版权                         *
 ************************************************************************/

#include <REG51.H>   
#include <intrins.h>     
#include  "time_module.C"                        
#include  "sja_bcanFunc.C"
//#include    "sja_peliConf.h"
#include  "seriele.c"
//#include  "keyled.c"
//数据类型定义
#define   uchar  unsigned char                
#define   ulong  unsigned long
#define   uint   unsigned int  


//设置系统数据缓冲区
static    uchar  data       SetSystemBuf[10];   //系统设置数据缓冲区     

static    uchar  data       BandRateBuf;        //设置总线波特率值缓冲区  

static    uchar  idata      EditMsSendCount;    //编辑自动发送的频率
static    uchar  idata      EditMsSendSave;        //保存自动发送的频率

static    uchar  idata      SendDataCount;        //发送数据显示

//键盘操作函数
extern void          Write_Xdata(uint Xadr,uchar Info);    // 将info送入外部地址xadr中
extern uchar      Read_Xdata(uint Xadr);                //从外部地址xadr中读取数据
extern void         Key_Scan(void);                        //键盘扫描程序
extern uchar      Key_Get(void);                        //取键盘值
extern void       PushKey(uchar keynum);                //将键值送入按键处理队列
extern uchar      PopKey(void);                            //

void      Key_handle(void);                        //处理键值

void      FundationKey(void);                   //功能键
void      MoveKey(void);                        //移位键
void      SearchKey(void);                      //检索键
void      EnterKey(void);                       //确认键
void      IncKey(void);                         //增加键
void      QuitKey(void);                        //退出键
void      CanSendKey(void);                        //发送键

void      EnterNext(void);                      //按确认键后进入下一小项处理
//led  送显
#define      LED_SelBit()      disp_pt++;if(disp_pt>4)disp_pt=0//位选           
extern    void      Show_LED(void);                        //显示处理
extern    void      Write_DispBuf(uchar buf0,uchar buf1,uchar buf2,uchar buf3,uchar buf4);//写入显示缓冲区
extern    uchar     GetLedData(void);                     //将显示的值换算
extern    void      Error_disp(uchar ErrByte);            //将错误字送显

void      InitCPU(void);                        //初始化函数
// 配置sja1000
uchar  Config_SJA(void);                        //配置sja1000
void   CanRcv_Prg(void);                        //can总线数据接收后处理
void   CanSend_Prg(void);                         //can发送数据
void   CanErr_Prg(void);                        //发现错误后处理
void   CanDtOver_Prg(void);                     //超载处理
void   CanWui_Prg(void);                        //唤醒中断处理

void   UartRcv_Prg(void);                        //串口接收到数据处理

void   DrecDisplay(uchar *databuf);             //直通显示处理函数
void   TestDispPrg(void);                       //测试处理函数
void   ClearDispPrg(uchar *databuf);            //消隐处理函数
void   FlightDispPrg(uchar *databuf);             //闪烁处理函数    
void   LiftCrcDispPrg(uchar *databuf);          //左循环显示处理
void   RightCrcDispPrg(uchar *databuf);         //右循环显示处理

void   AutoSendDataToCanBus(void);                //自动发送

// 外部中断0
static   uchar  bdata    CanBusFlag=0;          //can标志
sbit     CanRcv_Good=CanBusFlag^0;                 //成功接收标志
sbit     CanSend_Good=CanBusFlag^1;                //成功发送标志
sbit     CanErrFlag=CanBusFlag^2;                //can总线错误标志
sbit     CanDtOverFlag=CanBusFlag^3;            //can总线超载标志
sbit     CanWuiFlag=CanBusFlag^4;                  //can总线唤醒中断

/*-------------------------------------------------------------------------------------------
 外部中断0处理程序                     
 -------------------------------------------------------------------------------------------*/ 
void  ex0_Val(void)  interrupt   0   using  1

  SJA_BCANAdr=REG_INTERRUPT;
  CanBusFlag=*SJA_BCANAdr;                        //保存sja1000中断标志
  P1=CanBusFlag;
}
void      Error_disp(uchar ErrByte)
{
 uchar    temp=ErrByte;
 P1=ErrByte;
}
/*-------------------------------------------------------------------------------------------
 main程序               
 -------------------------------------------------------------------------------------------*/ 
void       main(void)
{   
    uchar status;                                //状态字 
    Delay_50us(100) ;                           //50us*100=5ms
    status=Config_SJA();                        //配置sja1000
    InitCPU();                              //初始化
    if(status!=0) 
    {
    // status=0X01;
   // Error_disp(status);           //配置sja1000出现错误
     Exe_Scon(0xa1,0,0);
    Delay_50us(100) ;  
    }
    else
    { 
    // status=0X03;
    // Error_disp(status);
     // Disp_Can();                               //无措显示CAN1
      Exe_Scon(0xaa,0,0);
    Delay_50us(100) ;  
    }                                            //设置并行方式
    TimeOut_Start(20);                            //20*50us=1ms,定时周期1ms
    P1=0X00;
    while(1)
    {
        if(_testbit_(CanRcv_Good))  
        {
         CanRcv_Prg();    //是接收中断标志
    //    Error_disp(0x01);
      }
      else if(_testbit_(CanSend_Good)) 
       {
       CanSend_Prg();    //是发送中断标志
    //    Error_disp(0x03);
      }
       else if(_testbit_(CanErrFlag)) 
        { 
        CanErr_Prg();    //是错误中断标志
    //    Error_disp(0x07);
      }
     else  if(_testbit_(CanDtOverFlag))
      {
       CanDtOver_Prg();//是超载中断标志
    //    Error_disp(0x0f);
     }
     else if(_testbit_(CanWuiFlag))  
      {
      CanWui_Prg();    //是唤醒中断标志
    //  Error_disp(0x1f);
   }    
   else if(_testbit_(UartRcvGood)) 
     { 
    UartRcv_Prg();    //串口接收成功标志
    }
   /* else
    {
     Error_disp(0x3f);
     }*/
   }
}
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   CanRcv_Prg(void)
{
  
}

void   CanSend_Prg(void)                         //can发送数据
{
    // Error_disp(0x03);
}
void   CanErr_Prg(void)                         //发现错误后处理
{
 // Error_disp(CAN_BUS_ERR); 
  Config_SJA();                                    //
}
void   CanDtOver_Prg(void)                      //超载处理
{
//  BCAN_CMD_PRG(COS_CMD);
}
void   CanWui_Prg(void)                         //唤醒中断处理
{
  
}

void   UartRcv_Prg(void)                        //串口接收到数据处理
{
    BCAN_DATA_WRITE(RcvBuf);                    //将编辑的数据发送到can总线
    BCAN_CMD_PRG(TR_CMD);
}

//自动发送
/*void   AutoSendDataToCanBus(void)
{
   uchar i;
      SetSystemBuf[0]=0x08;
        SetSystemBuf[1]=0x08;
        for(i=2;i<10;i++)
              SetSystemBuf=0x08;
        BCAN_DATA_WRITE(SetSystemBuf);                //将编辑的数据发送到can总线
        BCAN_CMD_PRG(TR_CMD); 
 /* uchar i;
 if((DispBuf[1]==0x05)&&(DispBuf[2]==0x0d))
 {
    
    if(EditMsSendCount ==0){
        EditMsSendCount    = EditMsSendSave;
        SendDataCount++;
        SetSystemBuf[0]++;
        SetSystemBuf[1]=0x08;
        for(i=2;i<10;i++)
              SetSystemBuf=SendDataCount;
        BCAN_DATA_WRITE(SetSystemBuf);                //将编辑的数据发送到can总线
        BCAN_CMD_PRG(TR_CMD); 
        DispBuf[3]=SendDataCount>>4;
        DispBuf[4]=SendDataCount&0x0f;
    }
    else{
     EditMsSendCount--;
    }
 }*/
就是在发送的程序中将发送数据部分去掉,大家说这样有没有什么问题啊?

使用特权

评论回复
板凳
林必忠|  楼主 | 2008-1-17 18:38 | 只看该作者

CAN总线不能进入接收中断

我用的CAN芯片是SJA1000,BASICCAN模式

使用特权

评论回复
地板
ijk| | 2008-1-18 14:48 | 只看该作者

打电话更快

使用特权

评论回复
5
zlg315| | 2008-1-18 17:26 | 只看该作者

开发CAN-bus,最好有一个CAN-bus分析仪。

    什么问题都迎刃而解,否则就象在“黑暗中摸索前行”,那样会很孤独、很痛苦!即使对了也不知道对在哪里?错了也不知道错在哪里?
    这么长的程序,说句实在话,我都没有心情看下去,不是不愿意服务,看别人的程序实在是痛苦。

使用特权

评论回复
6
zlgarm| | 2008-1-18 18:31 | 只看该作者

林先生,我们专们负责CAN的工程师这几天出差了

明天应该回来,我们会尽快处理您的问题.
(zls)

使用特权

评论回复
7
林必忠|  楼主 | 2008-1-18 21:41 | 只看该作者

CAN总线不能进入接收中断

问题已经解决了,谢谢!!!

使用特权

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

本版积分规则

19

主题

32

帖子

0

粉丝