📄 can.lst
字号:
C51 COMPILER V8.09 CAN 09/23/2008 08:34:16 PAGE 1
C51 COMPILER V8.09, COMPILATION OF MODULE CAN
OBJECT MODULE PLACED IN can.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE src\can.c LARGE OPTIMIZE(7,SPEED) BROWSE DEBUG OBJECTEXTEND PRINT(.\can.lst
-) OBJECT(can.obj)
line level source
1
2 //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
3 //描述: sja1000can总线处理函数
4 // CAN主要参数: PeliCAN模式,扩展帧EFF模式 &
5 // 29位标示码结构: &
6 // 本节点的地址: 0x11,0x22,0x33,0x00;可以接收全部节点的数据 &
7 // 目的节点地址:0x01,0x02,0x03,0x00;可以被能接收全部节点数据的节点接收 &
8
9 //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
10
11 #include <reg52.h>
12 #include <intrins.h>
13 #include <inc/can.h>
14 #include "inc/timer_pwm.h"
15 #include "inc/CPUIO_DEF.H"
16 #include "inc/EXT_PUBLIC_VARIABLE.H"
17 #include "inc/candul.H"
18
19 /**************************************************************************************
20 ;;函数原型: void CAN_RXD( void ) interrupt 0
21 ;;函数功能: CAN中断处理函数,包括接收中断和发送中断
22 ;;函数输入: 无
23 ;;函数输出: 无
24 ;;函数返回值: 无
25 ***************************************************************************************/
26 void CAN_RXD( void ) interrupt 0 using 3
27 {
28 1 uchar data Judge,tmpbuf[5];
29 1
30 1 // EA = 0;//关CPU中断
31 1
32 1 Judge = IR;
33 1 if( Judge & 0x01)
34 1 {//IR.0 = 1 接收中断
35 2 tmpbuf[0] = RBSR0; //标示
36 2 tmpbuf[1] = RBSR1; //id --地址
37 2
38 2 if( ((tmpbuf[0]&0xc0) == 0x80)&&(tmpbuf[1] == ADDRESS) )
39 2 { //是扩展帧和数据帧并且是本机地址
40 3 if( CanRx.farmeSta ==NULL )
41 3 {
42 4 CanRx.farmeSta = FULL;
43 4 CanRx.farmeType = RBSR3; //命令类型
44 4 CanRx.farmeSubType = RBSR4; //子命令
45 4 CanRx.farmeLong = tmpbuf[0]&0x0f; //数据长度
46 4
47 4 CanRx.farmeData[0] = RBSR5;//数据
48 4 CanRx.farmeData[1] = RBSR6;//数据
49 4 CanRx.farmeData[2] = RBSR7;//数据
50 4 CanRx.farmeData[3] = RBSR8;//数据
51 4 CanRx.farmeData[4] = RBSR9;//数据
52 4 CanRx.farmeData[5] = RBSR10;//数据
53 4 CanRx.farmeData[6] = RBSR11;//数据
54 4 CanRx.farmeData[7] = RBSR12;//数据
C51 COMPILER V8.09 CAN 09/23/2008 08:34:16 PAGE 2
55 4 CanRx.farmeData[8] = RBSR2; //帧计数
56 4
57 4 }
58 3 }
59 2 CMR = 0X04; //释放接收缓冲器
60 2 Judge = ECC; //释放错误代码捕捉寄存器
61 2 }
62 1 else if(Judge & 0x02)
63 1 { //IR.1 = 1 发送中断
64 2
65 2 }
66 1 else if(Judge & 0x04)
67 1 { //IR.2 = 1 错误报警中断
68 2
69 2 }
70 1 else if(Judge & 0x08)
71 1 {//IR.3 = 1 数据溢出中断
72 2 CMR = 0X10; //清楚数据溢出位
73 2 }
74 1 else if(Judge & 0x10)
75 1 {//IR.4 = 1 唤醒中断
76 2 }
77 1 else if(Judge & 0x20)
78 1 {//IR.5 = 1 错误消极中断
79 2 }
80 1 else if(Judge & 0x40)
81 1 {//IR.6 = 1 仲裁丢失中断
82 2 Judge = ALC;//释放仲裁随时捕捉寄存器
83 2 }
84 1 else
85 1 {//IR.7 = 1 总线错误中断
86 2 }
87 1 IER = 0x01;// .0=1--接收中断使能;
88 1 // EA = 1;//打开CPU中断
89 1 }
90
91
92 /**************************************************************************************
93 ;;函数原型: void Rxd_deal(void)
94 ;;函数功能: CAN接收处理函数
95 ;;函数输入: 无
96 ;;函数输出: 无
97 ;;函数返回值: 无
98 ;;主循环调用
99 ***************************************************************************************/
100
101 void Rxd_deal(void)
102 {//////// 接收处理程序//////////////
103 1 uchar ucTxdBuf[8];
104 1 if( CanRx.farmeSta == FULL )
105 1 {
106 2 CanRx.farmeSta = NULL;
107 2 if( (CanRx.farmeType == MS_REST_STOP_CAR)|| (CanRx.farmeType == MS_STOP_CAR50_SLOW)||(CanRx.farmeT
-ype == MS_STOP_CAR100_SLOW)||
108 2 (CanRx.farmeType == MS_REST_STOP_CAR)||(CanRx.farmeType == MS_STOP_CAR50_FAST)||(CanRx.farmeType =
-= MS_STOP_CAR100_FAST)||
109 2 (CanRx.farmeType == MS_ALLOW_IN_UPDATE_STA))
110 2 {
111 3 //数据接收正确应答
112 3 ucTxdBuf[0] = 0x00;//000000回复相应结果
113 3 CAN_TXD( MADDRESS,SM_RECEV_OK,UN_ACK,1,ucTxdBuf );
114 3 StopCar.sta = START;
C51 COMPILER V8.09 CAN 09/23/2008 08:34:16 PAGE 3
115 3 StopCar.cmd = CanRx.farmeType;
116 3 }
117 2 else
118 2 {
119 3 switch( CanRx.farmeType )
120 3 {
121 4 case MS_SYS_SEELP://系统睡眠
122 4 break;
123 4 case MS_ALLOW_IN_UPDATE_STA://允许进入升级状态
124 4 break;
125 4 case MS_UPDATA_DATAS://升级数据帧
126 4 break;
127 4 case MS_VERIFY_DATAS://校验数据
128 4 break;
129 4
130 4 }
131 3 }
132 2 }
133 1 }//////// 接收处理程序//////////////
134 /**************************************************************************************
135 ;;函数原型: void CAN_init( void )
136 ;;函数功能: CAN初始化函数can2.0b
137 ;;函数输入: 无
138 ;;函数输出: 无
139 ;;函数返回值: 无
140 ***************************************************************************************/
141 void CAN_init( void )
142 {//SJA1000 的初始化
143 1 uchar bdata Judge;
144 1
145 1 do
146 1 {// .0=1---reset MODRe,进入复位模式,以便设置相应的寄存器
147 2 MODR = 0x09;
148 2 Judge = MODR ;
149 2 }
150 1 while( !(Judge & 0x01) );
151 1 CDR = 0x88; // CDR.3=1--时钟关闭, .7=0---basic CAN, .7=1---Peli CAN ,.2-.0 为000,2分频时钟频率为fos
-c/2
152 1
153 1 //10k
154 1 // BTR0 = 0x1d; //波特率为fosc=12m时brp.5-brp.0 = 011101,波特率为1m,tscl = 5us,tsjw=2*3=0us
155 1 // BTR1 = 0xdc; //10总线波特率设定 tseg1=1011(11),tseg2=100(4)位速率=tscl*(tseg1+tseg2+3)=5*20=100us
-(10k)
156 1
157 1 // 100K
158 1 BTR0 = 0x05; //波特率为fosc=12m时brp.5-brp.0 = 000101,波特率为1m,tscl = 1us,tsjw=2*3=0us
159 1 BTR1 = 0x25; //高速BTR1.7 =SAM=0;总线波特率设定 tseg1=0110(6),tseg2=011(3)位速率=tscl*(tseg1+tseg2+
-3)=1*10=10us(100k)
160 1 // 500k
161 1 // BTR0 = 0x00; //波特率为fosc=12m时brp.5-brp.0 = 000001,tscl = 1/6us,tsjw=2*3=0us
162 1 // BTR1 = 0x36; //10总线波特率设定 tseg1=0101(6),tseg2=010(3)位速率=tscl*(tseg1+tseg2+1)=1*10=10us(50
-0k)
163 1
164 1
165 1 IER = 0x01; //.0=1--接收中断使能; .1=0--关闭发送中断使能
166 1 OCR = 0xaa; // 配置输出控制寄存器
167 1 CMR = 0x04; //释放接收缓冲器
168 1
169 1 ACR = ADDRESS; //本节点地址0x04
170 1 ACR1 = 0;
171 1 ACR2 = 0;
172 1 ACR3 = 0; //初始化标示码
C51 COMPILER V8.09 CAN 09/23/2008 08:34:16 PAGE 4
173 1
174 1 AMR = 0;
175 1 AMR1 = 0xff;
176 1 AMR2 = 0xff;
177 1 AMR3 = 0xff; //初始化掩码
178 1 do
179 1 {//确保退出复位模式
180 2 MODR = 0x08; //单滤波
181 2 Judge = MODR ;
182 2 }
183 1 while( Judge & 0x01 );
184 1 }
185
186 /**************************************************************************************
187 ;;函数原型: void CAN_TXD( uchar ucAddress,uchar ucCmd,uchar ucSubCmd,uchar ucLong,uchar *PData )
188 ;;函数功能: CAN发送函数
189 ;;函数输入: ucAddress地址,,ucCmd命令,ucSubCmd子命令,ucLong长度,*PData数据指针
190 ;;函数输出: 无
191 ;;函数返回值: 无
192 ***************************************************************************************/
193 void CAN_TXD( uchar ucAddress,uchar ucCmd,uchar ucSubCmd,uchar ucLong,uchar *PData )
194 {
195 1 uchar data Judge;
196 1 //初始化数据信息
197 1 // EA = 0; //关中断
198 1 do
199 1 {
200 2 Judge = SR;
201 2 // LED_RED = 0;//
202 2 }
203 1 while( Judge & 0x10 ); //SR.4=1 正在接收,等待
204 1
205 1 do
206 1 {
207 2 Judge = SR;
208 2 // LED_RED = 0;//
209 2 }
210 1 while(!(Judge & 0x08)); //SR.3=0,发送请求未处理完,等待
211 1
212 1 do
213 1 {
214 2 Judge = SR;
215 2 // LED_RED = 0;//
216 2 }
217 1 while(!(Judge & 0x04)); //SR.2=0,发送缓冲器被锁。等待
218 1
219 1 // LED_RED = !LED_RED;
220 1 // LED_GRE = !LED_GRE;//灯闪烁
221 1 TBSR0 = 0x80|(ucLong&0x0f); //.7=0扩展帧;.6=0数据帧; .3.2.1.0=数据长度8
222 1 TBSR1 = ucAddress; //目的节点地址
223 1 TBSR2 = 0; //
224 1 TBSR3 = ucCmd; //
225 1 TBSR4 = ucSubCmd; //
226 1
227 1 TBSR5 = *PData++;
228 1 TBSR6 = *PData++;
229 1 TBSR7 = *PData++;
230 1 TBSR8 = *PData++;
231 1 TBSR9 = *PData++;
232 1 TBSR10 = *PData++;
233 1 TBSR11 = *PData++;
234 1 TBSR12 = *PData++;
C51 COMPILER V8.09 CAN 09/23/2008 08:34:16 PAGE 5
235 1
236 1 CMR = 0x01;//置位发送请求
237 1 // EA = 1;
238 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 606 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- 15
PDATA SIZE = ---- ----
DATA SIZE = ---- 8
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 + -