📄 basiccan_final1.lst
字号:
397 2 return 1;
398 2 }
399 1
400 1 SJA_BCANAdr = REG_RxBuffer2; //访问地址指向接收缓冲区2
401 1 if((*SJA_BCANAdr&0x10)==0) //如果是数据帧
402 1 {
403 2 TempCount=(*SJA_BCANAdr&0x0f)+2; //计算报文中数据的个数
404 2 }
405 1
406 1 else
407 1 {
408 2 TempCount=2;
409 2 }
410 1 SJA_BCANAdr = REG_RxBuffer1; //访问地址指向接收缓冲区1
411 1 memcpy(RcvDataBuf,SJA_BCANAdr,TempCount);//读取接收缓冲区的报文
412 1 return 0;
413 1 }
414
415
416
417 /************************************************************************
418 *函数原型: bit BCAN_CMD_PRG(uchar cmd) *
419 *参数说明: cmd:sja1000运行的命令字 *
420 * 01:发送请求 *
421 * 02:中止发送 *
422 * 04:释放接收缓冲区 *
423 * 08:清除超载状态 *
424 * 0x10:进入睡眠状态 *
C51 COMPILER V6.23a BASICCAN_FINAL1 09/20/2008 12:27:03 PAGE 8
425 * *
426 *返回值: *
427 * 0 ; 表示命令执行成功 *
428 * 1 ; 表示命令执行失败 *
429 * *
430 *说明: 执行sja1000命令 *
431 ************************************************************************/
432
433 bit BCAN_CMD_PRG(uchar cmd)
434 {
435 1 SJA_BCANAdr=REG_COMMAND; //访问地址指向命令寄存器
436 1 *SJA_BCANAdr=cmd; //启动命令字
437 1 switch(cmd)
438 1 {
439 2 case TR_CMD: //发送请求命令
440 2 return 0;
441 2 break;
442 2 case AT_CMD: //夭折发送命令
443 2 SJA_BCANAdr = REG_STATUS; //访问地址指向状态寄存器
444 2 if((*SJA_BCANAdr & 0x20)==0)//判断是否正在发送
445 2 {
446 3 return 0;
447 3 }
448 2 else
449 2 {
450 3 return 1;
451 3 }
452 2 break;
453 2 case RRB_CMD: //释放接收缓冲区
454 2 SJA_BCANAdr = REG_STATUS; //访问地址指向状态寄存器
455 2 if((*SJA_BCANAdr & 0x01)==1)//判断是否释放成功
456 2 {
457 3 return 1;
458 3 }
459 2 else
460 2 {
461 3 return 0;
462 3 }
463 2 break;
464 2
465 2 case COS_CMD: //清除超载状态
466 2 SJA_BCANAdr = REG_STATUS; //访问地址指向状态寄存器
467 2 if((*SJA_BCANAdr & 0x02)==0)//判断清除超载是否成功
468 2 {
469 3 return 0;
470 3 }
471 2 else
472 2 {
473 3 return 1;
474 3 }
475 2 break;
476 2
477 2 case GTS_CMD: //进入睡眠状态命令
478 2 return 0;
479 2 break;
480 2 default:
481 2 return 1;
482 2 break;
483 2 }
484 1
485 1 }
486
C51 COMPILER V6.23a BASICCAN_FINAL1 09/20/2008 12:27:03 PAGE 9
487 void delay(unsigned int i)
488 {
489 1 unsigned int j;
490 1 for(;i>0;i--)
491 1 for(j=0;j<125;j++);
492 1 }
493
494
495 void display(uint something)
496 {
497 1 uchar gewei,shiwei,baiwei,qianwei;
498 1
499 1 EA=0;
500 1
501 1 gewei=something%10;
502 1 shiwei=something/10%10;
503 1 baiwei=something/100%10;
504 1 qianwei=something/1000%10;
505 1
506 1 if(qianwei!=0)
507 1 {
508 2 P14=0;
509 2 P15=0;
510 2 P17=1;
511 2 P0=~dispbitcode[qianwei];
512 2 P17=0;
513 2 delay(5);
514 2 }
515 1
516 1 if((baiwei!=0)|((baiwei==0)&(qianwei!=0)))
517 1 {
518 2 P14=1;
519 2 P15=0;
520 2 P17=1;
521 2 P0=~dispbitcode[baiwei];
522 2 P17=0;
523 2 delay(5);
524 2 }
525 1
526 1 if((shiwei!=0)|((shiwei==0)&((qianwei!=0)|(baiwei!=0))))
527 1 {
528 2 P14=0;
529 2 P15=1;
530 2 P17=1;
531 2 P0=~dispbitcode[shiwei];
532 2 P17=0;
533 2 delay(5);
534 2 }
535 1
536 1 P14=1;
537 1 P15=1;
538 1 P17=1;
539 1 P0=~dispbitcode[gewei];
540 1 P17=0;
541 1 delay(5);
542 1
543 1 EA=1;
544 1 }
545
546
547 /*void u2_to_u10(uchar change_data)
548 {
C51 COMPILER V6.23a BASICCAN_FINAL1 09/20/2008 12:27:03 PAGE 10
549 dispbuf[3]=change_data/1000;//将change_data的个位,十位,百位,千位分别存放在SetSystemBuf中
550 change_data=change_data%1000;
551 dispbuf[2]=change_data/100;
552 change_data=change_data%100;
553 dispbuf[1]=change_data/10;
554 dispbuf[0]=change_data%10;
555 }*/
556
557 //初始化SJA_1000,设置相关参数
558 uchar SJA_1000_Init(void)
559 {
560 1 uchar data status=0;
561 1 delay(10);
562 1
563 1 BandRateBuf = ByteRate_1000k;//默认波特率为1000k
564 1
565 1 BCAN_ENTER_RETMODEL();//使CAN控制器进入复位工作模式
566 1
567 1 if(BCAN_CREATE_COMMUNATION())//检测CAN控制器的接口是否正常,若返回1,则不正常
568 1 {
569 2 status = CAN_INTERFACE_ERR;
570 2 return(status);
571 2 }
572 1
573 1 if(BCAN_SET_BANDRATE(BandRateBuf))//初始化系统默认值波特率1000kbps,若返回1,表示波特率未能设置
574 1 {
575 2 status=CAN_INITBTR_ERR;
576 2 return(status);
577 2 }
578 1
579 1 if(BCAN_SET_OBJECT(0xaa,0xff))//设置检收代码寄存器(ACR)、接收屏蔽寄存器(AMR)的参数
580 1 //0xff表示检收代码寄存器所有的位对检收滤波器是“无关的”
581 1 {
582 2 status =CAN_INITOBJECT_ERR;
583 2 return(status);
584 2 }
585 1
586 1 //输出控制寄存器OCR=0xaa表示采用正常输出模式,TX1悬空,时钟分频寄存器CDR=0x48表示采用BasicCAN模式,CBP被
-置位,
587 1 //只有RX0起作用。CLOCK OFF置1使外部CLKOUT引脚失效
588 1 if(BCAN_SET_OUTCLK(0xaa,0x48))//设置SJA1000的输出模式和时钟分频
589 1 {
590 2 status =CAN_INITOUTCTL_ERR;
591 2 return(status);
592 2 }
593 1
594 1 if(BCAN_QUIT_RETMODEL())//使CAN控制器退出复位工作模式
595 1 {
596 2 status = CAN_QUITRESET_ERR;
597 2 return(status);
598 2 }
599 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -