打印
[CAN-bus/DeviceNet]

[求助]sja自收发的问题

[复制链接]
2190|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
unfreebird|  楼主 | 2008-5-18 00:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟在用S51+sja1000+82c250做单节点自收发的程序时总是不成功,有几个问题想问问各位大哥
无论是任何时候,初始化刚完还是发送之后,我的SR状态寄存器读出来总是等于C,请问是怎么回事?它应该是变化的才对呀。
(初始化的过程中,是可以读出各寄存器的值是写进去了的。应该是说明地址是对的吧?)
若是自发送成功,SR.0(接收缓冲状态)是不是也会变成1的?
下面是我的初始化,因为sr总是C,所以main就不发出来了,无法正确判断sr 向各位大大求解,谢谢。
void CanIni() {
P20=0; /*片选信号,选择SJA1000芯片*/ 
delay(2); /*延时*/
CANMOD=0x1; /*进入复位模式,对SJA000进行初始化,接收中断和复位请求p107*/ 
CANCDR=0x88; /*选择模式,关闭时钟输出,p137*/ 
CANIER=0x00; 
CANAMR=0xff; 
CANACR=0xff; 
CANBTR0=0x03; /*BTR0,总线定时寄存器0*/ 
CANBTR1=0x1c; /*BTR1,总线定时寄存器1*/ 
CANOCR=0x1a; /*OCR,输出控制寄存器*/ 
RBSA = 0x00; 
ACR0 = 0xff;
ACR1 = 0xff; 
ACR2 = 0xff; 
ACR3 = 0xff; 
AMR0 = 0xff;
AMR1 = 0xff;
AMR2 = 0xff;
AMR3 = 0xff;
CANMOD=0x0C; /*返回工作状态*/ }

相关帖子

沙发
桂电飞天鼠| | 2008-5-18 01:16 | 只看该作者

你这些SJA1000的寄存器是如何定义地址的?

使用特权

评论回复
板凳
unfreebird|  楼主 | 2008-5-18 03:06 | 只看该作者

请看看

啊啊,飞天鼠大哥你出现了
我也是桂电的,请问如何可以联系到你
我寄存器定义是
#define CANMOD XBYTE[0xFE00]/* 方式寄存器*/
#define CANCMR XBYTE[0xFE01]/* 命令寄存器*/
#define CANSR XBYTE[0xFE02]/* 状态寄存器*/
#define CANIER XBYTE[0xFE03]/* 中断允许寄存器*/
#define CANACR XBYTE[0xFE04]/* 接受代码寄存器*/
#define CANAMR XBYTE[0xFE05]/* 接受屏蔽寄存器*/
#define CANBTR0 XBYTE[0xFE06]/* BTR0,总线定时寄存器0*/
#define CANBTR1 XBYTE[0xFE07]/* BTR1,总线定时寄存器1*/
#define CANOCR XBYTE[0xFE08]/* OCR,输出控制寄存器*/
#define CANCDR XBYTE[0xFE1F]/* 时钟分频*/
#define ACR0     XBYTE[0xFE10]  //验收代码0
#define ACR1     XBYTE[0xFE11]  //验收代码1
#define ACR2     XBYTE[0xFE12]  //验收代码2
#define ACR3     XBYTE[0xFE13]  //验收代码3
#define AMR0     XBYTE[0xFE14]  //验收屏蔽0
#define AMR1     XBYTE[0xFE15]  //验收屏蔽1
#define AMR2     XBYTE[0xFE16]  //验收屏蔽2
#define AMR3     XBYTE[0xFE17]  //验收屏蔽3
#define RBSA        XBYTE[0xFE1e]  //RX缓冲器起始地址寄存器 RBSA
#define CANSEN0 XBYTE[0xFE10]/* 发送寄存器*/
#define CANSEN1 XBYTE[0xFE11]/* 发送寄存器*/
#define CANSEN2 XBYTE[0xFE12]/* 发送寄存器*/
#define CANSEN3 XBYTE[0xFE13]/* 发送寄存器*/
#define CANSEN4 XBYTE[0xFE14]/* 发送寄存器*/
#define CANSEN5 XBYTE[0xFE15]/* 发送寄存器*/
#define CANSEN6 XBYTE[0xFE16]/* 发送寄存器*/
#define CANSEN7 XBYTE[0xFE17]/* 发送寄存器*/

#define CANREC0 XBYTE[0xFE10]/* 接受寄存器0*/
#define CANREC1 XBYTE[0xFE11]/* 接受寄存器1*/
#define CANREC2 XBYTE[0xFE12]/* 接受寄存器2*/
#define CANREC3 XBYTE[0xFE13]/* 接受寄存器3*/
#define CANREC4 XBYTE[0xFE14]/* 接受寄存器4*/
#define CANREC5 XBYTE[0xFE15]/* 接受寄存器5*/
#define CANREC6 XBYTE[0xFE16]/* 接受寄存器6*/
#define CANREC7 XBYTE[0xFE17]/* 接受寄存器7*/

sbit P20=P2^0; /*SJA1000片选信号*/
sbit RST=P2^7;

使用特权

评论回复
地板
unfreebird|  楼主 | 2008-5-18 03:18 | 只看该作者

有新变化

看了看线路,发现复位的线断路了,重新焊了下
现在初始化以后SR变成3C了,这个正常么?
用cmr=10自发送后,SR变成了21,这算正常的么?为什么它还在算正在发送呢?

使用特权

评论回复
5
xuxiaozhao| | 2008-5-19 23:23 | 只看该作者

sja自收发的问题

#include "CANBUS.H"

//-------------------------------------define  variable------------------------------------
unsigned char receive_counter = 0;
unsigned char alc = 1;
unsigned char ecc = 1;

/************************************************************************
*函数原型:  bit   CAN_CREATE_COMMUNATION(void)
*参数说明:  无
*返回值:                                                                *
*             0 ; 表示SJA1000接口正常
*             1 ; 表示SJA1000与处理器接口不正常
*
*说明:该函数用于检测CAN控制器的接口是否正常
************************************************************************/
bit   CAN_CREATE_COMMUNATION(void)
{
    unsigned char temp_data;
    bit Flag;
    REG_TEST = 0xAA;         //写入测试值
    temp_data = REG_TEST;
    if(temp_data == 0xaa)
    {
       Flag=0;                   //读测试正确
    }
    else
    {
       Flag=1;
    }
    if(!Flag)
    {
       REG_TEST = 0x55;      //写入测试值
       temp_data = REG_TEST;
       if(temp_data == 0x55)
       {
           Flag=0;          //读测试正确
           REG_TEST = 0x00;
       }
       else
       {
           Flag=1;
       }
    }
    return (Flag);
}
/************************************************************************
*函数原型:      bit   CAN_ENTRY_RETMODEL(void)                         *
*参数说明:  无                                                         *
*返回值:                                                               *
*           0 ; 表示成功进入复位工作模式                               *
*           1 ; 表示不能进入复位工作模式                               *
*                                                                      * 
*说明:      CAN控制器进入复位工作模式                                  *
************************************************************************/ 
bit   CAN_ENTRY_RETMODEL(void)
{
     bit flag;
     unsigned char ErrorCount=20;
     unsigned char temp_data = REG_MODE;
     while(ErrorCount --)
     {
          REG_MODE = temp_data|RM_MODE;
          temp_data =  REG_MODE;              
          if( (temp_data & RM_MODE) != 0)
          {
           flag=0;                               
           break;
       }
       else
       {
           flag=1;                             
       }
      }
      return(flag);
}

/************************************************************************
*函数原型:      bit    CAN_QUIT_RETMODEL(void)    
*参数说明:  无                    
*返回值:                    
*           0 ; 表示成功退出复位工作模式    
*           1 ; 表示不能退出复位工作模式                                                                            
*说明:      CAN控制器退出复位工作模式     
***********************************************************************/ 
bit CAN_QUIT_RETMODEL(void)
{
     bit flag;
     unsigned char ErrorCount=20;
     unsigned char temp_data = REG_MODE;
     while(ErrorCount --)
     {
          REG_MODE = temp_data&0xfe;
          temp_data = REG_MODE;              
          if((temp_data&0x01) == 0)
          {
          flag=0;                               
          break;
      }
      else
      {
          flag=1;                             
      }
     }
     return(flag);
}

