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

📄 sja_interface.lst

📁 can总线通信程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.50   SJA_INTERFACE                                                         05/24/2007 16:12:27 PAGE 1   


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

line level    source

   1          /******************************************************************************************/
   2          //声明部分
   3          #include <REGX51.H>
   4          /******************************************************************************************/
   5          //声明
   6          #define  base_adr 0x00 /*对SJA1000寻址的基址*/
   7          #define  error    0   /*错误标志*/
   8          #define  right    1   /*正确标志*/
   9          #define  sja_btr0 0x18    
  10          #define  sja_btr1 0x1c
  11          #define  sja_acr  0xaa
  12          #define  sja_amr  0x00
  13          #define  sja_ocr  0xaa
  14          #define  sja_cdr  0x48
  15          #define  sja_oie  0
  16          #define  sja_eie  0
  17          #define  sja_tie  1   //发送中断
  18          #define  sja_rie  1    //接收中断
  19          /******************************************************************************************/
  20          //函数声明
  21          void weakup_sev(void);
  22          void data_over_sev(void);
  23          void wrong_sev(void);
  24          void send_sev(void);
  25          void receive_sev(void);
  26          /******************************************************************************************/
  27          //位定义
  28          bit send_bit=0;  //发送程序执行标志位,1执行;0不执行
  29          bit rece_bit=0;  //接收程序执行标志位,1执行;0不执行
  30          bit CAN_bit=0;   //CAN模块动作,1动作;0不动作
  31          /******************************************************************************************/
  32          //全局变量的定义
  33          unsigned char xdata *sja_base_adr=base_adr; /*定义地址指针,指向基址*/
  34          bit bdata sja_mode=1;   /*此位是1时SJA工作在工作模式,为0时工作在复位模式*/
  35          unsigned char bdata inttemp=0x00;
  36          /******************************************************************************************/
  37          //端口定义
  38          sbit cs=P1^0;
  39          sbit inttemp_4=inttemp^4;
  40          sbit inttemp_3=inttemp^3;
  41          sbit inttemp_2=inttemp^2;
  42          sbit inttemp_1=inttemp^1;
  43          /******************************************************************************************/
  44          //函数名称:write_can
  45          //函数功能:向CAN控制器写数据
  46          //入口参数:sja_adr,set_num(SJA的地址,向该地址写入的数据值)
  47          //出口参数:无
  48          //****备注:底层的硬件操作
  49          void write_can(unsigned char sja_adr,set_num)
  50          {
  51   1        cs=0;  /*使能SJA1000*/
  52   1        *(sja_base_adr+sja_adr)=set_num;
  53   1      }
  54          /*******************************************************************************************/
  55          //函数名称:read_can
