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

📄 can.lst

📁 can sja1000 从节点 已经通过调试
💻 LST
字号:
C51 COMPILER V7.06   CAN                                                                   12/24/2007 11:05:46 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE CAN
OBJECT MODULE PLACED IN can.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE can.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          
   2          
   3          #include "can.h"
   4          //#include "reg52.h"
   5          
   6          void SJAInit(tByte Reg_acr)
   7          {
   8   1              MODE = 0x09;                            //模式寄存器,单验收滤波器,进入复位模式
   9   1              CDR  = 0x88;                            //时钟分频R,选择增强CAN模式,关闭CLKOUT输出
  10   1              IER  = 0x0d;                            //中断使能寄存器,开溢出、错误、接收中断
  11   1              
  12   1              BTR0 = 0x03;                            //总线定时寄存器
  13   1              BTR1 = 0xff;                            //总线定时寄存器二,6MHz晶振,波特率30Kbps
  14   1              
  15   1              OCR  = 0xaa;                            //输出控制寄存器
  16   1      
  17   1              ACR0 = Reg_acr;                         //验收代码ACR0
  18   1              ACR1 = 0xff;                            //验收代码ACR1,以下无关
  19   1              ACR2 = 0xff;                            //验收代码ACR2
  20   1              ACR3 = 0xff;                            //验收代码ACR3
  21   1      
  22   1              AMR0 = 0x00;                            //验收屏蔽寄存器AMR0=00H
  23   1              AMR1 = 0xff;                            //验收屏蔽寄存器AMR1,以下无关
  24   1              AMR2 = 0xff;                            //验收屏蔽寄存器AMR2
  25   1              AMR3 = 0xff;                            //验收屏蔽寄存器AMR3
  26   1                                              
  27   1              RBSA = 0x00;                            //接收缓冲器FIFO起始地址为0
  28   1              TXER = 0x00;                            //清除发送错误计数器
  29   1              ECC  = 0x00;                            //清除错误代码捕捉寄存器
  30   1              MODE = 0x08;                            //单滤波方式,返回工作方式      
  31   1                      
  32   1      }
  33          
  34          tByte SJASendData(tByte *Tdata,tByte DatLen,tByte TarID,SaID,TxRx)
  35          {
  36   1              static tByte TempData;
  37   1              static tByte TempValue;
  38   1              TempData = SR;                          //读状态寄存器
  39   1      //      P1 = SR;
  40   1              do                                                      //判断是否正在接收正在接收则等待
  41   1              {
  42   2                      TempData = SR;                  //TempValue = 1则等待
  43   2              }while(TempData & Bit(4));
  44   1      
  45   1              do                                                      //判断上次发送是否完成未完成则等待发送完成
  46   1              {                                                       //TempValue = 0则等待
  47   2                      TempData = SR; 
  48   2              }while(!(TempData & Bit(3)));
  49   1      
  50   1              do                                                      //判断发送缓冲区是否锁定锁定则等待
  51   1              {                                                       //TempValue = 0则等待
  52   2                      TempData = SR;
  53   2              }while(!(TempData & Bit(2)));
  54   1      
  55   1              FIN(0) = TxRx;
C51 COMPILER V7.06   CAN                                                                   12/24/2007 11:05:46 PAGE 2   

  56   1              ID1 = TarID;
  57   1              ID2 = SaID;
  58   1                                                                      //开始发送数据,一共8个字节,全部为有效数据
  59   1              for(TempValue = 0;TempValue<DatLen;TempValue++)
  60   1              {
  61   2                      DAT1(TempValue) = Tdata[TempValue];
  62   2              }
  63   1      
  64   1              CMR  = 0x01;                            //启动SJA1000 发送
  65   1      
  66   1              return 0;                                       
  67   1      }
  68          
  69          tByte SJARecvData(tByte *Rdata,tByte DatLen)
  70          {
  71   1      
  72   1              static tByte TempData;
  73   1              static tByte TempValue;
  74   1              TempData = SR;                          //读状态寄存器
  75   1              TempValue = (TempData & 0xc3);  
  76   1              if(!TempValue )                         //读取总线脱离、错误状态、接收溢出、有数据等位
  77   1              {
  78   2                      return 1;                               //总线接收失败推出
  79   2                      
  80   2              }
  81   1      
  82   1              if(TempData & Bit(7))
  83   1              {
  84   2                      TempData = IR;                  //IR中断寄存器,出现总线脱离,读中断寄存器,清除中断位
  85   2                      MODE    = 0x08;                 //推出复位模式,进入工作模式
  86   2      
  87   2                      return 2;                               //总线接收失败                  
  88   2              }
  89   1      
  90   1              TempData = IR;
  91   1              if(TempData & Bit(3))
  92   1              {
  93   2                      CMR = 0x0c;                             //数据溢出处理,清除数据溢出位,释放接收缓冲区
  94   2      
  95   2                      return 3;                               //总线接收失败
  96   2              }
  97   1      
  98   1              if(!(TempData & Bit(0)))
  99   1              {
 100   2                      TempValue = ALC;                //释放仲裁丢失捕捉寄存器和错误捕捉寄存器
 101   2                      TempValue = ECC;
 102   2              
 103   2                      return 4;                               //总线接受失败                          
 104   2              }
 105   1      
 106   1              //TempData = FIN;                       //远程帧处理
 107   1              if(TempData & Bit(2))
 108   1              {
 109   2                      CMR = 0x04;
 110   2                      TempValue = ALC;                //释放仲裁丢失捕捉寄存器和错误捕捉寄存器
 111   2                      TempValue = ECC;
 112   2      
 113   2                      return 5;       
 114   2              }
 115   1      
 116   1              for(TempValue = 0;TempValue<DatLen;TempValue++)
 117   1              {
C51 COMPILER V7.06   CAN                                                                   12/24/2007 11:05:46 PAGE 3   

 118   2                      Rdata[TempValue]= FIN(TempValue);
 119   2      
 120   2              }
 121   1              
 122   1              CMR = 0x04;
 123   1              TempValue = ALC;                        //释放仲裁丢失捕捉寄存器和错误捕捉寄存器
 124   1              TempValue = ECC;
 125   1      
 126   1              return 0;       
 127   1      }
 128          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    345    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      4      12
   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 + -