📄 can.lst
字号:
C51 COMPILER V7.06 CAN 12/24/2007 11:05:46 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE CAN
OBJECT MODULE PLACED IN can.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE can.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1
2
3 #include "can.h"
4 //#include "reg52.h"
5
6 void SJAInit(tByte Reg_acr)
7 {
8 1 MODE = 0x09; //模式寄存器,单验收滤波器,进入复位模式
9 1 CDR = 0x88; //时钟分频R,选择增强CAN模式,关闭CLKOUT输出
10 1 IER = 0x0d; //中断使能寄存器,开溢出、错误、接收中断
11 1
12 1 BTR0 = 0x03; //总线定时寄存器
13 1 BTR1 = 0xff; //总线定时寄存器二,6MHz晶振,波特率30Kbps
14 1
15 1 OCR = 0xaa; //输出控制寄存器
16 1
17 1 ACR0 = Reg_acr; //验收代码ACR0
18 1 ACR1 = 0xff; //验收代码ACR1,以下无关
19 1 ACR2 = 0xff; //验收代码ACR2
20 1 ACR3 = 0xff; //验收代码ACR3
21 1
22 1 AMR0 = 0x00; //验收屏蔽寄存器AMR0=00H
23 1 AMR1 = 0xff; //验收屏蔽寄存器AMR1,以下无关
24 1 AMR2 = 0xff; //验收屏蔽寄存器AMR2
25 1 AMR3 = 0xff; //验收屏蔽寄存器AMR3
26 1
27 1 RBSA = 0x00; //接收缓冲器FIFO起始地址为0
28 1 TXER = 0x00; //清除发送错误计数器
29 1 ECC = 0x00; //清除错误代码捕捉寄存器
30 1 MODE = 0x08; //单滤波方式,返回工作方式
31 1
32 1 }
33
34 tByte SJASendData(tByte *Tdata,tByte DatLen,tByte TarID,SaID,TxRx)
35 {
36 1 static tByte TempData;
37 1 static tByte TempValue;
38 1 TempData = SR; //读状态寄存器
39 1 // P1 = SR;
40 1 do //判断是否正在接收正在接收则等待
41 1 {
42 2 TempData = SR; //TempValue = 1则等待
43 2 }while(TempData & Bit(4));
44 1
45 1 do //判断上次发送是否完成未完成则等待发送完成
46 1 { //TempValue = 0则等待
47 2 TempData = SR;
48 2 }while(!(TempData & Bit(3)));
49 1
50 1 do //判断发送缓冲区是否锁定锁定则等待
51 1 { //TempValue = 0则等待
52 2 TempData = SR;
53 2 }while(!(TempData & Bit(2)));
54 1
55 1 FIN(0) = TxRx;
C51 COMPILER V7.06 CAN 12/24/2007 11:05:46 PAGE 2
56 1 ID1 = TarID;
57 1 ID2 = SaID;
58 1 //开始发送数据,一共8个字节,全部为有效数据
59 1 for(TempValue = 0;TempValue<DatLen;TempValue++)
60 1 {
61 2 DAT1(TempValue) = Tdata[TempValue];
62 2 }
63 1
64 1 CMR = 0x01; //启动SJA1000 发送
65 1
66 1 return 0;
67 1 }
68
69 tByte SJARecvData(tByte *Rdata,tByte DatLen)
70 {
71 1
72 1 static tByte TempData;
73 1 static tByte TempValue;
74 1 TempData = SR; //读状态寄存器
75 1 TempValue = (TempData & 0xc3);
76 1 if(!TempValue ) //读取总线脱离、错误状态、接收溢出、有数据等位
77 1 {
78 2 return 1; //总线接收失败推出
79 2
80 2 }
81 1
82 1 if(TempData & Bit(7))
83 1 {
84 2 TempData = IR; //IR中断寄存器,出现总线脱离,读中断寄存器,清除中断位
85 2 MODE = 0x08; //推出复位模式,进入工作模式
86 2
87 2 return 2; //总线接收失败
88 2 }
89 1
90 1 TempData = IR;
91 1 if(TempData & Bit(3))
92 1 {
93 2 CMR = 0x0c; //数据溢出处理,清除数据溢出位,释放接收缓冲区
94 2
95 2 return 3; //总线接收失败
96 2 }
97 1
98 1 if(!(TempData & Bit(0)))
99 1 {
100 2 TempValue = ALC; //释放仲裁丢失捕捉寄存器和错误捕捉寄存器
101 2 TempValue = ECC;
102 2
103 2 return 4; //总线接受失败
104 2 }
105 1
106 1 //TempData = FIN; //远程帧处理
107 1 if(TempData & Bit(2))
108 1 {
109 2 CMR = 0x04;
110 2 TempValue = ALC; //释放仲裁丢失捕捉寄存器和错误捕捉寄存器
111 2 TempValue = ECC;
112 2
113 2 return 5;
114 2 }
115 1
116 1 for(TempValue = 0;TempValue<DatLen;TempValue++)
117 1 {
C51 COMPILER V7.06 CAN 12/24/2007 11:05:46 PAGE 3
118 2 Rdata[TempValue]= FIN(TempValue);
119 2
120 2 }
121 1
122 1 CMR = 0x04;
123 1 TempValue = ALC; //释放仲裁丢失捕捉寄存器和错误捕捉寄存器
124 1 TempValue = ECC;
125 1
126 1 return 0;
127 1 }
128
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 345 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 4 12
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 + -