打印
[CAN-bus/DeviceNet]

请教SJA1000不能发送的问题!急!

[复制链接]
3800|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jackliu999|  楼主 | 2007-9-11 20:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
调试CAN通讯 SJA1000+PCA82C250
SJA1000工作在BasicCAN模式下,可进入软件复位,读写寄存器正常,退出复位后,循环发送一帧数据,TX0没有输出信号(正常输出模式下),查询寄存器的值,发现中断寄存器IR出现0xF0值。电路按照器件文档设计,检查没有问题。
软件如下:

#include <absacc.h>
#include <reg51.h>

#define  CAN_CR   XBYTE[0x4000]
#define  CAN_CMR  XBYTE[0X4001]
#define  CAN_SR   XBYTE[0X4002]

#define  CAN_ACR  XBYTE[0X4004]
#define  CAN_AMR  XBYTE[0X4005]
#define  CAN_BTR0  XBYTE[0X4006]
#define  CAN_BTR1  XBYTE[0X4007]
#define  CAN_OCR  XBYTE[0X4008]

#define  CAN_TEST  XBYTE[0X4009]
#define  CAN_ID1  XBYTE[0X400A]
#define  CAN_ID2  XBYTE[0X400B]
#define  CAN_SENDBYTE1  XBYTE[0X400C]
#define  CAN_SENDBYTE2  XBYTE[0X400D]
#define  CAN_SENDBYTE3  XBYTE[0X400E]
#define  CAN_SENDBYTE4  XBYTE[0X400F]
#define  CAN_SENDBYTE5  XBYTE[0X4010]
#define  CAN_SENDBYTE6  XBYTE[0X4011]
#define  CAN_SENDBYTE7  XBYTE[0X4012]
#define  CAN_SENDBYTE8  XBYTE[0X4013]

#define  CAN_CDR  XBYTE[0X401F]


        sbit  WATCHDOG  = P1 ^ 0;

unsigned char temp,i;

void delay()
{
     unsigned char x1,x2;
     for (x1=0;x1<0xff;x1++)
     {
        for(x2=0;x2<0x5f;x2++);
     }
}
/////////////////////////////////////////////
void CAN_INIT(void)                 
{  
   delay();           

   CAN_CR |= 0X01;              //enter reset mode
   temp=CAN_CR;
   delay();
   if((temp&0x01)==0x01)
   {
                           
     CAN_CDR = 0X40;                     // basic can 模式,CBP置位,外部时钟输出,2分频

    CAN_ACR = 0X40;           //验收代码寄存器 0100 0000
       CAN_AMR = 0X00;           //验收屏蔽寄存器 0000 0000

       CAN_BTR0= 0X00;           //tscl=2 x tclk,tsjw= tscl
       CAN_BTR1= 0X18;           //sam=0 单次采样,tTseg1=9 x tscl,tTseg2=2 x tscl
                                  //12MHz /2 /12 = 500KHz 波特率
       CAN_OCR = 0XFF;           //上拉状态,时钟输出模式
   }
   
   CAN_CR &= 0XFE;               //quit reset mode 
   delay();
}
//////////////////////////////////////

void InitCpu(void)
{
       
       IE = 0;           /*中断允许寄存器*/
       IP = 0;           /*中断优先次序寄存器*/
       TCON = 0;         /*计时控制寄存器*/
       TMOD = 0x11;      /*定时器工作模式控制寄存器  计时器1和计时器0分为两个独立的8位计时器TH0 TL0*/           
   //    TH0 = TH20ms;
   //    TL0 = TL20ms;
  
       P1 = 0xff;
       //INT0 = 1;    
       //INT1 = 1;   
}

///////////////////////////////////////////////////////
void SetCpu(void)
{
    ET0 = 1;       /*  允许计时器0中断  IE.1*/
    ET1 = 1;       /*  允许计时器1中断  IE.3*/
    TR0 = 1;       /*   定时器0启动控制位  TCON.4*/
    TR1 = 1;       /*   定时器1启动控制位  TCON.6*/
      //  EX0 = 1;       /*  允许外部INT0中断 IE.0 */
      //  IT0 = 1;       /*  下降沿产生外部中断 TCON.0*/
       // EX1 = 1;       /*  允许外部INT1中断  IE.2*/   
       // IT1 = 1;       /*  下降沿产生外部中断 TCON.2*/             
        
        IP = 0x02;     /*  INT0 HIGH LEVEL */
    EA = 0; 
}
///////////////////////////////////////////////////////////

main()
{
     InitCpu();
     CAN_INIT();
     SetCpu();
     
     for(;;)
     {
     
        delay();                      //延时
  
      CAN_ID1 = 0X40;
         CAN_ID2 = 0X28;
         CAN_SENDBYTE1=0X01;
         CAN_SENDBYTE2=0X02;
         CAN_SENDBYTE3=0X03;
         CAN_SENDBYTE4=0X04;
         CAN_SENDBYTE5=0X05;
         CAN_SENDBYTE6=0X06;
         CAN_SENDBYTE7=0X07;
         CAN_SENDBYTE8=0X08;
         
         CAN_CMR |= 0X01;          
         
         delay();
         
     }
}

相关帖子

沙发
wxj1952| | 2007-9-13 08:25 | 只看该作者

有意思!

竟然没看出错。除了主程序不用循环发送,因为CAN是自动重发的。
按理论,独立节点的发送,可以永远重发。

不过这与程序错误没什么关系。改正了,也没查出哪的问题。

使用特权

评论回复
板凳
wxj1952| | 2007-9-14 10:33 | 只看该作者

原来问题在这!

OCR寄存器设错了。如果标准接法,TX0的OCTP0、OCTN0、OCPOL0只能设为110。

使用特权

评论回复
地板
hbcjzcg| | 2007-9-14 14:22 | 只看该作者

原来问题在这

OCR寄存器设错了。如果标准接法,TX0的OCTP0、OCTN0、OCPOL0只能设为110。

使用特权

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

本版积分规则

7

主题

136

帖子

1

粉丝