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

📄 can.lst

📁 CAN通讯底层节点
💻 LST
字号:
C51 COMPILER V7.50   CAN                                                                   04/23/2009 16:56:46 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE CAN
OBJECT MODULE PLACED IN can.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE can.c OPTIMIZE(0,SPEED) BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*------------------------------------------------------------------------------
   2          ;CAN总线大坝监测系统
   3          ;底层节点
   4          ;文件名称: can.c
   5          ;函数功能:CAN总线通信
   6          ;MCU支持:  C8051F040
   7          ;上海富方软件合肥自动化分公司
   8          ;-----------------------------------------------------------------------------*/
   9          
  10          #include "c8051F040.h"
  11          #include "can.h"
  12          #include "canreg.h"
  13          
  14          #define CAN_ID 2
  15          
  16          
  17          
  18          ////////////////////////////////////////////////////////////////////////////////
  19          // 清零所有消息对象
  20          ////////////////////////////////////////////////////////////////////////////////
  21          void Clr_All_Msg_Obj (void){    
  22   1              unsigned char i;
  23   1              SFRPAGE = CAN0_PAGE;
  24   1      
  25   1              CAN0ADR = IF1CMDMSK;       
  26   1              CAN0DATL = 0xF3;      
  27   1              // 写消息对象,Mask,Arb,Control改变
  28   1          CAN0ADR = IF1MSK1;     
  29   1          CAN0DAT = 0xFFFF;
  30   1          CAN0DAT = 0x7FFF;
  31   1              // Xtd不用,Dir滤波,所有ID或IDE位滤波
  32   1              CAN0DAT = 0x0000;
  33   1              CAN0DAT = 0x0000;     
  34   1          // 消息对象不可用,默认ID为0
  35   1              for (i = 1;i < 33;i++)
  36   1            {
  37   2                      CAN0ADR = IF1CMDRQST;     
  38   2                      CAN0DATL = i;
  39   2                      // 应用到32个消息对象
  40   2            }   
  41   1      }
  42          
  43          
  44          
  45          ////////////////////////////////////////////////////////////////////////////////
  46          // 消息对象发送配置
  47          ////////////////////////////////////////////////////////////////////////////////
  48          void Init_Msg_Obj_TX (unsigned char msg_num,unsigned int id){
  49   1              unsigned int temp_id;
  50   1              SFRPAGE = CAN0_PAGE;
  51   1      
  52   1              CAN0ADR = IF1CMDMSK;
  53   1              CAN0DAT = 0x00b3; 
  54   1              // WR/RD=1,Mask=0,Arb=1,Control=1,ClrIntPnd=0,TxRqst=0,DataA=1,DataB=1
  55   1              CAN0ADR = IF1ARB1;            
C51 COMPILER V7.50   CAN                                                                   04/23/2009 16:56:46 PAGE 2   

  56   1              CAN0DAT = 0x0000;  
  57   1              // ID15-0=0
  58   1              temp_id = id<<2;     
  59   1              // 标准id为ID28-ID18,则左移2位
  60   1              temp_id &=0x1ffc;
  61   1              temp_id |=0xa000;
  62   1              // IF1ARB2=101(id)00b,MsgVal=1,Xtd=0,标准模式,Dir=1,发送
  63   1              CAN0DAT = temp_id; 
  64   1              // 地址自增指向IF1ARB2
  65   1              CAN0DAT = 0x1088;
  66   1              // IF1MSGC=0x1088,NewDat=0,MsgLst=0,IntPnd=0,UMask=1,TxIE=0,RxIE=0,
  67   1              // RmtEn=0,TxRqst=0,EoB=1,DLC3-0=1000
  68   1              // 滤波使能,发送后IntPnd不变,远程禁止,长度为8的单块
  69   1              CAN0ADR = IF1CMDRQST;         
  70   1              CAN0DAT = msg_num;   
  71   1              // 应用到msg_num号消息
  72   1      }
  73          
  74          
  75          
  76          ////////////////////////////////////////////////////////////////////////////////
  77          // 消息对象接收配置
  78          ////////////////////////////////////////////////////////////////////////////////
  79          void Init_Msg_Obj_RX (unsigned char msg_num,unsigned int id){
  80   1              unsigned int temp_id;
  81   1              SFRPAGE = CAN0_PAGE;
  82   1      
  83   1              CAN0ADR = IF2CMDMSK; 
  84   1              CAN0DAT = 0x00bb;             
  85   1              // WR/RD=1,Mask=0,Arb=1,Control=1,ClrIntPnd=1,TxRqst=0,DataA=1,DataB=1
  86   1              CAN0ADR = IF2ARB1;           
  87   1              CAN0DAT = 0x0000; 
  88   1              temp_id = id<<2;
  89   1              temp_id &= 0x1ffc;
  90   1              temp_id |=0x8000;
  91   1              CAN0DAT = temp_id; 
  92   1              // IF1ARB2=100(id)00b,MsgVal=1,Xtd=0,标准模式,Dir=0,接收
  93   1              CAN0DAT = 0x1488;
  94   1              // NewDat=0,MsgLst=0,IntPnd=0,UMask=1,TxIE=0,RxIE=1,RmtEn=0,TxRqst=0
  95   1          // EoB=1,DLC3-0=1000,不是中断源,接收后IntPnd置1
  96   1              CAN0ADR = IF2CMDRQST;        
  97   1              CAN0DATL = msg_num;           
  98   1      }
  99          
 100          
 101          
 102          ////////////////////////////////////////////////////////////////////////////////
 103          // CAN发送数据动作
 104          ////////////////////////////////////////////////////////////////////////////////
 105          void Can_Trans_Data (unsigned char msg_num){    
 106   1          unsigned char num;
 107   1              SFRPAGE = CAN0_PAGE;
 108   1              
 109   1              CAN0ADR = IF1CMDMSK;          
 110   1              CAN0DAT = 0x0087;             
 111   1              // WR/RD=1,Mask=0,Arb=0,Control=0,ClrIntPnd=0,TxRqst=1,DataA=1,DataB=1
 112   1              CAN0ADR = IF1DATA1;           
 113   1              // 将8字节数据写入IF1DATA1
 114   1              for(num = 0;num < 8;num++){
 115   2                      CAN0DATH = Can_sdata[num+1];
 116   2                      CAN0DATL = Can_sdata[num];
 117   2                      num++;
C51 COMPILER V7.50   CAN                                                                   04/23/2009 16:56:46 PAGE 3   

 118   2              }
 119   1      
 120   1          CAN0ADR = IF1CMDRQST;         
 121   1              CAN0DATL = msg_num;
 122   1              // 指向消息号 
 123   1      }
 124          
 125          
 126          
 127          ////////////////////////////////////////////////////////////////////////////////
 128          // CAN接收数据动作
 129          ////////////////////////////////////////////////////////////////////////////////
 130          void Can_Rec_Data (unsigned char msg_num){
 131   1          unsigned char num;
 132   1              SFRPAGE = CAN0_PAGE;
 133   1      
 134   1              CAN0ADR = IF2CMDMSK;            
 135   1              CAN0DAT = 0x007f;          
 136   1              // WR/RD=0,Mask=1,Arb=1,Control=1,ClrIntPnd=1,NewDat=1,DataA=1,DataB=1
 137   1              CAN0ADR = IF2CMDRQST;           
 138   1              CAN0DATL = msg_num;
 139   1              // 指向消息号              
 140   1              CAN0ADR = IF2DATA1;  
 141   1      
 142   1              for(num=0;num<8;num++){
 143   2                  Can_rdata[num+1] = CAN0DATH;
 144   2                      Can_rdata[num] = CAN0DATL;
 145   2                      num++;
 146   2              }
 147   1      
 148   1      }
 149          
 150          
 151          
 152          ////////////////////////////////////////////////////////////////////////////////
 153          // 主节点消息对象分别初始化,设置波特率,开启中断,并且启动CAN
 154          ////////////////////////////////////////////////////////////////////////////////
 155          void Can_Msg_Init (void){
 156   1              SFRPAGE = CAN0_PAGE;
 157   1      
 158   1              CAN0CN = 0X01;
 159   1              // 初始化配置时将CAN挂起
 160   1              Clr_All_Msg_Obj();
 161   1      
 162   1              Init_Msg_Obj_RX(CAN_ID,CAN_ID);
 163   1              Init_Msg_Obj_RX(31,31);
 164   1              // 接收ID号
 165   1          Init_Msg_Obj_TX(32,32);
 166   1              // 发送ID号
 167   1      
 168   1              EIE2 |= 0x20;
 169   1              // 开启CAN中断
 170   1              SFRPAGE = CAN0_PAGE;
 171   1      
 172   1              CAN0CN |= 0X40;
 173   1              // CAN波特率配置可访问,
 174   1              CAN0ADR = BITREG;
 175   1              CAN0DAT = 0x7FFF;
 176   1      
 177   1              CAN0CN = 0x02;  
 178   1              // 自动重发开启,状态中断禁止,IE=1,CAN模块中断开启,Init清零.结束初始化操作,CAN控制器进入正常工作
 179   1      }
C51 COMPILER V7.50   CAN                                                                   04/23/2009 16:56:46 PAGE 4   

 180          
 181          
 182          
 183          ////////////////////////////////////////////////////////////////////////////////
 184          // CAN向上层回传数据
 185          ////////////////////////////////////////////////////////////////////////////////
 186          void Can_Tx_Back(unsigned char Info_Data[6]){
 187   1              unsigned char i;
 188   1      
 189   1              Can_sdata[0] = Can_rdata[1];
 190   1                      Can_sdata[1] = Can_rdata[2];
 191   1      
 192   1              for(i=0; i<6 ;i++){
 193   2                              Can_sdata[i+2] = Info_Data[i];
 194   2                      }
 195   1      
 196   1                      Can_Trans_Data(0x20);
 197   1      }
 198          
 199          
 200          
 201          ////////////////////////////////////////////////////////////////////////////////
 202          // CAN中断
 203          ////////////////////////////////////////////////////////////////////////////////
 204          void CAN_ISR (void) interrupt 19 {
 205   1              SFRPAGE_SAVE = SFRPAGE;  
 206   1              SFRPAGE = CAN0_PAGE;
 207   1      
 208   1              /* 成功接收报文 */
 209   1              if ( CAN0STA & 0x10 ){
 210   2                      CAN0STA &= 0xef;
 211   2                 
 212   2                      CAN0ADR = INTPEND2;
 213   2                      /* 广播 */
 214   2                      if( CAN0DAT & 0x4000 )
 215   2                              Can_Rec_Data(31);
 216   2                      /* 非广播 */
 217   2                  else
 218   2                              Can_Rec_Data(CAN_ID);
 219   2      
 220   2                      Rec_From_CAN = 1;
 221   2                  // 标志成功收到下层信息
 222   2              } 
 223   1      
 224   1              SFRPAGE = SFRPAGE_SAVE;
 225   1      }
 226                          


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