📄 cantrans.lst
字号:
C51 COMPILER V7.06 CANTRANS 09/19/2004 09:49:35 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE CANTRANS
OBJECT MODULE PLACED IN CanTrans.OBJ
COMPILER INVOKED BY: e:\Keil\C51\BIN\C51.EXE CanTrans.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /********************************************
2 对外接口 Can_Receive(从CanBus接收数据)
3 Can_Send(从CanBus发送数据)
4 INITCAN(初始化)
5 CanINTR(中断函数)
6 ChkEndC(检查帧发送结束)
7 ********************************************/
8 #ifndef __CANTRANS_C__
9 #define __CANTRANS_C__
10
11 #include <AT89X51.H>
12
13 #include "hal.h"
14 #include "ChgPoint.h"
15
16 #define _BUFSIZEC 0x0bff //缓冲区长度
17 #define _INTRPSW 0x27 //中断屏蔽
18 #define _CANADD 0 //CAN接口芯片地址
19
20 uchar xdata bufC[_BUFSIZEC]; //缓冲区
21 uchar CheckCS = 0;
22 uint des_c = 0;
23 uint sou_c = 0; //缓冲区写入,读出指针
24 uchar xdata *canport = _CANADD;
25 uint lenC = _BUFSIZEC; //缓冲区长度
26
27 void Can_Write(void); //写缓冲区
28 void Can_Read(uchar *buf); //读缓冲区
29 void rst_wdog(void);
30
31 uchar Can_Receive(uchar *buf) //处理Can总线接收信息
32 {
33 1 uchar i;
34 1 uint p;
35 1 uchar temp;
36 1 if(des_c == sou_c)
37 1 return(0); //无数据送入则返回
38 1 p = sou_c;
39 1 for(i = 0;i < 3;i ++)
40 1 p = ChgPoint(p, lenC); //总长度
41 1 temp = bufC[p] + 4;
42 1 for(i = 0;i < temp;i ++) //读入数据
43 1 {
44 2 p = bufC[sou_c];
45 2 *buf = p;
46 2 buf ++;
47 2 sou_c = ChgPoint(sou_c, lenC);
48 2 }
49 1 return(1);
50 1 }
51
52 void Can_Send(uchar *buf) //向Can总线发送信息
53 {
54 1 uchar temp;
55 1 uchar i;
C51 COMPILER V7.06 CANTRANS 09/19/2004 09:49:35 PAGE 2
56 1 uchar te;
57 1 rst_wdog();
58 1 te = *buf;
59 1 *(canport + 19) = te; //目的设备地址,DesDevID
60 1 buf ++;
61 1 te = *buf;
62 1 *(canport + 18) = te; //源设备地址,SouDevID
63 1 buf ++;
64 1 te = *buf;
65 1 *(canport + 17) = te; //命令字,Type
66 1 buf ++;
67 1 te = *buf;
68 1 *(canport + 16) = te | 0x80; //数据长度,Length
69 1 buf ++;
70 1 *(canport + 20) = 0; //保留位
71 1 for(i = 0;i < temp;i ++)
72 1 {
73 2 te = *buf;
74 2 buf ++;
75 2 *(canport + 21 + i) = te; //写入Data
76 2 }
77 1 *(canport + 1) = 0x01; //发送信息
78 1 CheckCS = 1;
79 1 }
80
81 void INITCAN() //Can接口芯片初始化
82 {
83 1 uchar i;
84 1 uchar dev = 0;
85 1 P1 = 0xff;
86 1 dev = (P1>>2)&0x3c;
87 1 P3 = 0xff;
88 1 dev = dev|((P3<<5)&0x01);
89 1 dev = dev|((P3<<3)&0x02); //本机设备号
90 1 *canport = 0x09; //单验收滤波器,复位状态
91 1 *(canport + 31) = 0x80; //PeliCan模式,启用CLKOUT引脚,供应时钟频率为晶振频率的1/2
92 1 for(i = 0;i < 8;i ++)
93 1 *(canport + 16 + i)= 0xff; //验收代码和屏蔽代码均被置为0xff
94 1 *(canport + 18) = dev; //本机设备号写入验收代码,即协议中规定的DesDevID处
95 1 *(canport + 22) = 0; //验收屏蔽位
96 1 *(canport + 6) = 0x71; //总线定时器0
97 1 *(canport + 7) = 0xb4; //总线定时器1
98 1 *(canport + 8) = 0x1a; //输出控制
99 1 *canport = 0x08; //正常状态
100 1 *(canport + 4) = _INTRPSW;
101 1 }
102
103 uchar ChkEndC()
104 {
105 1 return(CheckCS);
106 1 }
107
108 void CanINTR() interrupt 0 using 1 //CanBus接口芯片产生中断(INTR0)
109 {
110 1 uchar sta;
111 1 uchar temp;
112 1 EX0 = 0;
113 1 sta = *(canport + 3); //读中断寄存器
114 1 temp = sta & 0x20;
115 1 if(temp == 0x20)
116 1 INITCAN();
117 1 temp = sta & 0x04;
C51 COMPILER V7.06 CANTRANS 09/19/2004 09:49:35 PAGE 3
118 1 if(temp == 0x04)
119 1 INITCAN(); //消极错误中断,错误报警中断,均导致重启
120 1 temp = sta & 0x02;
121 1 if(temp == 0x02) //发送中断处理
122 1 CheckCS = 0;
123 1 temp = sta & 0x01;
124 1 if(temp == 0x01) //接收中断,接收数据
125 1 Can_Write();
126 1 EX0 = 1;
127 1 }
128
129 void Can_Write() //写缓冲区
130 {
131 1 uchar temp;
132 1 uchar i;
133 1 uint p = 0;
134 1 temp = *(canport + 16) & 0x0f; //获得长度
135 1 p = des_c;
136 1 for(i = 0;i < (temp + 3);i ++)
137 1 {
138 2 p = ChgPoint(p, lenC);
139 2 if(p == sou_c) //缓冲区溢出则丢弃该帧
140 2 {
141 3 *(canport + 1) = 0x04;
142 3 return;
143 3 }
144 2 }
145 1 bufC[des_c] = *(canport + 19); //写入DesDevID
146 1 des_c = ChgPoint(des_c, lenC); //des_c ++
147 1 bufC[des_c] = *(canport + 18); //写入SouDevID
148 1 des_c = ChgPoint(des_c, lenC);
149 1 bufC[des_c] = *(canport + 17); //写入Type
150 1 des_c = ChgPoint(des_c, lenC);
151 1 bufC[des_c] = temp; //写入Length
152 1 des_c = ChgPoint(des_c, lenC);
153 1 for(i = 0;i < temp;i ++)
154 1 {
155 2 bufC[des_c] = *(canport + 21 + i); //写入Data
156 2 des_c = ChgPoint(des_c, lenC);
157 2 }
158 1 *(canport + 1) = 0x04; //释放缓冲区
159 1 }
160
161 #endif
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 903 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 3071 ----
PDATA SIZE = ---- ----
DATA SIZE = 9 13
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 + -