我用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,程序烧进去后,切换正常,满足设计要求。
但是不太明白这个板子哪里坏了。从板子上看不出哪里元器件 有问题。