📄 can_sja1000.lst
字号:
209 1 InterruptEnReg = ClrIntEnSJA;
210 1 //定义验收代码和屏蔽
211 1 AcceptCode0Reg = ClrByte;
212 1 AcceptCode1Reg = ClrByte;
213 1 AcceptCode2Reg = ClrByte;
214 1 AcceptCode3Reg = ClrByte;
215 1 AccepMask0Reg = DontCare; //接收任何标识符
216 1 AccepMask0Reg = DontCare; //接收任何标识符
217 1 AccepMask0Reg = DontCare; //接收任何标识符
218 1 AccepMask0Reg = DontCare; //接收任何标识符
219 1
220 1 //配置总线定时
221 1 //位频率1Mbit/s@24MHz 总线被采样一次
222 1 BusTiming0Reg = SJW_kB_16|Prec_kB_16;
223 1 BusTiming1Reg = TSEG2_kB_16|TSEG1_kB_16;
224 1 //配置CAN 输出TX1 悬空TX0 推挽
225 1 //正常输出模式
226 1 OutControlReg = Tx1Float|Tx0PshPull|NormalMode;
227 1 //离开复位模式/请求也就是转向操作模式
228 1 //STC89C52RC 的中断使能
229 1 //但SJA1000 的CAN 中断禁能这可以在一个系统里面分别完成
230 1 //清除复位模式位选择单验收滤波器模式
231 1 //关闭自我测试模式和仅听模式
232 1 //清除休眠模式唤醒
233 1 //等待直到RM_RR_Bit 清零
234 1 //在超时和出现错误后跳出循环
235 1 do
236 1 {
237 2 ModeControlReg = ClrByte;
238 2 }while((ModeControlReg&RM_RR_Bit) != ClrByte);
239 1
240 1 SAJIntEn = ENABLE; //SJA1000 的外部中断使能
241 1 EA = ENABLE; //所有中断使能
C51 COMPILER V7.06 CAN_SJA1000 04/30/2008 15:04:53 PAGE 5
242 1 }
243 /*------------------ SJA1000 初始化结束 -----------------*/
244
245
246
247 /*-----------------Peli CAN Send Message-----------------*/
248 void PeliCanTxMes(void)
249 {
250 1 //if()//扩展侦格式
251 1 //{
252 1 //等待直到发送缓冲器被释放
253 1 do
254 1 {
255 2 //等待时启动查询定时器并运行一些任务
256 2 //在超时和出现错误后跳出循环
257 2 ;
258 2 }while((StatusReg & TBS_Bit) != TBS_Bit);
259 1 //释放发送缓冲器信息可写入缓冲器
260 1 //在这个例子里会发送一个标准帧信息
261 1 TxFramInFo = 0x88; //EFF(data) DLC8
262 1 TxBuffer1 = 0xA5; //标识符1 A5 1010 0101
263 1 TxBuffer2 = 0x20; //标识符2 20 0010 0000
264 1 TxBuffer3 = 0xA5; //标识符1 A5 1010 0101
265 1 TxBuffer4 = 0x20; //标识符2 20 0010 0000
266 1 TxBuffer5 = 0x51; //data1 =51
267 1 TxBuffer6 = 0x52; //data1 =52
268 1 TxBuffer7 = 0x53; //data1 =53
269 1 TxBuffer8 = 0x54; //data1 =54
270 1 TxBuffer9 = 0x55; //data1 =55
271 1 TxBuffer10 = 0x56; //data1 =56
272 1 TxBuffer11 = 0x57; //data1 =57
273 1 TxBuffer12 = 0x58; //data8 =58
274 1 //启动发送
275 1 CommandReg = TR_Bit; //置位发送请求位
276 1 //}
277 1 //else//标准侦格式
278 1 //{
279 1 //等待直到发送缓冲器被释放
280 1 // Do
281 1 // {
282 1 //等待时启动查询定时器并运行一些任务
283 1 //在超时和出现错误后跳出循环
284 1 ;
285 1 // }while((statusReg & TBS_Bit) != TBS_Bit)
286 1 //释放发送缓冲器信息可写入缓冲器
287 1 //在这个例子里会发送一个标准帧信息
288 1 // TxFrameInfo = 0x08; //SFF(data) DLC8
289 1 // TxBuffer1 = 0xA5; //标识符1 A5 1010 0101
290 1 // TxBuffer2 = 0x20; //标识符2 20 0010 0000
291 1 // TxBuffer3 = 0x51; //data1 =51
292 1 // TxBuffer4 = 0x52; //data2 =52
293 1 // TxBuffer5 = 0x53; //data3 =53
294 1 // TxBuffer6 = 0x54; //data4 =54
295 1 // TxBuffer7 = 0x55; //data5 =55
296 1 // TxBuffer8 = 0x56; //data6 =56
297 1 // TxBuffer9 = 0x57; //data7 =57
298 1 // TxBuffer10 = 0x58; //data8 =58
299 1 //启动发送
300 1 // CommandReg = TR_Bit; //置位发送请求位
301 1 //}
302 1 }
303 /*--------------------Peli CAN send Message End------------------*/
C51 COMPILER V7.06 CAN_SJA1000 04/30/2008 15:04:53 PAGE 6
304
305
306 /*---------------------------------------------------------------
307 //采用查询的方式接受
308 void PeliCanRxMes(void)
309 {
310 InterruptEnReg RIE_Bit//接收中断使能
311
312 if()//扩展贞格式
313 {
314 //从SJA1000 读中断寄存器的内容并临时保存所有中断标志被清除在PeliCAN 模式里
315 //接收中断RI 被首先清除当给出释放缓冲器命令时
316
317 CANInterrupt = InterruptReg
318 //检查接收中断和读一个或所有接收到的信息
319 iI( RI_VarBit) YES //检测到接收中断
320 {
321 //从SJA1000 得到接收缓冲器的内容并将它存入控制器的内部存储器
322 //可以立刻对帧信息和数据长度代码解码并适当地取出
323 //释放接收缓冲器接收中断标志被清除新的信息将产生一个新中断
324 ommandReg RRB_Bit //释放接收缓冲器
325 }
326 }
327 else//标准贞格式
328 {
329 //从SJA1000 读中断寄存器的内容并临时保存所有中断标志被清除在PeliCAN 模式里
330 //接收中断RI 被首先清除当给出释放缓冲器命令时
331
332 CANInterrupt = InterruptReg
333 //检查接收中断和读一个或所有接收到的信息
334 If (RI_VarBit YES) //检测到接收中断
335 {
336 //从SJA1000 得到接收缓冲器的内容并将它存入控制器的内部存储器
337 //可以立刻对帧信息和数据长度代码解码并适当地取出
338 //释放接收缓冲器接收中断标志被清除新的信息将产生一个新中断
339 CommandReg RRB_Bit //释放接收缓冲器
340 }
341 }
342 }*/
343
344 //------------------------------------------------------------------------
345 //接收处理程序
346 void Rxd_deal(void)
347 {
348 1 if( RXD_Cflag )
349 1 {//如果CAN总线收到数据,数码管3-4显示,RS232将收到的数据发送给PC机
350 2 RXD_Cflag = 0;
351 2 Rxd_Cdata = Can_RxBuf[5];
352 2 Show_rx_data = Rxd_Cdata;//
353 2 }
354 1 }
355
356 //-------------------------------------------------------------------------
357 //发送处理函数,主要是准备数据,并且调用发送函数
358 void Txd_deal(void)
359 {
360 1 if( TXD_Cflag == 1 )
361 1 {
362 2 TXD_Cflag = 0;
363 2 Can_TxBuf[5] = Txd_Cdata;
364 2 PeliCanTxMes();
365 2 }
C51 COMPILER V7.06 CAN_SJA1000 04/30/2008 15:04:53 PAGE 7
366 1 }
367
368
369 //----------------------------------------------------------------------------
370 //from(1_4):数码管显示起始位置(从右到左),number:显示的数
371 void led_seg7(unsigned char from,unsigned char number)
372 {
373 1 unsigned char digit,temp_l;
374 1 unsigned char temp_h=0x7f;
375 1 temp_h = _cror_(temp_h,from-1); //确定从哪一位开始显示,即确定高四位
376 1 temp_h = temp_h & 0xf0; //取高四位
377 1 temp_l = P2 & 0x0f; //取P2的低四位
378 1 P2 = temp_h | temp_l; //设定P2口
379 1
380 1 if(number==0)
381 1 {
382 2 P0 = Seg_Led[0];
383 2 Delay(5);
384 2 P0 = 0xff;
385 2 }
386 1 else
387 1 {
388 2 while(number)
389 2 {
390 3 digit = number%10 ;
391 3 number /= 10;
392 3 P0 = Seg_Led[digit] ;
393 3 Delay(5);
394 3 temp_h = P2 & 0xf0; //取P2的高四位
395 3 temp_h = temp_h | 0x0f; //拼装 temp_h,进行位选
396 3 temp_h = _cror_(temp_h,1);
397 3 temp_h = temp_h & 0xf0; //取高四位
398 3 temp_l = P2 & 0x0f; //取P2的低四位
399 3 P0 = 0xff;
400 3 P2 = temp_h | temp_l; //设定P2口
401 3 }//while结束
402 2 }//else结束
403 1 }
404
405 void Delay(unsigned char delay_time)
406 {//延时程序
407 1 while(delay_time--)
408 1 {;}
409 1 }
*** WARNING C316 IN LINE 409 OF Can_Sja1000.c: unterminated conditionals
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 960 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 30 ----
PDATA SIZE = ---- ----
DATA SIZE = 16 4
IDATA SIZE = ---- ----
BIT SIZE = 2 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -