TI中文支持网
TI专业的中文技术问题咨询交流网站

在线等:28335 CAN 发送问题

我打算做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 尝试是无限次的? 有没有机制可以保证某些条件下,强制退出来;

赞(0)
未经允许不得转载:TI中文支持网 » 在线等:28335 CAN 发送问题
分享到: 更多 (0)