我打算做28335 对外实现双CAN 通信,那问题来了?
当我打算进行CAN 发送的时候,通过
while((ECanaRegs.CANTA.all ) != ulCANTRS)
来等待传输完成,如果对外CAN 设备连接良好,当然没有问题,软件不会始终停留在While 循环;
如果我已经发起了一次传输,这个时候我把外部CAN 设备给停掉或是拔掉,那这个While 循环始终跳不出去,即使我改成如下代码形式,
且if(g_CtrlInfo.us_EnableCANA == DISABLE_CANA) //CAN is disable 这个if 分支会满足,While 循环也退不出去;
这是为什么呢? 难道CAN 设备不在了,ECanaRegs.CANTA.all 这个寄存器都不能读?
我该怎么办呢?
while((ECanaRegs.CANTA.all ) != ulCANTRS)
{
//asm (" nop");
if(g_CtrlInfo.us_EnableCANA == DISABLE_CANA) //CAN is disable
{
//break;
ulCANTRS = 0;
}
}
Seven Han:
请查看CANTA寄存器描述,是邮箱信息发送成功响应位会置位,所以需要确保硬件连接无误。
我打算做28335 对外实现双CAN 通信,那问题来了?
当我打算进行CAN 发送的时候,通过
while((ECanaRegs.CANTA.all ) != ulCANTRS)
来等待传输完成,如果对外CAN 设备连接良好,当然没有问题,软件不会始终停留在While 循环;
如果我已经发起了一次传输,这个时候我把外部CAN 设备给停掉或是拔掉,那这个While 循环始终跳不出去,即使我改成如下代码形式,
且if(g_CtrlInfo.us_EnableCANA == DISABLE_CANA) //CAN is disable 这个if 分支会满足,While 循环也退不出去;
这是为什么呢? 难道CAN 设备不在了,ECanaRegs.CANTA.all 这个寄存器都不能读?
我该怎么办呢?
while((ECanaRegs.CANTA.all ) != ulCANTRS)
{
//asm (" nop");
if(g_CtrlInfo.us_EnableCANA == DISABLE_CANA) //CAN is disable
{
//break;
ulCANTRS = 0;
}
}
Xiaohuang Li:
回复 Seven Han:
谢谢,是的,那是硬件行为,
但为啥软件不能直接退出呢,也就是软件我不管你是否发送成功,都强制返回,怎么不行呢?
我打算做28335 对外实现双CAN 通信,那问题来了?
当我打算进行CAN 发送的时候,通过
while((ECanaRegs.CANTA.all ) != ulCANTRS)
来等待传输完成,如果对外CAN 设备连接良好,当然没有问题,软件不会始终停留在While 循环;
如果我已经发起了一次传输,这个时候我把外部CAN 设备给停掉或是拔掉,那这个While 循环始终跳不出去,即使我改成如下代码形式,
且if(g_CtrlInfo.us_EnableCANA == DISABLE_CANA) //CAN is disable 这个if 分支会满足,While 循环也退不出去;
这是为什么呢? 难道CAN 设备不在了,ECanaRegs.CANTA.all 这个寄存器都不能读?
我该怎么办呢?
while((ECanaRegs.CANTA.all ) != ulCANTRS)
{
//asm (" nop");
if(g_CtrlInfo.us_EnableCANA == DISABLE_CANA) //CAN is disable
{
//break;
ulCANTRS = 0;
}
}
Jun Zhang10:
回复 Xiaohuang Li:
既然你要直接退出,又何必while? 置发送标志位就可以走人了。
我打算做28335 对外实现双CAN 通信,那问题来了?
当我打算进行CAN 发送的时候,通过
while((ECanaRegs.CANTA.all ) != ulCANTRS)
来等待传输完成,如果对外CAN 设备连接良好,当然没有问题,软件不会始终停留在While 循环;
如果我已经发起了一次传输,这个时候我把外部CAN 设备给停掉或是拔掉,那这个While 循环始终跳不出去,即使我改成如下代码形式,
且if(g_CtrlInfo.us_EnableCANA == DISABLE_CANA) //CAN is disable 这个if 分支会满足,While 循环也退不出去;
这是为什么呢? 难道CAN 设备不在了,ECanaRegs.CANTA.all 这个寄存器都不能读?
我该怎么办呢?
while((ECanaRegs.CANTA.all ) != ulCANTRS)
{
//asm (" nop");
if(g_CtrlInfo.us_EnableCANA == DISABLE_CANA) //CAN is disable
{
//break;
ulCANTRS = 0;
}
}
Xiaohuang Li:
回复 Jun Zhang10:
CANTA 只能CPU 置位, 如果人为置位的话,其实是清0 的意思;
while((ECanaRegs.CANTA.all ) != ulCANTRS) // 老是卡在这一句; { //asm (" nop"); if(g_CtrlInfo.us_EnableCANA == DISABLE_CANA) //CAN is disable, 即使这个标志位已经置成Disable,也退不出来!! { //break; ulCANTRS = 0; } }
突然想到一个问题, 由于我使用的双CAN,即两个CAN 本来都在发送的,突然撤掉一个CAN ,那这路CAN岂不是挂死了?
这样另一路CAN 也不能工作,可能28335 里面两路CAN 发送是公用的吧?
难道CAN 尝试是无限次的? 有没有机制可以保证某些条件下,强制退出来;