关于CAN通信的一点疑问

2019-07-30 16:27发布

大家好,本人最近在学习DSP28335,在CAN通信时遇到了点问题,CAN 收发都调试成功了,但是总觉得程序不够完善,想请教下各位。

1、没有错误处理机制,所以我查了一些资料,现在加了个总线关闭时初始化ECan的操作,还没调试,不知道这样处理是否可行。另外想问下,还由其他必要的系统中断和邮箱中断要处理吗? 例如邮箱超时等。
Code :

  1. //系统中断
  2. interrupt void ECAN0INTA_ISR(void)  // eCAN-A
  3. {
  4.     struct ECAN_REGS ECanaShadow;

  5.     do{
  6.         ECanaShadow.CANGIF0.all=ECanaRegs.CANGIF0.all;
  7.     }while(ECanaShadow.CANGIF0.all & 0x3FF00 == 0x00000000);

  8.     //总线关闭
  9.     if(ECanaShadow.CANGIF0.bit.BOIF0==1){
  10.         InitECan();
  11.         Msg0x440.configMbx(&Msg0x440);
  12.         Msg0x100.configMbx(&Msg0x100);
  13.         Msg0x200.configMbx(&Msg0x200);
  14.     }

  15.     PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;
  16.     EINT;
  17.     // Next two lines for debug only to halt the processor here
  18.     // Remove after inserting ISR Code
  19.     //asm ("      ESTOP0");
  20.     //for(;;);
  21. }

  22. //邮箱中断:16号和17号邮箱接收
  23. interrupt void ECAN1INTA_ISR(void)  // eCAN-A
  24. {
  25.   // Insert ISR Code here
  26.     //If mailbox n contains a received message, bit RMP[n] of this register is set
  27.     struct ECAN_REGS ECanaShadow;

  28.     do{
  29.         ECanaShadow.CANRMP.all=ECanaRegs.CANRMP.all;
  30.     }while(ECanaShadow.CANRMP.all & 0xFFFF0000 == 0x00000000);


  31.     if(ECanaShadow.CANRMP.bit.RMP16==1){
  32.         ECanaRegs.CANRMP.all=0x00010000;

  33.         Msg0x100.BYTE[0]=ECanaMboxes.MBOX16.MDL.byte.BYTE0;
  34.         Msg0x100.BYTE[1]=ECanaMboxes.MBOX16.MDL.byte.BYTE1;
  35.         Msg0x100.BYTE[2]=ECanaMboxes.MBOX16.MDL.byte.BYTE2;
  36.         Msg0x100.BYTE[3]=ECanaMboxes.MBOX16.MDL.byte.BYTE3;
  37.         Msg0x100.BYTE[4]=ECanaMboxes.MBOX16.MDH.byte.BYTE4;
  38.         Msg0x100.BYTE[5]=ECanaMboxes.MBOX16.MDH.byte.BYTE5;
  39.         Msg0x100.BYTE[6]=ECanaMboxes.MBOX16.MDH.byte.BYTE6;
  40.         Msg0x100.BYTE[7]=ECanaMboxes.MBOX16.MDH.byte.BYTE7;
  41.     }

  42.     if(ECanaShadow.CANRMP.bit.RMP17==1){
  43.         ECanaRegs.CANRMP.all=0x00020000;

  44.         Msg0x200.BYTE[0]=ECanaMboxes.MBOX17.MDL.byte.BYTE0;
  45.         Msg0x200.BYTE[1]=ECanaMboxes.MBOX17.MDL.byte.BYTE1;
  46.         Msg0x200.BYTE[2]=ECanaMboxes.MBOX17.MDL.byte.BYTE2;
  47.         Msg0x200.BYTE[3]=ECanaMboxes.MBOX17.MDL.byte.BYTE3;
  48.         Msg0x200.BYTE[4]=ECanaMboxes.MBOX17.MDH.byte.BYTE4;
  49.         Msg0x200.BYTE[5]=ECanaMboxes.MBOX17.MDH.byte.BYTE5;
  50.         Msg0x200.BYTE[6]=ECanaMboxes.MBOX17.MDH.byte.BYTE6;
  51.         Msg0x200.BYTE[7]=ECanaMboxes.MBOX17.MDH.byte.BYTE7;
  52.     }

  53.   // To receive more interrupts from this PIE group, acknowledge this interrupt
  54.    PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;
  55.    EINT;
  56.   // Next two lines for debug only to halt the processor here
  57.   // Remove after inserting ISR Code
  58.   //asm ("      ESTOP0");
  59.   //for(;;);

  60. }
复制代码
2、CAN的断电模式是否只在器件要进入低功耗模式时用到?


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
小木欧尼
1楼-- · 2019-07-30 17:18
帮楼主顶啦
dsply1989
2楼-- · 2019-07-30 17:25
看你的需要了,复杂的接收中断,来接收数据
zhangmangui
3楼-- · 2019-07-30 21:10
一直没机会用过CAN总线   表示遗憾

一周热门 更多>