你好,我使用的是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;
其他邮箱数据一直没有发送出去。
当按一下重启按键,就又可以发送了,我该如何办。
如果出现邮箱中数据发不出去,原因一般有哪些,该如何解决呢? |