CAN的自测模式遇到的问题
void main(void){
Uint16 j;
/*初始化系统*/
InitSysCtrl();
/*关中断*/
DINT;
IER = 0x0000;
IFR = 0x0000;
/*初始化PIE中断*/
InitPieCtrl();
/*初始化PIE中断矢量表*/
InitPieVectTable();
/*初始化SCIA寄存器*/
InitECan();
MessageReceiveCount = 0;
ErrorCount = 0;
#if CAN_INT
/*设置中断服务程序入口地址*/
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.ECAN0INTA = &ECAN0INTA_ISR;
PieVectTable.ECAN1INTA = &ECAN1INTA_ISR;
EDIS; // This is needed to disable write to EALLOW protected registers
/*开中断*/
IER |= M_INT9;
#endif
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
for(;;)
{
ECanaRegs.CANTRS.all = 0x0000FFFF;
while(ECanaRegs.CANTA.all != 0x0000FFFF);
ECanaRegs.CANTA.all = 0x0000FFFF;
MessageReceiveCount++;
j=0;
j=1;
j=2;
for(j = 0; j < 0x1000; j++);
//#if !CAN_INT
//for(j = 0; j < 16; j++)
//{
// mailbox_read(j);
// mailbox_check(TestMbox1,TestMbox2,TestMbox3);
//}
//#endif
}
}
这是一个自测代码,邮箱运行在自测模式,邮箱0~15为发送,邮箱16~31为接收!邮箱发送完后将检测接收邮箱中的数据与发送邮箱中的数据是否一样,以判断接收的数据是否正确。
疑问:
1。在代码刚进去(刚执行,首次运行)时,邮箱中断进去了两次,第一次在执行while(ECanaRegs.CANTA.all != 0x0000FFFF)时进去一次(邮箱中断),第二次在执行完j=0后,进去第二次(邮箱中断)。执行完一次循环(for(;;)循环),在第二次以后的循环(for(;;)循环),在执行到while(ECanaRegs.CANTA.all != 0x0000FFFF)时不在进入中断(邮箱中断),只有在执行到j=0后,才进入中断(邮箱中断),想问,为什么第一次时进两次,之后又怎么又进次了???????
2。邮箱都是邮箱号最大的优先级最高(MSGCTRL。TPL都设置为0),但当我在邮箱中断里设置了一个断点,当代码运行到断点时,我发现CANTA.ALL=0X00004000,也就是首先发送出去的邮箱不是15号邮箱,而是14号邮箱,求解,为什么????
我这儿的程序你参考一下 can我具体也没玩过
zhangmangui 发表于 2013-5-30 18:38 static/image/common/back.gif
我这儿的程序你参考一下 can我具体也没玩过
非常感谢 tianwen_4524 发表于 2013-5-31 09:22 static/image/common/back.gif
非常感谢
不谢 仅供参考 谢谢版主,不过例子跟我的差不多,期待玩过CAN的解释,看来也自己也要多看看资料了
这是我的例子,大家有空帮研究研究我的问题????????
首先对于第二问题,我就觉得也是应该是15号邮箱先发送出去,这个问题可能因为仿真问题。
对于第一个问题,楼主的中断程序有点问题。不仅有发送中断而且有接收中断,每个邮箱都会产生中断,而且在自测模式,中断多而混乱,建议楼主只设置2个邮箱,一个发送一个接收。 非常感谢,我试了确实有一个是接收的中断,我将接收的中断屏蔽了,中断就只进去一次了!
对于为什么是邮箱14最先发送,我试了,我将邮箱14的中断屏蔽了,一试,结果也不是邮箱15最优先发送,而是邮箱13,就如上楼所说,是不是可能仿真的问题,但我也怀疑是不是我运行的是自测模式的问题,因为我只有一块板,无法进行其它的试验!有熟悉的CAN的说说,非常感谢!!!!!
页:
[1]