TI中文支持网
TI专业的中文技术问题搜集分享网站

CAN通信问题

我用RM48芯片做的双机热备结构系统如图所示。

处理单元A和B都留有SCI口输出,输出的数据和通过CAN2(或CAN3)发送的数据相同。

管理板是 定时器中断发送CAN1,处理单元是用定时器中断发送CAN2或 CAN3

 

CAN通信都采用接收中断函数。

 

处理单元A的LEDA表示CAN1接收,LEDB表示CAN2发送

处理单元B的LEDA表示CAN1接收,LEDB表示CAN3发送

 管理单元LEDA闪灯表示处理单元A作为控制输出;LEDB闪灯表示处理单元B作为控制输出;

 

调试现象:

1        JTAG接到管理单元

此时,三个电路板的工作都正常,符合设计;

切断处理单元A的电源后,处理单元B现象为:LEDA和LEDB都灭灯,sci串口无输出。管理单元现象为:LEDA和LEDB都灭灯,sci串口发送“AB is wg”,说明执行了程序中的msg4counter==0&&msg6counter==0。在管理单元的rti定时器中断函数中,执行了CAN1的发送函数,但是该函数返回值success=0;这说明没有发送成功。处理单元接收不到CAN1总线的消息,所以也就不通过CAN2(或CAN3)发送数据,所以,管理单元的msg4counter==0,msg6counter==0。

 

确定问题在管理单元的发送函数canTransmit(canREG1, canMESSAGE_BOX5, tx_data);

三个电路板的连接方式如图所示。当它们都连接好后,运行时是正常的;如果只切断处理单元B的电源后,运行也是正常的;但是只切断处理单元A的电源,出现停机现象。(默认的是处理单元A的优先级高)

 

为何这个CAN1发送函数会出现这种情况呢?

 

管理单元的定时器中断函数如下

void rtiNotification(uint32 notification)

{

  uint32_t flag2_3 = 2;

 

  if( ++rtiCounter10ms % 20 == 0 ) // 200 ms period

  {

    if( msg2counter > 0 || msg3counter > 0)   //Init: at least one board is ok

    {

      flag2_3=2;

      msg2counter=0;

      msg3counter=0;

    }

  

    canTransmit(canREG1, canMESSAGE_BOX5, tx_data); // TX: can1

               

    if( msg4counter == 0 && msg6counter == 0 )   // both are wrong   

    {

      flag2_3=0;

    }

   

    if(msg4counter > 0 && flag2_3==2 )  // boad A is worker

    {       

      sendBytes( A_ok_data, 8);   //A  board data

      LED_Toggle();

    }

    if(msg4counter == 0 && msg6counter > 0 && flag2_3==2 )  // boad B is  worker

    {    

      sendBytes( B_ok_data, 8);   //B  board data 

      LEDB_Toggle();

    }

    if(msg4counter == 0 && msg6counter == 0)  // no recive in can2 and  can3

    {    

      sendBytes(AB_wrong_data, 8);

      LED_OFF();

      LEDB_OFF();

    }

    msg4counter=0;

    msg6counter=0;

   

  }

}

Jay:

Hi ml0943,

处理单元A断电后,请按下面步骤进行调试。

1. JTAG接上后,确定管理单元程序没有Halt,还是在运行。

2. 检查RTI中断是否正常进入。

3. 检查CAN1总线上是否真的发送信号,用示波器观察。如果没有,检查CAN1状态寄存器,看是否有错误。

4. 检查处理单元B的CAN1接收邮箱是否有收到管理单元发送的报文。

Regards,

Jay

ml0943:

回复 Jay:

测试回答:

处理单元A断电后,

1.  JTAG接上后,管理单元还在运行,还能够进入RTI中断函数,但是不能进入canmessagenotification函数;

2. JTAG接上后,管理单元没有停止,还能够进入RTI中断函数;

3. 示波器接到CAN1的CANH 和CANL端,由于采用的是在200ms的定时器中断函数中CAN1发送,所以,多次扫描后,还能观察到方波信号,如图所示

4. JTAG接到处理单元B后,在canmessagenotification函数里设置断点,程序运行,不能进入该中断函数。

ml0943:

回复 Jay:

你好,我写了个简单的程序,实现管理单元CAN1 MESSAGEBOX1发送,发送成功则闪灯

处理单元A采用中断接收,处理单元B也采用接收中断。每次接收到数据,则闪灯。

处理单元B断电后,处理单元A能接收到数据,闪灯;

处理单元A断电后,处理单元B灭灯,管理单元灭灯,但是示波器测CAN1的引脚,能收到方波信号。

ml0943:

回复 Jay:

你好,问题解决了,我找了个板子替换了处理单元A,程序烧进去后,切换正常,满足设计要求。

但是不太明白这个板子哪里坏了。从板子上看不出哪里元器件 有问题。

赞(0)
未经允许不得转载:TI中文支持网 » CAN通信问题
分享到: 更多 (0)