我用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;
}
}

