📄 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 + -