/*********************************************************************************
**函数原型:  char SJASetBandRateStandard(unsigned char     BandRateSize)
**参数说明:  BandRateSize           标准常用波特率(Kbps)          
**              0             5
**              1             10
**              2             20
**              3             40
**              4             50
**              5             80
**              6             100
**              7             125
**              8             200
**              9             250
**              10              400
**              11              500
**              12              666
**              13              800
**              14              1000           
**返回值:         
**           0                ; 设置总线定时器成功
**           SJA_SETBTR_ERR       ; 设置总线定时器错
**           SJA_NOBTRSIZE        ;波特率不能设为此值
**
**说明:     该函数用于设定在系统晶体为16MHZ时,常用的标准波特率的值。
**          参数BandRateSize只能为0~14,其它的值会返回SJA_NOBTRSIZE错误
**          本函数只能用于复位模式
***************************************************************************************/
unsigned  char  code     SJA_BTR_CODETAB[]={
     0xbf,0xff,                     //;5KBPS的预设值
     0x67,0x2f,                     //;10KBPS的预设值
     0x53,0x2F,                     //;20KBPS的预设值
     0x87,0xFF,                     //;40KBPS的预设值
     0x47,0x2F,                     //;50KBPS的预设值
     0x83,0xFF,                     //;80KBPS的预设值
     0x43,0x2f,                     //;100KBPS的预设值
     0x03,0x1c,                     //;125KBPS的预设值
     0x81,0xfa,                     //;200KBPS的预设值
     0x01,0x1c,                     //;250KBPS的预设值
     0x80,0xfa,                     //;400KBPS的预设值
     0x00,0x1c,                     //;500KBPS的预设值
     0x80,0xb6,                     //;666KBPS的预设值
     0x00,0x16,                     //;800KBPS的预设值
     0x00,0x14                    //;1000KBPS的预设值
};
bit CAN_SET_BANDRATE(unsigned char CAN_ByteRate)
{
    bit ErrorFlag =1;
    unsigned char temp_data;         
    unsigned char ErrorCount = 0x20;              //32次报错
    if(CAN_ByteRate>14)
    {
        ErrorFlag =1;
    }
    else{
        while(--ErrorCount)
        {
             REG_BTR0 = SJA_BTR_CODETAB[CAN_ByteRate*2];
             REG_BTR1 = SJA_BTR_CODETAB[CAN_ByteRate*2+1];
             temp_data = REG_BTR0;
             if(temp_data != SJA_BTR_CODETAB[CAN_ByteRate*2])
             {
                  continue;
             }
             temp_data = REG_BTR1;
             if(temp_data != SJA_BTR_CODETAB[CAN_ByteRate*2+1])
             {
              continue;
             }
             ErrorFlag=0;
             break;
         }//while结束
         
     }
     return  ErrorFlag ;
}

/*************************************************************************
*函数原型:    CAN_SET_OBJECT             
*参数说明:                     
*    CAN_ACR0-3:存放验收代码寄存器(ACR)的参数设置
*    CAN_AMR0-3:存放接收屏蔽寄存器(AMR)的参数设置
*返回值:                    
*           0 ;通信对象设置成功        
*           1 ;通信对象设置失败        
*说明:设置CAN节点的通讯对象,允许接收的报文ID号
*     允许接收的报文,是由AMR和ACR共同决定的.
*    满足以下条件的ID号的报文才可以被接收     
*[(ID.29-ID.0)≡(AC.29-AC.0)]||(AM.29-AM.0)≡11111111     
*    该子程序只能用于复位模式                                                                                                                     *             
*************************************************************************/
bit CAN_SET_OBJECT(unsigned char  CAN_ACR0,unsigned char  CAN_ACR1,
                   unsigned char  CAN_ACR2,unsigned char  CAN_ACR3,
                   unsigned char  CAN_AMR0,unsigned char  CAN_AMR1,
                   unsigned char  CAN_AMR2,unsigned char  CAN_AMR3)
{
     bit ErrorFlag =1;
     unsigned char temp_data;         
     unsigned char ErrorCount = 0x20;              //32次报错
     while(ErrorCount--)
     {
          REG_ACR0 = CAN_ACR0;
          REG_ACR1 = CAN_ACR1;
          REG_ACR2 = CAN_ACR2;
          REG_ACR3 = CAN_ACR3;
          REG_AMR0 = CAN_AMR0;
          REG_AMR1 = CAN_AMR1;
          REG_AMR2 = CAN_AMR2;
          REG_AMR3 = CAN_AMR3;

          temp_data = REG_ACR0; 
          if(temp_data!= CAN_ACR0)       //校验写入值
          {
               continue;
          }
          temp_data = REG_ACR1;
          if(temp_data!= CAN_ACR1)       //校验写入值
          {
           continue;
          }
          temp_data = REG_ACR2;
          if(temp_data != CAN_ACR2)       //校验写入值
          {
           continue;
          }
          temp_data = REG_ACR3;
          if(temp_data != CAN_ACR3)       //校验写入值
          {
          continue;
          }
          temp_data = REG_AMR0;
          if(temp_data != CAN_AMR0)       //校验写入值
          {
            continue;
          }
          temp_data = REG_AMR1;
          if(temp_data != CAN_AMR1)       //校验写入值
          {
        continue;
          }
          temp_data = REG_AMR2;
          if(temp_data != CAN_AMR2)       //校验写入值
          {
        continue;
          }
          temp_data = REG_AMR3;
          if(temp_data != CAN_AMR3)       //校验写入值
          {
                continue;
          }
          ErrorFlag =0;
          break;
     }
     return ErrorFlag;
}

使用特权

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

本版积分规则

2

主题

6

帖子

0

粉丝