?? 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總線大壩監(jiān)測系統(tǒng)
3 ;底層節(jié)點(diǎn)
4 ;文件名稱: can.c
5 ;函數(shù)功能: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 // 消息對象不可用,默認(rèn)ID為0
35 1 for (i = 1;i < 33;i++)
36 1 {
37 2 CAN0ADR = IF1CMDRQST;
38 2 CAN0DATL = i;
39 2 // 應(yīng)用到32個(gè)消息對象
40 2 }
41 1 }
42
43
44
45 ////////////////////////////////////////////////////////////////////////////////
46 // 消息對象發(fā)送配置
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 // 標(biāo)準(zhǔn)id為ID28-ID18,則左移2位
60 1 temp_id &=0x1ffc;
61 1 temp_id |=0xa000;
62 1 // IF1ARB2=101(id)00b,MsgVal=1,Xtd=0,標(biāo)準(zhǔn)模式,Dir=1,發(fā)送
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 // 濾波使能,發(fā)送后IntPnd不變,遠(yuǎn)程禁止,長度為8的單塊
69 1 CAN0ADR = IF1CMDRQST;
70 1 CAN0DAT = msg_num;
71 1 // 應(yīng)用到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,標(biāo)準(zhǔn)模式,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發(fā)送數(shù)據(jù)動作
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字節(jié)數(shù)據(jù)寫入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接收數(shù)據(jù)動作
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 // 主節(jié)點(diǎn)消息對象分別初始化,設(shè)置波特率,開啟中斷,并且啟動CAN
154 ////////////////////////////////////////////////////////////////////////////////
155 void Can_Msg_Init (void){
156 1 SFRPAGE = CAN0_PAGE;
157 1
158 1 CAN0CN = 0X01;
159 1 // 初始化配置時(shí)將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 // 發(fā)送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 // 自動重發(fā)開啟,狀態(tài)中斷禁止,IE=1,CAN模塊中斷開啟,Init清零.結(jié)束初始化操作,CAN控制器進(jìn)入正常工作
179 1 }
C51 COMPILER V7.50 CAN 04/23/2009 16:56:46 PAGE 4
180
181
182
183 ////////////////////////////////////////////////////////////////////////////////
184 // CAN向上層回傳數(shù)據(jù)
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 /* 成功接收報(bào)文 */
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 // 標(biāo)志成功收到下層信息
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)
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -