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

📄 can.lst

📁 英飞凌的CAN驱动。英飞凌的CAN非常复杂
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.09   CAN                                                                   05/15/2008 08:28:24 PAGE 1   


C51 COMPILER V7.09, COMPILATION OF MODULE CAN
OBJECT MODULE PLACED IN D:\英飞凌\CAN\CAN.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE D:\英飞凌\CAN\CAN.C DB SB OE

line level    source

   1          #include<XC886CLM.H>
   2          #include<stdio.h>
   3          #include "can.h"
   4          //uchar tmp;
   5          //#define _can_0_
   6          typedef struct can_struct
   7          {
   8          uchar leibie;//侦的类别 0标准 1扩展
   9          ulong signal;
  10          unsigned char length;
  11          unsigned char data0[8];
  12          } can_data;
  13          can_data a,b;
  14          
  15          
  16          
  17          void can_write(uword addr,ulong value)
  18          {
  19   1      CAN_ADL=(addr>>2)&0xff;
  20   1      CAN_ADH=(addr>>10)&0x0f;
  21   1      CAN_DATA0=value&0xff;
  22   1      CAN_DATA1=(value>>8)&0xff;
  23   1      CAN_DATA2=(value>>16)&0xff;
  24   1      CAN_DATA3=(value>>24)&0xff;
  25   1      CAN_ADCON=0xf1;
  26   1      while(BSY==1);
  27   1      //BSY=0;
  28   1      }
  29          //reg 0 2 4 8  选择写那个寄存器
  30          void can_write_0(uword addr,uchar value,uchar reg)
  31          {
  32   1        uchar i=1;
  33   1        CAN_ADL=(addr>>2)&0xff;
  34   1      CAN_ADH=(addr>>10)&0x0f;
  35   1       switch (reg)
  36   1       {
  37   2       case 0:
  38   2               V0=1;
  39   2               CAN_DATA0=value;break;
  40   2       case 1:
  41   2               V1=1;
  42   2               CAN_DATA1=value;break;
  43   2        case 2:
  44   2               V2=1;
  45   2               CAN_DATA2=value;break;
  46   2        case 3:
  47   2               V3=1;
  48   2               CAN_DATA3=value;break;
  49   2      
  50   2       }
  51   1       //AUAD=0X01;
  52   1       RWEN=1;
  53   1       while(BSY==1);
  54   1      }
  55          
C51 COMPILER V7.09   CAN                                                                   05/15/2008 08:28:24 PAGE 2   

  56          
  57          void can_read(uword addr)
  58          {
  59   1        CAN_ADL=(addr>>2)&0xff;
  60   1      CAN_ADH=(addr>>10)&0x0f;
  61   1       RWEN=0;
  62   1       while(BSY==1);
  63   1      // BSY=0;
  64   1      }
  65           //置位
  66          void set_bit(uword addr,uchar bitnum,uchar value)
  67          {
  68   1        uchar i=1;
  69   1        //can_read(addr);
  70   1        CAN_ADL=(addr>>2)&0xff;
  71   1        CAN_ADH=(addr>>10)&0x0f;
  72   1         if(bitnum<8)  {
  73   2         
  74   2         if(value)
  75   2         CAN_DATA0|=(i<<bitnum);
  76   2         else
  77   2         CAN_DATA0&=~(i<<bitnum);
  78   2         V0=1;
  79   2         }
  80   1         else if(bitnum>=8&&bitnum<16)
  81   1         {
  82   2           
  83   2           if(value)
  84   2           CAN_DATA1|=(i<<(bitnum-8));
  85   2           else
  86   2           CAN_DATA1&=~(i<<(bitnum-8));
  87   2             V1=1;
  88   2           }
  89   1            else if(bitnum>=16&&bitnum<24)
  90   1            {
  91   2            
  92   2            if(value)
  93   2           CAN_DATA2|=(i<<(bitnum-16));
  94   2           else
  95   2             CAN_DATA2&=~(i<<(bitnum-16));
  96   2             V2=1;
  97   2           }
  98   1            else if(bitnum>=24&&bitnum<32)
  99   1            {
 100   2         
 101   2            if(value)
 102   2           CAN_DATA3|=(i<<(bitnum-24));
 103   2           else
 104   2           CAN_DATA3&=~(i<<(bitnum-24));
 105   2           V3=1;
 106   2           }
 107   1      
 108   1             RWEN=1;
 109   1       while(BSY==1);
 110   1      }
 111               //读相应的位
 112              uchar read_bit(uword addr,uchar bitnum)
 113              {
 114   1            uchar i=1;
 115   1        //can_read(addr);
 116   1        CAN_ADL=(addr>>2)&0xff;
 117   1        CAN_ADH=(addr>>10)&0x0f;
C51 COMPILER V7.09   CAN                                                                   05/15/2008 08:28:24 PAGE 3   

 118   1            RWEN=0;
 119   1       while(BSY==1);
 120   1         if(bitnum<8)  {
 121   2         //V0=1;
 122   2           return CAN_DATA0&(i<<bitnum)  ;
 123   2         }
 124   1         else if(bitnum>=8&&bitnum<16)
 125   1         {
 126   2           //V1=1;
 127   2           return CAN_DATA1&(i<<(bitnum-8));
 128   2      
 129   2           }
 130   1            else if(bitnum>=16&&bitnum<24)
 131   1            {
 132   2            //V2=1;
 133   2           return CAN_DATA2&(i<<(bitnum-16));
 134   2           }
 135   1            else if(bitnum>=24&&bitnum<32)
 136   1            {
 137   2            //V3=1;
 138   2           return CAN_DATA3&(i<<(bitnum-24));
 139   2           }
 140   1          }
 141          
 142           //写发送数据
 143          void write_send_data(can_data data1)
 144          {
 145   1      uchar j=0,k=0,p=0;
 146   1        can_write_0(MOFCR0,data1.length,3);
 147   1        if(data1.leibie==1)
 148   1        can_write(MOAR0,((data1.signal)|0x20000000));
 149   1        else
 150   1        can_write(MOAR0,(data1.signal<<18)&0XDFFFFFFF);
 151   1          while(data1.length--)
 152   1          {
 153   2            //can_wtrite_0((0X1010+j+k),data1.data0[j],p);
 154   2            //PORT_PAGE=0;
 155   2            //P3_DATA=data1.data0[j];
 156   2            can_write_0((MODATAL0+p),data1.data0[j],j);
 157   2            j++;
 158   2              //p++;
 159   2      
 160   2         if(j>=4)
 161   2         {
 162   3          // k=k+0x20;
 163   3           p++;
 164   3         }
 165   2      
 166   2         } //end while
 167   1      
 168   1      
 169   1      }
 170          
 171          //接受报文函数  p458
 172          void receive_message()
 173          {
 174   1         set_bit(MOSTAT0,MSGVAL,1);
 175   1         set_bit(MOSTAT0,RXEN,1);
 176   1         set_bit(MOSTAT0,NEWDAT,0);
 177   1      
 178   1         //设置接受标识符
 179   1         can_write(MOAR0,0XF0);
C51 COMPILER V7.09   CAN                                                                   05/15/2008 08:28:24 PAGE 4   

 180   1         while(read_bit(MOSTAT0,RTSEL)==0);
 181   1         while(read_bit(MOSTAT0,NEWDAT)!=0&&read_bit(MOSTAT0,RXUPD)!=0);
 182   1           set_bit(MOSTAT0,NEWDAT,1);
 183   1           if(read_bit(MOSTAT0,RXPND)==1)
 184   1           {
 185   2              set_bit(MOSTAT0,RXPND,0);
 186   2              //设置p3值
 187   2           }
 188   1      
 189   1      
 190   1      
 191   1      }
 192           //PANAR2为列表,panar1为报文对象,pancmd位命令
 193          void write_pancom(uchar pancmd,uchar panar1 ,uchar panar2)
 194          {
 195   1          CAN_ADL=(PANCTR>>2)&0xff;
 196   1      CAN_ADH=(PANCTR>>10)&0x0f;
 197   1      
 198   1      CAN_DATA0=pancmd;
 199   1      CAN_DATA2=panar1;
 200   1      CAN_DATA3=panar2;
 201   1      CAN_ADCON=0XD5;//必须在data数据之后设置
 202   1      while(BSY==1);
 203   1        while(read_bit(PANCTR,0X08)!=0);
 204   1      }
 205          
 206           void can1_init()
 207           {
 208   1      
 209   1       //节点1控制
 210   1            //漏极开路选择
 211   1          PORT_PAGE  = 0x03;

⌨️ 快捷键说明

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