打印
[技术问答]

求助:NUC230 CAN接受有问题

[复制链接]
1669|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
vunese|  楼主 | 2017-10-16 21:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*---------------------------------------------------------------------------------------------------------*/
/* CAN0 interrupt handler                                                                                  */
/*---------------------------------------------------------------------------------------------------------*/
void CAN0_IRQHandler(void)
{
    uint32_t u8IIDRstatus;

    u8IIDRstatus = CAN0->IIDR;

    if(u8IIDRstatus == 0x00008000)        /* Check Status Interrupt Flag (Error status Int and Status change Int) */
    {
        /**************************/
        /* Status Change interrupt*/
        /**************************/
        if(CAN0->STATUS & CAN_STATUS_RXOK_Msk)
        {
            CAN0->STATUS &= ~CAN_STATUS_RXOK_Msk;   /* Clear RxOK status*/
        }

        if(CAN0->STATUS & CAN_STATUS_TXOK_Msk)
        {
            CAN0->STATUS &= ~CAN_STATUS_TXOK_Msk;    /* Clear TxOK status*/
        }

        /**************************/
        /* Error Status interrupt */
        /**************************/
        if(CAN0->STATUS & CAN_STATUS_BOFF_Msk)
        {
            printf("BOFF INT\n") ;
        }
        if(CAN0->STATUS & CAN_STATUS_EWARN_Msk)
        {
            printf("EWARN INT\n") ;
        }
    }
    else if((u8IIDRstatus >= 0x1) || (u8IIDRstatus <= 0x20))
    {
        CAN_MsgInterrupt(CAN0, u8IIDRstatus);

        CAN_CLR_INT_PENDING_BIT(CAN0, (u8IIDRstatus - 1)); /* Clear Interrupt Pending */
    }
    else if(CAN0->WU_STATUS == 1)
    {
        printf("Wake up\n");

        CAN0->WU_STATUS = 0;    /* Write '0' to clear */
    }

}
我用CAN0接收数据再去处理,每次工作3个小时左右就出现问题,在线调试发现在CAN0接受中断函数这里,中断只进入状态中断  if(u8IIDRstatus == 0x00008000) ,而不进入报文对象中断else if((u8IIDRstatus >= 0x1) || (u8IIDRstatus <= 0x20)),请问各位大侠,这是什么原因?
沙发
落叶行健ywm| | 2017-10-17 09:42 | 只看该作者
应该是你总线出故障了,首先看看是什么故障,然后对应解决。

使用特权

评论回复
板凳
zhuomuniao110| | 2017-10-17 14:46 | 只看该作者
都是定时发生错误啊,好牛X啊。看看是不是总线没搞好。

使用特权

评论回复
地板
antusheng| | 2017-10-17 16:32 | 只看该作者
参考官方BSP的例子,看看这一步怎么做的。

使用特权

评论回复
5
vunese|  楼主 | 2017-10-18 17:21 | 只看该作者
zhuomuniao110 发表于 2017-10-17 14:46
都是定时发生错误啊,好牛X啊。看看是不是总线没搞好。

又测了一下,发现这个是跟发送数据的频率有关,频率越高就越快出问题。总线问题的话跟我程序有关系吗?

使用特权

评论回复
6
vunese|  楼主 | 2017-10-18 17:27 | 只看该作者
落叶行健ywm 发表于 2017-10-17 09:42
应该是你总线出故障了,首先看看是什么故障,然后对应解决。

总线故障要怎么检查啊?CAN总线不是很懂。我的程序其实就是一路CAN进来另一路CAN出去,两路都可接收可发送,频率也非常高,快的话每帧间隔可能就500us左右,并且我测试发现频率越高越快出故障

使用特权

评论回复
7
落叶行健ywm| | 2017-10-19 09:08 | 只看该作者
那你这肯定是总线错误,总线首先会自动纠错,当自动纠错都就不过来,就会导致总线挂掉,所以你就发不出去了。建议先看看CAN总线基本知识,看看有哪些错误。检测的话很简单:

if(u8IIDRstatus == 0x00008000)        /* Check Status Interrupt Flag (Error status Int and Status change Int) */

这个就是错误信息提示,调出printf打印出来,看看是哪个错误,然后对症解决。
对了,提示下,新唐的BSP包里 的例子没有把所有can错误给写全,需要自己添加,至于解决错我,也得自己解决。你打印出来看看什么错误,才好跟你说。
给你一个解决错误提示:可以打印出总线错误计数量,在满128前将其清零就不会导致总线挂了。不过这治标不治本。最主要还得看你的外接线是什么干扰can了。

使用特权

评论回复
8
玛尼玛尼哄| | 2017-10-19 21:58 | 只看该作者
错误积累了

使用特权

评论回复
9
vunese|  楼主 | 2017-10-23 17:30 | 只看该作者
落叶行健ywm 发表于 2017-10-19 09:08
那你这肯定是总线错误,总线首先会自动纠错,当自动纠错都就不过来,就会导致总线挂掉,所以你就发不出去了 ...

非常感谢您的回答!确实是有错误,错误状态是EWarn,这个有可能是我配置问题引起的吗?因为我的接受对象配置及发送函数配置都不是用官方库里的,而且我用ST的芯片去做测试就没有出现过故障,所以应该不是外界干扰引起总线异常的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

8

帖子

0

粉丝