⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 can.lst

📁 51单片机基于CAN总线通信程序
💻 LST
字号:
C51 COMPILER V8.09   CAN                                                                   09/23/2008 08:34:16 PAGE 1   


C51 COMPILER V8.09, COMPILATION OF MODULE CAN
OBJECT MODULE PLACED IN can.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE src\can.c LARGE OPTIMIZE(7,SPEED) BROWSE DEBUG OBJECTEXTEND PRINT(.\can.lst
                    -) OBJECT(can.obj)

line level    source

   1          
   2          //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
   3          //描述: sja1000can总线处理函数
   4          //      CAN主要参数:       PeliCAN模式,扩展帧EFF模式                          &
   5          //      29位标示码结构:                                                       &
   6          //      本节点的地址: 0x11,0x22,0x33,0x00;可以接收全部节点的数据               &
   7          //      目的节点地址:0x01,0x02,0x03,0x00;可以被能接收全部节点数据的节点接收   &
   8          
   9          //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
  10          
  11          #include <reg52.h>
  12          #include <intrins.h>
  13          #include <inc/can.h>
  14          #include "inc/timer_pwm.h"
  15          #include "inc/CPUIO_DEF.H"
  16          #include "inc/EXT_PUBLIC_VARIABLE.H"
  17          #include "inc/candul.H"
  18          
  19          /**************************************************************************************
  20          ;;函数原型: void CAN_RXD( void ) interrupt 0
  21          ;;函数功能: CAN中断处理函数,包括接收中断和发送中断
  22          ;;函数输入: 无
  23          ;;函数输出: 无
  24          ;;函数返回值: 无
  25          ***************************************************************************************/
  26          void CAN_RXD( void ) interrupt 0 using 3
  27          {
  28   1          uchar data Judge,tmpbuf[5];
  29   1      
  30   1        //  EA = 0;//关CPU中断
  31   1      
  32   1          Judge = IR;
  33   1          if( Judge & 0x01)
  34   1          {//IR.0 = 1 接收中断
  35   2              tmpbuf[0] =  RBSR0;                     //标示
  36   2              tmpbuf[1] =  RBSR1;                     //id  --地址
  37   2      
  38   2              if( ((tmpbuf[0]&0xc0) == 0x80)&&(tmpbuf[1] == ADDRESS) ) 
  39   2              {  //是扩展帧和数据帧并且是本机地址
  40   3                   if( CanRx.farmeSta ==NULL )
  41   3                   {
  42   4                      CanRx.farmeSta = FULL;
  43   4                      CanRx.farmeType = RBSR3;                     //命令类型           
  44   4                      CanRx.farmeSubType = RBSR4;                  //子命令
  45   4                      CanRx.farmeLong = tmpbuf[0]&0x0f;         //数据长度
  46   4      
  47   4                      CanRx.farmeData[0]  = RBSR5;//数据
  48   4                      CanRx.farmeData[1]  = RBSR6;//数据
  49   4                      CanRx.farmeData[2]  = RBSR7;//数据
  50   4                      CanRx.farmeData[3]  = RBSR8;//数据
  51   4                      CanRx.farmeData[4]  = RBSR9;//数据
  52   4                      CanRx.farmeData[5]  = RBSR10;//数据
  53   4                      CanRx.farmeData[6]  = RBSR11;//数据
  54   4                      CanRx.farmeData[7]  = RBSR12;//数据
C51 COMPILER V8.09   CAN                                                                   09/23/2008 08:34:16 PAGE 2   

  55   4                      CanRx.farmeData[8]  = RBSR2;    //帧计数
  56   4       
  57   4                   }
  58   3              }
  59   2              CMR = 0X04;     //释放接收缓冲器      
  60   2              Judge = ECC;    //释放错误代码捕捉寄存器
  61   2          }
  62   1          else if(Judge & 0x02)
  63   1          { //IR.1 = 1 发送中断
  64   2      
  65   2          }
  66   1          else if(Judge & 0x04)
  67   1          { //IR.2 = 1 错误报警中断
  68   2          
  69   2          }
  70   1          else if(Judge & 0x08)
  71   1          {//IR.3 = 1 数据溢出中断
  72   2          CMR = 0X10;  //清楚数据溢出位
  73   2          }
  74   1          else if(Judge & 0x10)
  75   1          {//IR.4 = 1 唤醒中断
  76   2          }
  77   1          else if(Judge & 0x20)
  78   1          {//IR.5 = 1 错误消极中断
  79   2          }
  80   1          else if(Judge & 0x40)
  81   1          {//IR.6 = 1 仲裁丢失中断
  82   2             Judge = ALC;//释放仲裁随时捕捉寄存器
  83   2          }
  84   1          else
  85   1          {//IR.7 = 1 总线错误中断
  86   2          }
  87   1          IER = 0x01;// .0=1--接收中断使能;
  88   1        //  EA = 1;//打开CPU中断
  89   1      }
  90          
  91          
  92          /**************************************************************************************
  93          ;;函数原型: void Rxd_deal(void)
  94          ;;函数功能: CAN接收处理函数
  95          ;;函数输入: 无
  96          ;;函数输出: 无
  97          ;;函数返回值: 无
  98          ;;主循环调用
  99          ***************************************************************************************/
 100          
 101          void Rxd_deal(void)
 102          {//////// 接收处理程序//////////////
 103   1              uchar ucTxdBuf[8];
 104   1          if( CanRx.farmeSta == FULL )
 105   1          {      
 106   2              CanRx.farmeSta = NULL;
 107   2              if( (CanRx.farmeType == MS_REST_STOP_CAR)|| (CanRx.farmeType == MS_STOP_CAR50_SLOW)||(CanRx.farmeT
             -ype == MS_STOP_CAR100_SLOW)||
 108   2              (CanRx.farmeType == MS_REST_STOP_CAR)||(CanRx.farmeType == MS_STOP_CAR50_FAST)||(CanRx.farmeType =
             -= MS_STOP_CAR100_FAST)||
 109   2              (CanRx.farmeType == MS_ALLOW_IN_UPDATE_STA))
 110   2              {
 111   3                  //数据接收正确应答 
 112   3                  ucTxdBuf[0] = 0x00;//000000回复相应结果
 113   3                  CAN_TXD( MADDRESS,SM_RECEV_OK,UN_ACK,1,ucTxdBuf );
 114   3                  StopCar.sta = START;
C51 COMPILER V8.09   CAN                                                                   09/23/2008 08:34:16 PAGE 3   

 115   3                  StopCar.cmd = CanRx.farmeType;
 116   3              }
 117   2              else
 118   2              {
 119   3                  switch( CanRx.farmeType )
 120   3                  {
 121   4                      case MS_SYS_SEELP://系统睡眠
 122   4                      break;
 123   4                      case MS_ALLOW_IN_UPDATE_STA://允许进入升级状态
 124   4                      break;
 125   4                      case MS_UPDATA_DATAS://升级数据帧
 126   4                      break;
 127   4                      case MS_VERIFY_DATAS://校验数据
 128   4                      break;
 129   4          
 130   4                  }
 131   3              }
 132   2          }
 133   1      }//////// 接收处理程序//////////////
 134          /**************************************************************************************
 135          ;;函数原型: void CAN_init( void )
 136          ;;函数功能: CAN初始化函数can2.0b
 137          ;;函数输入: 无
 138          ;;函数输出: 无
 139          ;;函数返回值: 无
 140          ***************************************************************************************/
 141          void CAN_init( void )
 142          {//SJA1000 的初始化
 143   1          uchar bdata Judge;
 144   1      
 145   1          do
 146   1          {//  .0=1---reset MODRe,进入复位模式,以便设置相应的寄存器
 147   2              MODR   = 0x09;
 148   2                  Judge = MODR ;
 149   2          }
 150   1          while( !(Judge & 0x01) );
 151   1          CDR  = 0x88;                // CDR.3=1--时钟关闭, .7=0---basic CAN, .7=1---Peli CAN ,.2-.0 为000,2分频时钟频率为fos
             -c/2
 152   1      
 153   1      //10k   
 154   1      //  BTR0 = 0x1d;        //波特率为fosc=12m时brp.5-brp.0 = 011101,波特率为1m,tscl = 5us,tsjw=2*3=0us
 155   1      //  BTR1 = 0xdc;                  //10总线波特率设定 tseg1=1011(11),tseg2=100(4)位速率=tscl*(tseg1+tseg2+3)=5*20=100us
             -(10k)
 156   1          
 157   1          // 100K
 158   1          BTR0 = 0x05;        //波特率为fosc=12m时brp.5-brp.0 = 000101,波特率为1m,tscl = 1us,tsjw=2*3=0us
 159   1          BTR1 = 0x25;                //高速BTR1.7 =SAM=0;总线波特率设定 tseg1=0110(6),tseg2=011(3)位速率=tscl*(tseg1+tseg2+
             -3)=1*10=10us(100k)
 160   1      // 500k   
 161   1      //   BTR0 = 0x00;      //波特率为fosc=12m时brp.5-brp.0 = 000001,tscl = 1/6us,tsjw=2*3=0us
 162   1      //   BTR1 = 0x36;               //10总线波特率设定 tseg1=0101(6),tseg2=010(3)位速率=tscl*(tseg1+tseg2+1)=1*10=10us(50
             -0k)
 163   1      
 164   1          
 165   1          IER  = 0x01;                //.0=1--接收中断使能;  .1=0--关闭发送中断使能
 166   1          OCR  = 0xaa;                // 配置输出控制寄存器
 167   1          CMR  = 0x04;                //释放接收缓冲器
 168   1      
 169   1          ACR  = ADDRESS;     //本节点地址0x04
 170   1          ACR1 = 0;
 171   1          ACR2 = 0;
 172   1          ACR3 = 0;           //初始化标示码
