原创 CAN Bus 调试(SJA1000+C51)

2009-10-20 19:31 3508 3 4 分类: 汽车电子

1.       必备条件<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


C51芯片一片、SJA1000一片、PCA82C250一片、晶振两个、电阻电容若干


示波器、5v电源、万用表、51烧录器、程序编译平台


2.       知识背景


单片机基础


 


3.       硬件连接


原理图


请见附件。


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />测试硬件接口:往测试寄存器中写入0x55,读出该测试寄存器的数据,如为0x55,再往测试寄存器中写入0xAA,读出该测试寄存器中的数据,如为0xAA,则硬件接口正确,否则,请检测硬件接口


测试程序:


void BCAN_TEST()


       {


       BCANADR=TEST;


       *BCANADR=0X55;


       if(*BCANADR==0X55)


              {


               P10=~P10;


              }


       else


              {


               P11=~P11;


              }


       }


 


4.       软件问题


程序分为初始化和发送接收程序,其中的初始化程序是关键,要仔细阅读SJA1000datasheet方能做到运用自如。其中的发送接收程序比较简单,理解头信息是关键,头信息包括ID和数据长度及数据帧和远程帧的选择。


已测试好的发送程序如下:


#include<reg51.h>


 


#define  BTEST 0XFE09


 


#define  CR    0xFD00


#define  CMR   0xFD01


#define  SR    0xFD02


#define  IR    0xFD03


#define  ACR   0xFD04


#define  AMR   0xFD05


#define  BTR0  0xFD06


#define  BTR1  0xFD07


#define  OCR   0xFD08


 


#define  TXB0  0xFD0A


#define  TXB1  0xFD0B


#define  TXB2  0xFD0C


#define  TXB3  0xFD0D


#define  TXB4  0xFD0E


#define  TXB5  0xFD0F


#define  TXB6  0xFD10


#define  TXB7  0xFD11


#define  TXB8  0xFD12


#define  TXB9  0xFD13


 


#define  CDR   0xFE1F


 


unsigned char xdata *BCANADR;


 


bit InRST()


       {


             EA=0;


           BCANADR=CR;


           *BCANADR=0X21;


              if(*BCANADR==0X21)


                     {


                     return 1;    //成功进入复位模式


                     }


                     else


                     {


                     return 0;


                     }


       }


 


bit OutRST()


       {


             EA=0;


           BCANADR=CR;


           *BCANADR=0X20;


              if(*BCANADR==0X20)


                     {


                     return 1;    //成功退出复位模式


                     }


                     else


                     {


                     return 0;


                     }


       }


 


void InitSJA()


       {


 


           BCANADR=BTR0;


              *BCANADR=0X00;


              BCANADR=BTR1;


              *BCANADR=0X1C;   //BPS=500k,fosc=16MHz


             


              BCANADR=CDR;


              *BCANADR=0X48;   //Basic模式,终止输入比较器,关闭时钟输出


             


              BCANADR=ACR;


              *BCANADR=0XAA;


              BCANADR=AMR;


              *BCANADR=0XFF;   //验收代码


             


              BCANADR=OCR;


              *BCANADR=0X1A;   //正常输出模式


       }


 


void SendMsg()


       {


              BCANADR=CMR;


              *BCANADR=0X04;


 


           BCANADR=TXB0;


              *BCANADR=0X40;


              BCANADR=TXB1;


              *BCANADR=0X48;  //RTR=0 发送数据帧


              BCANADR=TXB2;


              *BCANADR=0X11;


              BCANADR=TXB3;


              *BCANADR=0X22;


              BCANADR=TXB4;


              *BCANADR=0X33;


              BCANADR=TXB5;


              *BCANADR=0X44;


              BCANADR=TXB6;


              *BCANADR=0X66;


              BCANADR=TXB7;


              *BCANADR=0X77;


                                                                             


              BCANADR=CMR;


              *BCANADR=0X01;  //发送置位


       }


 


void delay()


       {


              int x;


              for(x=0;x<100;x++)


              {;}


       }


 


main()


       { 


              while(1)


                     {


                     P17=0;


                     delay();     //延时


                     P17=1;   


                     P2=0;


                     InRST();     //复位


                     InitSJA();   //初始化SJA


                     OutRST();    //退出复位


                     SendMsg();   //发送数据


                     delay();     //延时


               }


       }


 


5.       调试问题


1.    BPS不一致,出现Errorframe


2.    CBPCDR.6)位设置问题,如果该位不置位时,且硬件接口中RX1TX1均悬空的话,将出现Errorframe,解决方法有二(1 CBP置位;2 RX1端接入约2.5v电压)


 


6.       基址问题


1.    C51是通过片选方式控制SJA1000的。


2.    基址和硬件连接是相联系的,如果CS端和地连接,高8位可以是任意的,当CS端和P2口的一脚连接时,则基址是所接脚所在位为0,其余7位取1,组成其高8位。


 


 


 

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户330599 2011-4-27 11:15

怎么没有附件呢
相关推荐阅读
我要评论
1
3
关闭 站长推荐上一条 /3 下一条