📄 can.lst
字号:
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 + -