C51 COMPILER V7.50   SJA_INTERFACE                                                         05/24/2007 16:12:27 PAGE 2   

  56          //函数功能:从CAN控制器读数据
  57          //入口参数:SJA的偏移地址
  58          //出口参数:读出的数据
  59          //****备注:底层的硬件操作
  60          unsigned char read_can(unsigned char sja_adr)
  61          {
  62   1        unsigned char get_data;  /*读出数据的暂存器*/
  63   1        cs=0;  /*使能SJA1000*/
  64   1        get_data=*(sja_base_adr+sja_adr);
  65   1        return(get_data);
  66   1      }
  67          /********************************************************************************************/
  68          //函数名称:sja_connect_judge
  69          //函数功能:判断单片机与CAN控制器的通讯是否成功
  70          //入口参数:无
  71          //出口参数:连接是否成功
  72          //****备注:SJA1000的基本操作,和硬件有关,操作测试寄存器(地址:9)
  73          bit sja_connect_judge(void)
  74          {
  75   1        write_can(0x09,0xcf);
  76   1        if(read_can(0x09)==0xcf)
  77   1         {
  78   2           return(right);
  79   2         }
  80   1        else
  81   1         {
  82   2           return(error);
  83   2         }
  84   1      }
  85          /********************************************************************************************/
  86          //函数名称:set_rst_mode
  87          //函数功能:设置SJA工作在复位模式
  88          //入口参数:无
  89          //出口参数:无
  90          //****备注:SJA1000的基本操作,和硬件有关,操作控制寄存器(地址:0)
  91          void set_rst_mode(void)
  92          {
  93   1        unsigned char control_reg_num;  /*定义变量,用于存放向控制寄存器写入的数据*/
  94   1        control_reg_num=read_can(0x00);  /*先读控制寄存器的值*/
  95   1        control_reg_num=control_reg_num|0x01;  /*将(控制寄存器.0)置1,即设为复位模式*/
  96   1        write_can(0x00,control_reg_num);  /*写入SJA1000*/
  97   1        while(sja_mode)
  98   1          {
  99   2            if(read_can(0x00)&0x01==1)
 100   2             {
 101   3               sja_mode=0;   /*置复位成功*/
 102   3             }
 103   2            else
 104   2             {
 105   3               sja_mode=1;  /*置复位失败*/
 106   3             }
 107   2          }
 108   1      }
 109          /********************************************************************************************/
 110          //函数名称:set_work_mode
 111          //函数功能:设置SJA工作在工作模式
 112          //入口参数:无
 113          //出口参数:无
 114          //****备注:SJA1000的基本操作,和硬件有关,操作控制寄存器(地址:0)
 115          void set_work_mode(void)
 116          {
 117   1        unsigned char control_reg_num;
C51 COMPILER V7.50   SJA_INTERFACE                                                         05/24/2007 16:12:27 PAGE 3   

 118   1        control_reg_num=read_can(0x00);
 119   1        control_reg_num=control_reg_num&0xfe;  /*设置工作模式的数值,允许各个中断*/
 120   1        while(sja_mode==0)
 121   1          {
 122   2                write_can(0x00,control_reg_num);
 123   2                if((read_can(0x00)&0x01)==0)
 124   2                 {
 125   3                   sja_mode=1;
 126   3                 }
 127   2                else
 128   2                 {
 129   3                   sja_mode=0;
 130   3                 }
 131   2              }
 132   1      }
 133          /********************************************************************************************/
 134          //函数名称:set_tra_rate
 135          //函数功能:设置SJA的数据传输速率
 136          //入口参数;sja_btr0,sja_btr1
 137          //出口参数:设置是否成功
 138          //****备注:SJA1000的基本操作,和硬件有关,操作总线定时器0、1(地址:6、7)
 139          //          *只能在复位模式下设置
 140          //          BTR0(地址:6)定义了数据传输速率预设值BRP和同步跳变宽度SJW,各位如下:
 141          //            ---------------------------------------------------------------
 142          //              位 |  BIT7 | BIT6 | BIT5 | BIT4 | BIT3 | BIT2 | BIT1 | BIT0 |
 143          //            ---------------------------------------------------------------
 144          //            功能 |  SJW1 | SJW0 | BRP5 | BRP4 | BRP3 | BRP2 | BRP1 | BRP0 |
 145          //            ---------------------------------------------------------------
 146          //          CAN的系统时钟Tscl=2*Tclk*(BRP+1),Tclk是SJA1000外部晶振的周期.同步跳变宽度SJW是为
 147          //          补偿其在不同的总线控制的时钟振荡器之间的相位偏移,任何总线控制器必须在当前传送的
 148          //          相位信号边沿重新同步。同步跳转宽度定义了每一位周期误差量。Tsjw=Tscl*(SJW+1)
 149          //          BTR1(地址:7)定义每个位的长度、采样点的位置和采样点的采样数目,各位如下:
 150          //            ----------------------------------------------------------------------
 151          //              位 |  BIT7 | BIT6  | BIT5  | BIT4  | BIT3  | BIT2  | BIT1  | BIT0  |
 152          //            ----------------------------------------------------------------------
 153          //            功能 |  SAM  |TSEG2.2|TSEG2.1|TSEG2.0|TSEG1.3|TSEG1.2|TSEG1.1|TSEG1.0|
 154          //            ----------------------------------------------------------------------
 155          //          SAM为1,总线采样3次,用在低/中速总线,起到数字滤波的作用。SAM为0,总线采样1次,在
 156          //          高速总线上使用。TSEG1和TSEG2确定每一位占用的时间和具体采样点的位置
 157          //          Tsyncseg=Tscl;Ttseg1=Tscl*TSEG1;Ttseg2=Tscl*TSEG2;
 158          //          位周期:      Tbit=(Tsyncseg+Ttseg1+Ttseg2)加减Tsjw
 159          //          数据传输速率:f=1/Tbit
 160          bit set_tra_rate(void)
 161          {
 162   1        while(sja_mode)
 163   1          {
 164   2            set_rst_mode();
 165   2          } 
 166   1        write_can(0x06,sja_btr0);
 167   1        write_can(0x07,sja_btr1);
 168   1        if((read_can(0x06)==sja_btr0)&(read_can(0x07)==sja_btr1))
 169   1         {
 170   2           return(right);
 171   2         }
 172   1        else
 173   1         {
 174   2           return(error);
 175   2         }
 176   1      }
 177          /********************************************************************************************/
 178          //函数名称:set_data_sel
 179          //函数功能:设置SJA接受数据类型
C51 COMPILER V7.50   SJA_INTERFACE                                                         05/24/2007 16:12:27 PAGE 4   

 180          //入口参数:sja_acr,sja_amr
 181          //出口参数:是否设置成功
 182          //****备注:SJA1000的基本操作,和硬件有关,操作验收代码寄存器ACR(地址:4)和验收屏蔽寄存器AMR(地址:5)
 183          //          *只能在复位模式下设置
 184          //          CAN总线的数据不带目标地址,以广播的形式在总线上传播.每个设备通过设置验收代码寄存器ACR和
 185          //          验收屏蔽寄存器AMR选择来自特定设备的数据.总线上的信息首先进入过滤逻辑,只有当信息的标识
 186          //          符位和接收过滤寄存器中的值相同时才送入RXFIFO。接收过滤寄存器的值由验收代码寄存器和验收
 187          //          屏蔽寄存器的内容决定。当屏蔽寄存器的某个位为0时,表示接收时对应位接受检测;当屏蔽寄存器
 188          //          的某位为1时,表示对应位被屏蔽(不接受检测)。接收信息的标识符必须满足最高8位与屏蔽寄存
 189          //          器的8位对应,没有被屏蔽的位必须与接收码寄存器的对应位一致,才被接收并送入RXFIFO,信息才
 190          //          被接受。通过过滤的信息被存入RXFIFO中,当整个信息完全被接收后,接收状态标志位被置为1;当
 191          //          接收中断请求允许时,置位接收中断请求标志将发送接收中断请求。
 192          bit set_data_sel(void)
 193          {
 194   1        while(sja_mode)
 195   1          {
 196   2            set_rst_mode();
 197   2          } 
 198   1        write_can(0x04,sja_acr);
 199   1        write_can(0x05,sja_amr);
 200   1        if((read_can(0x04)==sja_acr)&(read_can(0x05)==sja_amr))
 201   1         {
 202   2           return(right);
 203   2         }
 204   1        else
 205   1         {
 206   2           return(error);
 207   2         }
 208   1      }
 209          /********************************************************************************************/
 210          //函数名称:set_clk_mode
 211          //函数功能:设置CAN的工作模式,输出信号形式和输出时钟的形式
 212          //入口参数:sja_ocr,sja_cdr
 213          //出口参数:设置是否成功
 214          //****备注:SJA1000的基本操作,和硬件有关,操作输出控制寄存器OCR(地址:8)和时钟分频寄存器CDR(地址:31)
 215          //          *只能在复位模式下设置
 216          //          输出控制寄存器实现由软件控制不同输出驱动配置的建立,各位如下:
 217          //             ---------------------------------------------------------------------
 218          //              位 |  BIT7 | BIT6  | BIT5  | BIT4  | BIT3  | BIT2  | BIT1  | BIT0  |
 219          //             ---------------------------------------------------------------------
 220          //             功能| OCTP1 | OCTN1 |OCPOL1 | OCTP0 | OCTN0 |OCPOL0 |OCMODE1|OCMODE0|
 221          //             ---------------------------------------------------------------------
 222          //          当SJA1000在睡眠模式时,TX0和TX1引脚根据输出控制寄存器的内容输出隐性电平.当SJA1000在复位
 223          //          状态时,TX0和TX1引脚悬空。发送数据的时候可以有不同的输出方式,列如下:
 224          //             ---------------------------------------------------------------------
 225          //                OCMODE1        |      OCMODE0       |                说明
 226          //             ---------------------------------------------------------------------
 227          //                   0           |         0          |        双向输出模式
 228          //             ---------------------------------------------------------------------

⌨️ 快捷键说明

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