4123|5

95

帖子

0

资源

一粒金砂(初级)

stm32can节点问题 [复制链接]

你好,我使用的是stm32,外围带mcp2551,做为节点的时候,通讯一般都是没有问题的,可以接收和发送。接收是采用中断方式。

但是目前遇到一个问题,整个总线有5个节点,一个是监听的,方便pc得到信息。
我使用STM32的can来代替一个节点进行数据通讯及控制。当实时性较高的数据(数据量大,时间间隔短)从其他三个节点发送过来的时候,stm32出现了发送邮箱爆满的情况,也就是说,没有空的邮箱方便发送新的数据,但是,当总线闲置下来时邮箱中的数据仍然没法发送出去,使用J_LINK检测到can的寄存器,一直处于txreq状态,不知道这是什么原因造成的。难道是什么机制导致其出现这种情况?在这期间,stm32一直是can节点正常接收。

这个情况出现是不一定的,有时是实时性较高的数据通讯刚刚开始几秒就出现,有时是1两分钟。有时就是几分钟都没有出现。这让人郁闷。不过大多数情况是半分钟就会出现,由于有保护,其他节点一旦出现没有收到答复,会断开部分输出,这让人很郁闷。
而stm32的发送不出去,更让人郁闷。我应该改些什么?

初始化是这样的:
CAN_DeInit();
CAN_StructInit(&CAN_InitStructure);

/* CAN cell init */
CAN_InitStructure.CAN_TTCM=DISABLE;
CAN_InitStructure.CAN_ABOM=DISABLE;
CAN_InitStructure.CAN_AWUM=DISABLE;
CAN_InitStructure.CAN_NART=DISABLE;
CAN_InitStructure.CAN_RFLM=DISABLE;
CAN_InitStructure.CAN_TXFP=ENABLE;
CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;
CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;
CAN_InitStructure.CAN_Prescaler=18;
//  CAN_Init(&CAN_InitStructure);

if (CAN_Init(&CAN_InitStructure) == CANINITFAILED) {
                                                                                                              //然后查看硬件是否真的设置了CAN_MSR的初始化位来确认是否进入了初始化模式                  
        TxMessage.StdId = 0;  
     }   

/* CAN filter init */
CAN_FilterInitStructure.CAN_FilterNumber=0;
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);

/* CAN FIFO0 message pending interrupt enable */
CAN_ITConfig(CAN_IT_FMP0, ENABLE);


发送就直接是使用CAN_Transmit。

在跟踪过程中出现:
     TransmitMailbox = CAN_NO_MB;
其他邮箱数据一直没有发送出去。

当按一下重启按键,就又可以发送了,我该如何办。
如果出现邮箱中数据发不出去,原因一般有哪些,该如何解决呢?
此帖出自stm32/stm8论坛

回复

102

帖子

0

资源

一粒金砂(初级)

                                 怎么没人回答呀,?急等答案呀!

回复

117

帖子

0

资源

一粒金砂(初级)

                                 CAN_Transmit()返回CAN_NO_MB,说明没有可用的邮箱,你需要等一会儿再尝试发送,直到成功为止。

回复

101

帖子

0

资源

一粒金砂(初级)

CAN_Transmit()返回CAN_NO_MB,说明没有可用的邮箱,你需要等一会儿再尝试发送,直到成功为止。

可是问题是,等了很久都没有可用邮箱,邮箱中的数据一直没有发出去,无论can总线是否空闲!
其他模块这段时间一直能正常发送接收,就stm32这个一直是只能接收,却发不出去(一旦发不出去,就一直发不出去了除非重启,软件重新初始化)!

回复

104

帖子

0

资源

一粒金砂(初级)

                                 你检查一下,先确认你的数据是否被拷贝到邮箱中,再看看对应的标志位对不对。

回复

106

帖子

0

资源

一粒金砂(初级)

                                 数据已经拷贝到邮箱,标志位为terq,这个在发现堵晒过后,跟踪的时候一直没有变化,邮箱的数据一直都在。我使用can的监听模块也没有收到这几个邮箱的数据。

回复
您需要登录后才可以回帖 登录 | 注册

最新文章 更多>>
    关闭
    站长推荐上一条 1/6 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表