打印

stm32 can节点问题

[复制链接]
4278|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lpy_ren|  楼主 | 2010-9-5 17:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
你好,我使用的是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;
其他邮箱数据一直没有发送出去。

当按一下重启按键,就又可以发送了,我该如何办。
如果出现邮箱中数据发不出去,原因一般有哪些,该如何解决呢?
沙发
lpy_ren|  楼主 | 2010-9-6 08:29 | 只看该作者
怎么没人回答呀,?急等答案呀!

使用特权

评论回复
板凳
香水城| | 2010-9-7 16:17 | 只看该作者
CAN_Transmit()返回CAN_NO_MB,说明没有可用的邮箱,你需要等一会儿再尝试发送,直到成功为止。

使用特权

评论回复
地板
lpy_ren|  楼主 | 2010-9-9 17:52 | 只看该作者
CAN_Transmit()返回CAN_NO_MB,说明没有可用的邮箱,你需要等一会儿再尝试发送,直到成功为止。

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

使用特权

评论回复
5
香水城| | 2010-9-9 17:56 | 只看该作者
你检查一下,先确认你的数据是否被拷贝到邮箱中,再看看对应的标志位对不对。

使用特权

评论回复
6
lpy_ren|  楼主 | 2010-9-11 11:37 | 只看该作者
数据已经拷贝到邮箱,标志位为terq,这个在发现堵晒过后,跟踪的时候一直没有变化,邮箱的数据一直都在。我使用can的监听模块也没有收到这几个邮箱的数据。

使用特权

评论回复
7
denike| | 2011-4-11 17:03 | 只看该作者
请问楼主的问题解决了吗?我也遇到这样的情况!!等待求解!!

使用特权

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

本版积分规则

6

主题

16

帖子

0

粉丝