canjishou.lst

来自「这是我前一段开发CAN总线通讯时编写的CAN测试程序」· LST 代码 · 共 372 行 · 第 1/2 页

LST
372
字号
 169   1          *SJA_CS_Point =(*SJA_CS_Point|Value);
 170   1               _nop_();
 171   1               _nop_();
 172   1           if(*SJA_CS_Point ==(*SJA_CS_Point|Value))
 173   1          {
 174   2             return   0;
C51 COMPILER V7.06   CANJISHOU                                                             01/25/2008 11:18:21 PAGE 4   

 175   2          }
 176   1          else
 177   1          {
 178   2             return   1;
 179   2          }
 180   1         
 181   1       }
 182            /*------------------------------------------------------------------------------------------------------
             ---
 183          ** 函数原型:       WriteSJAReg(unsigned char RegAdr,unsigned char  Value)
 184          ** 功能描述:    该函数用于将指定的数值写入sja1000的指定的寄存器
 185          ** 参数说明:    RegAdr          要读的sja1000的内部寄存器地址 
 186          **                              Value           写入寄存器的值                                             
 187          ** 返回值:      1                       写入正确
 188          **                              0                       写入不正确
 189          适合于向内部寄存器中某存储单元写数据。写入的是一个字节
 190          /*------------------------------------------------------------------------------------------------------*/
 191           bit WriteSJARegByte(unsigned char RegAdr,unsigned char Value)
 192          {
 193   1          
 194   1          SJA_CS_Point  = CAN_SJA_BaseAdr+RegAdr;                   //
 195   1          *SJA_CS_Point =Value;
 196   1               _nop_();
 197   1               _nop_();
 198   1           if(*SJA_CS_Point ==Value)
 199   1          {
 200   2             return   0;
 201   2          }
 202   1          else
 203   1          {
 204   2             return   1;
 205   2          }
 206   1         
 207   1       }
 208          
 209             /*串口发送子程序
 210          void Comout(unsigned char OutData)
 211           {  
 212             EA=0;
 213             SBUF = OutData; //输出字符
 214             while(!TI); //空语句判断字符是否发完
 215             TI = 0; //清TI
 216             EA=1;
 217            }  */
 218          
 219              /*----------------------------------------------------------------------------------------------------
             ----- 
 220          ** 函数原型:    void    SJA1000_Config_Normal(void)                                                
 221          ** 功能描述:    对SJA1000的正常模式的初始化配置                                               
 222          ** 参数说明:    无                                                                               
 223          ** 返回值:      无                                                                                 
 224          /*------------------------------------------------------------------------------------------------------*/
             - 
 225          void SJA1000_Config_Normal(void)                                                                                                        //正常模式的初始化
 226            { bit SJAReg_bz=1;
 227   1              BTR0=0x01;
 228   1          BTR1=0x1c;                                                          //设置为250kb波特率通信
 229   1                                                                                                                                                      
 230   1              while(SJAReg_bz)
 231   1                   {SJAReg_bz=WriteSJARegByte(REG_CAN_TEST,0xaa);}                   //测试接口
 232   1                       //SJA_CS_Point  = CAN_SJA_BaseAdr+REG_CAN_TEST;      
 233   1                       //Comout(*SJA_CS_Point);
C51 COMPILER V7.06   CANJISHOU                                                             01/25/2008 11:18:21 PAGE 5   

 234   1              SJAReg_bz=1;
 235   1              while(SJAReg_bz)
 236   1                   {SJAReg_bz=WriteSJARegByte(REG_CAN_TEST,0x55);} 
 237   1                       //SJA_CS_Point  = CAN_SJA_BaseAdr+REG_CAN_TEST;      
 238   1                       //Comout(*SJA_CS_Point);
 239   1          SJAReg_bz=1;
 240   1              while(SJAReg_bz)
 241   1                   {SJAReg_bz=SJAEntryResetMode();}                                //进入复位模式
 242   1                       //SJA_CS_Point  = CAN_SJA_BaseAdr+REG_CAN_MOD;      
 243   1                       //Comout(*SJA_CS_Point);                                                     
 244   1              WriteSJARegByte(REG_CAN_CDR,0xc8);                                                              //配置时钟分频寄存器,选择PeliCAN模式   
 245   1              SJAReg_bz=1;
 246   1              while(SJAReg_bz)
 247   1                   {SJAReg_bz=WriteSJAReg(REG_CAN_MOD,0x01);}                                         //配置模式寄存器,选择双滤波、正常模式 
 248   1              WriteSJARegBlock(16,Send_CAN_Filter,8);                                                         //配置验收代码/屏蔽寄存器                        
 249   1              SJAReg_bz=1;
 250   1              while(SJAReg_bz)
 251   1                   {SJAReg_bz=WriteSJARegByte(REG_CAN_BTR0,BTR0);}                                    //配置总线定时器0 
 252   1                       //SJA_CS_Point  = CAN_SJA_BaseAdr+REG_CAN_BTR0;      
 253   1                      // Comout(*SJA_CS_Point);                          
 254   1              SJAReg_bz=1;
 255   1              while(SJAReg_bz)
 256   1                   {SJAReg_bz=WriteSJARegByte(REG_CAN_BTR1,BTR1);}                                    //配置总线定时器1 
 257   1                       //SJA_CS_Point  = CAN_SJA_BaseAdr+REG_CAN_BTR1;      
 258   1                      // Comout(*SJA_CS_Point);                           
 259   1              WriteSJARegByte(REG_CAN_OCR,0x1a);                                                                              //配置输出管脚 
 260   1                   //SJA_CS_Point  = CAN_SJA_BaseAdr+REG_CAN_OCR;      
 261   1                      // Comout(*SJA_CS_Point);       
 262   1              SJA_CS_Point  = CAN_SJA_BaseAdr+REG_CAN_TXERR;     //清发送错误计数寄存器.
 263   1              *SJA_CS_Point = 0;
 264   1              SJA_CS_Point  = CAN_SJA_BaseAdr+REG_CAN_ECC;       // 错误代码捕捉寄存器
 265   1              TIME_counter  =  *SJA_CS_Point;
 266   1              TIME_counter=0;                                   //清除错误代码捕捉寄存器   
 267   1              SJAReg_bz=1;
 268   1              while(SJAReg_bz)
 269   1                   {SJAReg_bz=SJAQuitResetMode();}                                                       //退出复位模式,进入工作模式
 270   1                   //SJA_CS_Point  = CAN_SJA_BaseAdr+REG_CAN_MOD;      
 271   1                       // Comout(*SJA_CS_Point);                                     
 272   1        }
 273          /*------------------------------------------------------------------------------------------------------*/
 274          
 275          /*------------------------------------------------------------------------------------------------------*/
 276          
 277          
 278          main()
 279           {      
 280   1              
 281   1              //CKCON=0x04;
 282   1              IP=1;
 283   1              IPH=1;
 284   1              TMOD=0x21;        //   定时器T0为方式1,T1为方式2
 285   1              TH0=0x00;
 286   1              TL0=0x00;         //定时器0设置,暂时先开开,可能用不上
 287   1              TR0=1;
 288   1              ET0=1;
 289   1              TH1=0x00;
 290   1              TL1=0x00;         //定时器1设置,暂时先开开,可能用不上
 291   1              TR1=1;
 292   1              ET1=1;
 293   1              RCLK=1;
 294   1              TCLK=1;        //定时器2用作波特率发生器   T2CON中的值
 295   1              RCAP2H=0xff;
C51 COMPILER V7.06   CANJISHOU                                                             01/25/2008 11:18:21 PAGE 6   

 296   1              //RCAP2L=0xB8;   //初步设定波特率为9600
 297   1              RCAP2L=0xDC;   //初步设定波特率为19200
 298   1               //RCAP2L=0xEE;           //jiabei
 299   1      
 300   1              SCON=0x50;     //串口方式为模式1,无校验,定时器2产生波特率 
 301   1              TR2=1;        //开定时器2
 302   1              //ET2=1;                  //使能定时器2
 303   1              IT0=1;       //         负边缘触发
 304   1              //EX0=1;         //外部中断使能 
 305   1              ES=1;          //使能串口  
 306   1         //   EA=1; 
 307   1              CS_SJA1000=0;//开片选信号
 308   1               _nop_();
 309   1               _nop_();
 310   1               _nop_();
 311   1               _nop_();
 312   1               _nop_();
 313   1               _nop_();       
 314   1      //      SJA_CS_Point=CAN_SJA_BaseAdr;                                                                           //确定基址指针的值
 315   1              SJA1000_HardwareRst();
 316   1              SJA1000_Config_Normal();                                                                                        //调用SJA1000初始化配置函数
 317   1          //WriteSJAReg(REG_CAN_IER,RIE_BIT);                                                 //使能SJA1000jieshou中断
 318   1              EX0=1;                                                                                                                          //打开INT0中断
 319   1              EA=1;
 320   1       
 321   1        while (1)
 322   1         { 
 323   2         
 324   2                                                                                                                                      //使能MCU总中断 
 325   2              /*if( CAN_INT_bz==1)
 326   2               { 
 327   2                  unsigned   char   j;
 328   2                      //EA=0; 
 329   2                  CAN_INT_bz=0;
 330   2                      LED0=!LED0;
 331   2                  for(j=0;j<13;j++)
 332   2                     { 
 333   2                      Comout(Rev_CAN_data[j]);
 334   2                              Rev_CAN_data[j]=0;
 335   2                          }
 336   2                 //EA=1;
 337   2                 }*/
 338   2                if(counter>=1)
 339   2                  {
 340   3                      counter=0;
 341   3                      Rev_COM_data[7]++;
 342   3                 SJA_CS_Point  = CAN_SJA_BaseAdr+REG_CAN_SR;
 343   3                 if((*SJA_CS_Point&0x04) == TBS_BIT)  
 344   3                        {  unsigned   char   j;
 345   4                                for(j=0;j<13;j++)                             //开始将接收到的TempData个字节的数据存到CPU的数

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?