📄 can_sja1000.lst
字号:
C51 COMPILER V7.06 CAN_SJA1000 04/30/2008 15:04:53 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE CAN_SJA1000
OBJECT MODULE PLACED IN Can_Sja1000.OBJ
COMPILER INVOKED BY: D:\software\keil-C51编译软件\C51\BIN\C51.EXE Can_Sja1000.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include<REG52.h>
2 #include<absacc.h>
3 #include<intrins.h>
4 #include"SJA1000_Def.h"
5
6
7 //控制器STC89C52RC 特殊功能寄存器说明
8 sbit Int0 = 0xB2;
9 sbit P2_7 = P2^7;
10 //控制器STC89C52RC CAN 控制器SJA1000
11 #define CS_SJA1000 P2_7 //SJA1000 的片选
12 #define SJAIntInp Int0 //SJA1000 的外部中断0
13 #define SAJIntEn EX0 //外部中断0 使能标志
14
15 sbit LED_RED = P2^1;
16 sbit LED_GRE = P2^2; //LED
17 sbit SJA_RST = P2^3; //SJA1000复位管脚
18 sbit SJA_CS = P2^0; //SJA1000片选管脚
19
20 //---------------------------------------------------------------
21 //数码管显示数据
22 unsigned char Seg_Led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92, // 0, 1, 2, 3, 4, 5
23 0x82,0xf8,0x80,0x90,0xff}; // 6, 7, 8, 9, off
24
25 //---------------------------------------------------------------
26 //全局变量声明
27 bit RXD_Cflag = 0; // CAN有无数据接收; 0无 ,1有
28 bit TXD_Cflag = 0; // CAN有无数据需要发送; 0无 ,1有
29 unsigned char xdata Can_TxBuf[15]={0};//CAN(SJA1000)发送缓冲区
30 unsigned char xdata Can_RxBuf[15]={0};//CAN(SJA1000)接收缓冲区
31
32 unsigned char Show_rx_data = 0x00;//显示接收到的数据在数码管3-4
33 unsigned char Show_tx_data = 0x00;//显示发送到的数据在数码管1-2
34
35 unsigned char Txd_Cdata = 0x00;//CAN总线要发送的数据
36 unsigned char Rxd_Cdata = 0x00;//CAN总线要接收的数据
37
38
39 //---------------------------------------------------------------
40 //函数声明
41 void SJA1000_Init(void); // 初始化CAN总线芯片
42 void PeliCanTxMes(void); // CAN发送子函数
43 void Rxd_deal(void); // 接收处理函数
44 void Txd_deal(void); // 发送处理函数
45 void Delay(unsigned char delay_time);
46 void led_seg7(unsigned char from,unsigned char number);//显示子函数
47
48
49 //---------------------------------------------------------------
50 //SJA1000外部中断函数
51 void SJA1000_IRQ(void) interrupt 0 using 2
52 {
53 1 unsigned char temp;
54 1 EA=0; //关总中断
55 1
C51 COMPILER V7.06 CAN_SJA1000 04/30/2008 15:04:53 PAGE 2
56 1 CANInterrupt = InterruptReg;//将中断寄存器值附给位存储区变量
57 1
58 1 //----------------------------------------
59 1 //接受中断处理
60 1 if(RI_BitVar)
61 1 {
62 2 Can_RxBuf[0] = RxFramInFo;
63 2 Can_RxBuf[1] = RxBuffer1;
64 2 Can_RxBuf[2] = RxBuffer2;
65 2 Can_RxBuf[3] = RxBuffer3;
66 2 Can_RxBuf[4] = RxBuffer4;
67 2 Can_RxBuf[5] = RxBuffer5;
68 2 Can_RxBuf[6] = RxBuffer6;
69 2 Can_RxBuf[7] = RxBuffer7;
70 2 Can_RxBuf[8] = RxBuffer8;
71 2 Can_RxBuf[9] = RxBuffer9;
72 2 Can_RxBuf[10] = RxBuffer10;
73 2 Can_RxBuf[11] = RxBuffer11;
74 2 Can_RxBuf[12] = RxBuffer12;
75 2 RXD_Cflag = 1;//置有接收标志
76 2 CommandReg = CommandReg|CDO_Bit;//清除数据超载位
77 2 temp = ArbLostCapReg;//释放仲裁丢失捕捉寄存器
78 2 temp = ErrCodeCapReg;//释放错误代码捕捉寄存器
79 2 }
80 1 //----------------------------------------
81 1 //发送中断处理
82 1 if(TI_BitVar)
83 1 {
84 2
85 2 }
86 1 //----------------------------------------
87 1 //错误报警中断处理
88 1 if(EI_BitVar)
89 1 {
90 2
91 2 }
92 1 //----------------------------------------
93 1 //数据溢出中断处理
94 1 if(DOI_BitVar)
95 1 {
96 2
97 2 }
98 1 //----------------------------------------
99 1 //唤醒中断处理
100 1 if(WUI_BitVar)
101 1 {
102 2
103 2 }
104 1 //----------------------------------------
105 1 //错误消极中断处理
106 1 if(EPI_BitVar)
107 1 {
108 2
109 2 }
110 1 //----------------------------------------
111 1 //仲裁丢失中断处理
112 1 if(ALI_BitVar)
113 1 {
114 2
115 2 }
116 1 //----------------------------------------
117 1 //总线错误中断处理
C51 COMPILER V7.06 CAN_SJA1000 04/30/2008 15:04:53 PAGE 3
118 1 if(BEI_BitVar)
119 1 {
120 2
121 2 }
122 1
123 1 EA = 1;//开总中断
124 1 }
125
126 //----------------------------------------------------------------
127 //外部中断0(启动数据发送)
128 void INT0_Counter( void ) interrupt 0 using 1
129 {//INT0按键为计数按键
130 1 if(Show_tx_data++>99) //存储计数结果,并为待发送的数据
131 1 Show_tx_data=0;
132 1 TXD_Cflag = 1; //CAN总线要发送数据标志位
133 1 Txd_Cdata = Show_tx_data;//CAN总线要发送的数据
134 1 }
135
136 //-----------------------------------------------------------------
137 //主函数体
138 void main(void)
139 {
140 1 //CPU初始化
141 1 SJA_RST = 1;//CAN总线复位管脚
142 1 SJA_CS = 0; //CAN总线片选有效
143 1
144 1 SCON = 0x50; //串口方式1
145 1 PCON = 0x80; //串口波特率加速
146 1 TMOD = 0x21;
147 1 TH1=0xFD; //19200bps
148 1 TL1=0xFD;
149 1 TR1 = 0;
150 1 TI = 0;
151 1 RI = 0;
152 1 ES = 1;//打开串口中断
153 1
154 1 EX1 = 1;
155 1 IT1 = 0;//CAN总线接收中断
156 1 IT0 = 1;//外部中断0负边沿触发
157 1 EX0 = 1;//打开外部中断0
158 1 EA = 1; //打开总中断
159 1 SJA_CS = 1;//CAN总线片选无效
160 1
161 1 SJA1000_Init();
162 1 _nop_();
163 1 _nop_();
164 1
165 1 while(1)
166 1 {
167 2 Rxd_deal();//接收处理程序
168 2 Txd_deal();//发送处理程序
169 2 led_seg7(1,Show_tx_data);
170 2 led_seg7(3,Show_rx_data);
171 2 }
172 1 }
173
174
175 //-----------------------------------------------------------------
176 //函数部分
177 /*----------------- SJA1000 初始化 --------------------*/
178 void SJA1000_Init(void)
179 {
C51 COMPILER V7.06 CAN_SJA1000 04/30/2008 15:04:53 PAGE 4
180 1 //定义中断优先级和控制电平激活
181 1 PX0=PRIORITY_HIGH; //设CAN 有一个高优先级中断
182 1 IT0=INTLEVELACT; //中断0为电平激活
183 1 //使能SJA1000 的通讯接口
184 1 CS_SJA1000=ENABLE_N; //SJA1000 接口使能
185 1 //通讯连接的定义结束
186 1 //初始化SJA1000 的所有内部寄存器因为一些寄存器在仅复位模式期间可被写所以在写入
187 1 //之前必须检查上电后SJA1000 被设定为复位模式如果复位模式已被置位在循环里面可以检查到
188 1 //中断禁能如果使用上电后不需要
189 1 EA=DISABLE; //所有中断禁能
190 1 SAJIntEn=DISABLE; //来自SJA100 的外部中断禁能
191 1 //设定复位模式/请求位在上电后SJA1000 处于BasicCAN 模式
192 1 //在超时和出现错误信号后跳出循环
193 1 while((ModeControlReg & RM_RR_Bit)==ClrByte)
194 1 {
195 2 //其他位而不是复位模式/请求位没有改变
196 2 ModeControlReg = ModeControlReg|RM_RR_Bit;
197 2 }
198 1 //硬件设定时钟分频寄存器
199 1 //选择PeliCAN 模式
200 1 //旁路CAN 输入比较器作为外部收发器使用
201 1
202 1 //配置时钟分频寄存器
203 1 ClockDivideReg = CANMode_Bit|CBP_Bit|DivBy2;
204 1
205 1 //配置模式寄存器
206 1 ModeControlReg = ModeControlReg|AFM_Bit;
207 1
208 1 //写SJA1000 中断使能/控制寄存器
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -