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