C51 COMPILER V8.09   CAN                                                                   09/23/2008 08:34:16 PAGE 4   

 173   1      
 174   1          AMR  = 0;
 175   1          AMR1 = 0xff;
 176   1          AMR2 = 0xff;
 177   1          AMR3 = 0xff;                //初始化掩码
 178   1          do
 179   1          {//确保退出复位模式
 180   2              MODR   = 0x08;          //单滤波
 181   2              Judge  = MODR ;
 182   2           }
 183   1          while( Judge & 0x01 );
 184   1      }
 185          
 186          /**************************************************************************************
 187          ;;函数原型: void CAN_TXD( uchar ucAddress,uchar ucCmd,uchar ucSubCmd,uchar ucLong,uchar *PData )
 188          ;;函数功能: CAN发送函数
 189          ;;函数输入: ucAddress地址,,ucCmd命令,ucSubCmd子命令,ucLong长度,*PData数据指针
 190          ;;函数输出: 无
 191          ;;函数返回值: 无
 192          ***************************************************************************************/
 193          void CAN_TXD( uchar ucAddress,uchar ucCmd,uchar ucSubCmd,uchar ucLong,uchar *PData )
 194          {
 195   1          uchar data Judge;
 196   1          //初始化数据信息
 197   1          //   EA = 0; //关中断
 198   1          do
 199   1          {
 200   2              Judge = SR;
 201   2         //     LED_RED = 0;//
 202   2          }
 203   1          while( Judge & 0x10 );  //SR.4=1 正在接收,等待
 204   1                 
 205   1          do
 206   1          {
 207   2              Judge = SR;
 208   2        //      LED_RED = 0;//
 209   2          }
 210   1          while(!(Judge & 0x08)); //SR.3=0,发送请求未处理完,等待
 211   1                         
 212   1          do
 213   1          {
 214   2              Judge = SR;
 215   2          //     LED_RED = 0;//
 216   2          }
 217   1          while(!(Judge & 0x04)); //SR.2=0,发送缓冲器被锁。等待
 218   1      
 219   1          //   LED_RED = !LED_RED;
 220   1          //   LED_GRE = !LED_GRE;//灯闪烁
 221   1          TBSR0  = 0x80|(ucLong&0x0f); //.7=0扩展帧;.6=0数据帧; .3.2.1.0=数据长度8
 222   1          TBSR1  = ucAddress;         //目的节点地址
 223   1          TBSR2  = 0;                //
 224   1          TBSR3  = ucCmd;             //
 225   1          TBSR4  = ucSubCmd;          //
 226   1      
 227   1          TBSR5  = *PData++;
 228   1          TBSR6  = *PData++;
 229   1          TBSR7  = *PData++;
 230   1          TBSR8  = *PData++;
 231   1          TBSR9  = *PData++;
 232   1          TBSR10 = *PData++;
 233   1          TBSR11 = *PData++;
 234   1          TBSR12 = *PData++;
C51 COMPILER V8.09   CAN                                                                   09/23/2008 08:34:16 PAGE 5   

 235   1          
 236   1          CMR = 0x01;//置位发送请求
 237   1       //   EA  = 1;
 238   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    606    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----      15
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----       8
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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