📄 sja.lst
字号:
C51 COMPILER V3.20, SN-0 SJA 07/09/02 14:55:32 PAGE 1
DOS C51 COMPILER V3.20, COMPILATION OF MODULE SJA
OBJECT MODULE PLACED IN SJA.OBJ
COMPILER INVOKED BY: D:\QTH8052F\BIN\C51.EXE SJA.C OBJECTEXTEND DB SB
stmt level source
1 /*
* sja.c
*
* CAN总线通讯
*
*
* 原作者:刘篷,孙占辉
*
* 修改:陈真勇(SA01010010)
* w3wind@sina.com or
* zychen@ustc.edu.cn
* 中国科学技术大学自动化系
* 2002/6/12
*/
15
16 #include "type.h"
17 #include "link.h"
18 #include "delay.h"
19 #include "watchdog.h"
20
21 BYTE canmode[17]; /* 存放控制字 */
22 BYTE TXdata[11]; /* 发送缓冲区 */
23 BYTE RXdata[11]; /* 接收缓冲区 */
24
25
26 void ctransmit() reentrant;
27
28
29 /* direct access to 8051 memory areas */
30 BYTE read_sja(BYTE addr) reentrant using 0
31 {
32 1 return ((BYTE volatile*)0x30000L)[addr];
33 1 }
34
35 void write_sja(BYTE addr,BYTE val) reentrant using 0
36 {
37 1 ((BYTE volatile*)0x30000L)[addr]=val;
38 1 }
39
40
41 /*
* function below used for SJA settings,system startup display
*/
44 void set_canmode(BYTE md_addr,BYTE baud)
45 {
46 1 canmode[0]=0x00;/*normal mode,single filter*/
47 1 canmode[1]=0x09;/*enable receive and overflow interrupt*/
48 1 canmode[2]=baud;/*bustime0*/
49 1 canmode[3]=0xA3;/*bustime1*/
50 1 canmode[4]=0x1A;/*output control*/
51 1 canmode[5]=0xC7;/*clock divide pelican mode,bypass comparator*/
52 1 canmode[6]=md_addr;
53 1 canmode[7]=0xff;
54 1 canmode[8]=0x03;
55 1 canmode[9]=0xff;
C51 COMPILER V3.20, SN-0 SJA 07/09/02 14:55:32 PAGE 2
56 1 canmode[10]=0xc0;
57 1 canmode[11]=0xff;
58 1 canmode[12]=0xc0;
59 1 canmode[13]=0xff;
60 1 }
61
62 void send_reset_frame(BYTE md_addr) using 0
63 {
64 1 BYTE temp_reg,relay_time;
65 1
66 1 write_sja(1,0x08);
67 1 temp_reg=read_sja(4);
68 1 write_sja(4,0x00);
69 1 TXdata[0]=0x08;
70 1 TXdata[1]=0x40;
71 1 TXdata[2]=0x00;
72 1 TXdata[3]=0x5f;
73 1 TXdata[4]=0x05;
74 1 TXdata[5]=md_addr;
75 1 TXdata[6]=0x00;
76 1 TXdata[7]=0x00;
77 1 TXdata[8]=0x00;
78 1 TXdata[9]=0x00;
79 1 TXdata[10]=0x00;
80 1 relay_time=md_addr;
81 1 while(relay_time--){/* delay some time relate to module address in order to avoid crash */
82 2 delay(5);
83 2 clear_watchdog();
84 2 }
85 1 ctransmit();
86 1 write_sja(4,temp_reg);
87 1 }
88 /* init SJA1000 */
89 void init_sja(BYTE md_addr,BYTE baud)
90 {
91 1 set_canmode(md_addr,baud);
92 1
93 1 read_sja(3);
94 1 do{
95 2 write_sja(0,0x01);
96 2 }while(!(read_sja(0)&0x01));
97 1
98 1 write_sja(6,canmode[2]); /*bustime0 default 0xc3*/
99 1 write_sja(7,canmode[3]); /*bustime1 default 0xa3*/
100 1 write_sja(8,canmode[4]); /*output control*/
101 1 write_sja(31,canmode[5]); /*PeliCAN mode,bypass the input comparator*/
102 1
103 1 write_sja(14,0x00);
104 1 write_sja(15,0x00);
105 1
106 1 write_sja(16,canmode[6]); /*acceptcode default ffffffff*/
107 1 write_sja(17,canmode[7]);
108 1 write_sja(18,canmode[8]);
109 1 write_sja(19,canmode[9]);
110 1
111 1 write_sja(20,canmode[10]); /*acceptmask default ffffffff*/
112 1 write_sja(21,canmode[11]);
113 1 write_sja(22,canmode[12]);
114 1 write_sja(23,canmode[13]);
115 1
116 1 write_sja(4,canmode[1]);
117 1 write_sja(1,0x04);
C51 COMPILER V3.20, SN-0 SJA 07/09/02 14:55:32 PAGE 3
118 1 /*can_mode[17],0 mode,1 inter,2 bustime0,3 bustime1,4 outputcontrol,5 clockdivide,6-9 acode,10-13 amask,1
-4 errorlimit,15 RXecount,16 TXecount*/
119 1 do{
120 2 write_sja(0x00,canmode[0]); /*SJA1000 workingmode normal*/
121 2 }while(!read_sja(0)&0x08 );
122 1
123 1 send_reset_frame(md_addr);/*发出初始帧*/
124 1 }
125
126 void ctransmit() reentrant using 0
127 {
128 1 int j;
129 1 BYTE can_addr;
130 1 EA=0;
131 1
132 1 can_addr=16;
133 1
134 1 do{
135 2 }while(! (read_sja(2)&0x04) ); /* wait until reg2^2==1 */
136 1
137 1 CANLAMP=0;/* light LED */
138 1 for(j=0;j<11;j++) {/* write 11 bytes data to transmit buffer */
139 2 write_sja(can_addr++,TXdata[j]);
140 2 }
141 1 CANLAMP=1;/* disable LED */
142 1 write_sja(0x01,0x01);/* send out */
143 1
144 1 EA=1;
145 1 }
146
147 /* 读取帧
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -