📄 basiccan_final1.lst
字号:
C51 COMPILER V6.23a BASICCAN_FINAL1 09/20/2008 12:27:03 PAGE 1
C51 COMPILER V6.23a, COMPILATION OF MODULE BASICCAN_FINAL1
OBJECT MODULE PLACED IN basiccan_final1.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE basiccan_final1.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <reg52.h>
2 #include <string.h>
3
4 #define uchar unsigned char
5 #define uint unsigned int
6
7 #define SJA_BaseAdr 0xfe00 //定义sja1000的片选基址
8
9 //计算SJA1000在电路中的实际地址:基址+内部寄存器地址
10
11 /************************************************************************
12 * 以下的定义为SJA1000的内部寄存器的地址,不可修改 *
13 * 各寄存器的具体功能清参阅sja1000的数据手册 *
14 ************************************************************************/
15 #define REG_CONTROL SJA_BaseAdr+0x00 //内部控制寄存器
16 #define REG_COMMAND SJA_BaseAdr+0x01 //命令寄存器
17 #define REG_STATUS SJA_BaseAdr+0x02 //状态寄存器
18 #define REG_INTERRUPT SJA_BaseAdr+0x03 //中断寄存器
19 #define REG_ACR SJA_BaseAdr+0x04 //验收代码寄存器
20 #define REG_AMR SJA_BaseAdr+0x05 //验收屏蔽寄存器
21 #define REG_BTR0 SJA_BaseAdr+0x06 //总线定时寄存器0
22 #define REG_BTR1 SJA_BaseAdr+0x07 //总线定时寄存器1
23 #define REG_OCR SJA_BaseAdr+0x08 //输出控制寄存器
24 #define REG_TEST SJA_BaseAdr+0x09 //测试寄存器
25
26 //以下为发送缓冲区寄存器定义
27
28 #define REG_TxBuffer1 SJA_BaseAdr+0x0A //发送缓冲区1
29 #define REG_TxBuffer2 SJA_BaseAdr+0x0B //发送缓冲区2
30 #define REG_TxBuffer3 SJA_BaseAdr+0x0C //发送缓冲区3
31 #define REG_TxBuffer4 SJA_BaseAdr+0x0D //发送缓冲区4
32 #define REG_TxBuffer5 SJA_BaseAdr+0x0E //发送缓冲区5
33 #define REG_TxBuffer6 SJA_BaseAdr+0x0F //发送缓冲区6
34 #define REG_TxBuffer7 SJA_BaseAdr+0x10 //发送缓冲区7
35 #define REG_TxBuffer8 SJA_BaseAdr+0x11 //发送缓冲区8
36 #define REG_TxBuffer9 SJA_BaseAdr+0x12 //发送缓冲区9
37 #define REG_TxBuffer10 SJA_BaseAdr+0x13 //发送缓冲区10
38
39 //以下为接收缓冲区寄存器定义
40 #define REG_RxBuffer1 SJA_BaseAdr+0x14 //接收缓冲区1
41 #define REG_RxBuffer2 SJA_BaseAdr+0x15 //接收缓冲区2
42 #define REG_RxBuffer3 SJA_BaseAdr+0x16 //接收缓冲区3
43 #define REG_RxBuffer4 SJA_BaseAdr+0x17 //接收缓冲区4
44 #define REG_RxBuffer5 SJA_BaseAdr+0x18 //接收缓冲区5
45 #define REG_RxBuffer6 SJA_BaseAdr+0x19 //接收缓冲区6
46 #define REG_RxBuffer7 SJA_BaseAdr+0x1A //接收缓冲区7
47 #define REG_RxBuffer8 SJA_BaseAdr+0x1B //接收缓冲区8
48 #define REG_RxBuffer9 SJA_BaseAdr+0x1C //接收缓冲区9
49 #define REG_RxBuffer10 SJA_BaseAdr+0x1D //接收缓冲区10
50
51 /************************************************************************
52 *内部地址 01EH 备用 *
53 ************************************************************************/
54
55 /************************************************************************
C51 COMPILER V6.23a BASICCAN_FINAL1 09/20/2008 12:27:03 PAGE 2
56 *时钟分频寄存器(内部地址01FH) *
57 ************************************************************************/
58 #define REG_CDR SJA_BaseAdr+0x1F //时钟分频寄存器
59
60
61 uchar xdata *SJA_BCANAdr;//定义指向片外RAM的指针(SJA1000的基址)
62
63 static uchar data BandRateBuf;//用于保存当前要设置的波特率
64
65 static uchar idata send_data[10];//用于缓存将要发送的数据
66
67 uchar dispbitcode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xBF,
-0x89,0x8C,0xC7};
68 //依次表示0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F,-,H,P,L
69
70
71 uint dispbuf;//
72
73 static uint idata band_rate[13]={20,40,50,80,100,125,200,250,400,500,666,800,1000};//用于显示选择的波特率
74
75
76 sbit P20=P2^0;//
77 sbit P14=P1^4;//
78 sbit P15=P1^5;//
79 sbit P17=P1^7;//
80 sbit ST=P3^0;//
81 sbit OE=P3^1;//
82 sbit EOC=P3^3;//
83 sbit CLK=P3^2;//??
84 sbit sja=P2^0;
85 sbit P32=P3^2;
86
87 /************************************************************************
88 *定义命令字 *
89 ************************************************************************/
90 #define TR_CMD 0x01 //发送请求命令
91 #define AT_CMD 0x02 //中止发送命令
92 #define RRB_CMD 0x04 //释放接收缓冲区
93 #define COS_CMD 0x08 //清除超载状态数据溢出
94 #define GTS_CMD 0x10 //进入休眠状态命令
95
96 /************************************************************************
97 *定义16M的晶体下,CAN总线波特率 *
98 ************************************************************************/
99 #define ByteRate_20k 0x00 //波特率20kbps
100 #define ByteRate_40k 0x01 //波特率40kbps
101 #define ByteRate_50k 0x02 //波特率50kbps
102 #define ByteRate_80k 0x03 //波特率80kbps
103 #define ByteRate_100k 0x04 //波特率100kbps
104 #define ByteRate_125k 0x05 //波特率125kbps
105 #define ByteRate_200k 0x06 //波特率200kbps
106 #define ByteRate_250k 0x07 //波特率250kbps
107 #define ByteRate_400k 0x08 //波特率400kbps
108 #define ByteRate_500k 0x09 //波特率500kbps
109 #define ByteRate_666k 0x0a //波特率666kbps
110 #define ByteRate_800k 0x0b //波特率800kbps
111 #define ByteRate_1000k 0x0c //波特率1000kbps
112
113 /*-------------------------------------------------------------------------------------------
114 * 以下为BASICCAN SJA1000的错误字 *
115 -------------------------------------------------------------------------------------------*/
116 #define CAN_INTERFACE_0K 0 /*SJA1000接口正常 */
C51 COMPILER V6.23a BASICCAN_FINAL1 09/20/2008 12:27:03 PAGE 3
117 #define CAN_BUS_0K 0 /*CAN总线工作正常 */
118 #define CAN_INTERFACE_ERR 0XFF /*SJA1000接口错误? */
119 #define CAN_ENTRESET_ERR 0XFE /*SJA1000不能进入复位模式 */
120 #define CAN_QUITRESET_ERR 0XFD /*SJA1000不能退出复位模式 */
121 #define CAN_INITOBJECT_ERR 0XFC /*初始化报文验收滤波器错 */
122 #define CAN_INITBTR_ERR 0XFB /*初始化总线波特率错 */
123 #define CAN_INITOUTCTL_ERR 0XFA /*初始化输出控制错误 */
124 #define CAN_INTCLKDIV_ERR 0XF9 /*初始化时钟分频控制器错 */
125 #define CAN_BUS_ERR 0XF8 /*SJA1000发送数据错 */
126
127
128 /************************************************************************
129 *以下为基本的函数说明(BasicCAN) *
130 ************************************************************************/
131
132 /************************************************************************
133 *函数原型: bit BCAN_CREATE_COMMUNATION(void) *
134 *参数说明: 无 *
135 *返回值: *
136 * 0 ; 表示SJA1000接口正常 *
137 * 1 ; 表示SJA1000与处理器接口不正常 *
138 * *
139 *说明:该函数用于检测CAN控制器的接口是否正常 *
140 ************************************************************************/
141 bit BCAN_CREATE_COMMUNATION(void)
142 {
143 1 SJA_BCANAdr=REG_TEST; //访问测试寄存器
144 1
145 1 *SJA_BCANAdr =0xaa; //写入测试值
146 1 if(*SJA_BCANAdr == 0xaa)
147 1 {
148 2 return 0; //读测试正确
149 2 }
150 1 else
151 1 {
152 2 return 1;
153 2 }
154 1 }
155
156 /************************************************************************
157 *函数原型: bit BCAN_ENTER_RETMODEL(void) *
158 *参数说明: 无 *
159 *返回值: *
160 * 0 ; 表示成功进入复位工作模式 *
161 * 1 ; 表示不能进入复位工作模式 *
162 * *
163 *说明: CAN控制器进入复位工作模式 *
164 ************************************************************************/
165 bit BCAN_ENTER_RETMODEL(void)
166 {
167 1 uchar TempData;
168 1 SJA_BCANAdr = REG_CONTROL; //访问地址指向控制寄存器
169 1 TempData= *SJA_BCANAdr; //保存原始值
170 1 *SJA_BCANAdr=(TempData|0x01); //置位复位请求
171 1 if((*SJA_BCANAdr&0x01) == 1)
172 1 {
173 2 return 0;
174 2 }
175 1 else
176 1 {
177 2 return 1;
178 2 }
C51 COMPILER V6.23a BASICCAN_FINAL1 09/20/2008 12:27:03 PAGE 4
179 1
180 1 }
181
182 /************************************************************************
183 *函数原型: bit BCAN_QUIT_RETMODEL(void) *
184 *参数说明: 无 *
185 *返回值: *
186 * 0 ; 表示成功退出复位工作模式 *
187 * 1 ; 表示不能退出复位工作模式 *
188 * *
189 *说明: CAN控制器退出复位工作模式 *
190 ************************************************************************/
191 bit BCAN_QUIT_RETMODEL(void)
192 {
193 1 uchar TempData;
194 1 SJA_BCANAdr = REG_CONTROL; //访问地址指向控制寄存器
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -