打印

STM32 CAN调试问题

[复制链接]
5680|11
手机看帖
扫描二维码
随时随地手机跟帖
楼主
06quzhi|  楼主 | 2009-9-17 16:56 | 只看该作者 回帖奖励 |倒序浏览

STM32 CAN调试问题

在用CANTOOL工具给STM32发送数据时,上边发送一次,下边STM32却无限次的接收到,我是用串口打印输出STM32接收的数据, 请高手指教!!!
每次接收报文后,都释放了输出邮箱

使用特权

评论回复
沙发
06quzhi|  楼主 | 2009-9-17 16:58 | 只看该作者 |阅读模式
在用CANTOOL工具给STM32发送数据时,上边发送一次,下边STM32却无限次的接收到,我是用串口打印输出STM32接收的数据, 请高手指教!!!
每次接收报文后,都释放了输出邮箱
板凳
06quzhi|  楼主 | 2009-9-17 17:30 | 只看该作者
问题补充:准确的说应该是上边发送一次,然后下边接收到后,虽然释放了输出邮箱,但却没能将上次接收到的数据清空,尝试很多次都没能清掉

使用特权

评论回复
地板
06quzhi|  楼主 | 2009-9-17 17:30 | 只看该作者
问题补充:准确的说应该是上边发送一次,然后下边接收到后,虽然释放了输出邮箱,但却没能将上次接收到的数据清空,尝试很多次都没能清掉

使用特权

评论回复
5
06quzhi|  楼主 | 2009-9-17 17:33 | 只看该作者
部分代码如下: 请帮忙分析下
while (1)
  {
  

  RxMessage.StdId=0x00;
  RxMessage.IDE=CAN_ID_STD;
  RxMessage.DLC=0;
  RxMessage.Data[0]=0x00;
  RxMessage.Data[1]=0x00;
  CAN_Receive(CAN_FIFO0, &RxMessage);
  if (RxMessage.StdId!=0x55)
  {
    continue;  
  }

  if (RxMessage.IDE!=CAN_ID_STD)
  {
    continue;  
  }

  if (RxMessage.DLC!=2)
  {
    continue;  
  }          
  printf("%02x,%02x\r\n",RxMessage.Data[0],RxMessage.Data[1]);

  }
}

void CAN_Receive(u8 FIFONumber, CanRxMsg* RxMessage)
{
  /* Check the parameters */
  assert_param(IS_CAN_FIFO(FIFONumber));

  /* Get the Id */
  RxMessage->IDE = (u8)0x04 & CAN->sFIFOMailBox[FIFONumber].RIR;
  if (RxMessage->IDE == CAN_ID_STD)
  {
    RxMessage->StdId = (u32)0x000007FF & (CAN->sFIFOMailBox[FIFONumber].RIR >> 21);
  }

  else
  {
    RxMessage->ExtId = (u32)0x1FFFFFFF & (CAN->sFIFOMailBox[FIFONumber].RIR >> 3);
  }
  
  RxMessage->RTR = (u8)0x02 & CAN->sFIFOMailBox[FIFONumber].RIR;

  /* Get the DLC */
  RxMessage->DLC = (u8)0x0F & CAN->sFIFOMailBox[FIFONumber].RDTR;

  /* Get the FMI */
  RxMessage->FMI = (u8)0xFF & (CAN->sFIFOMailBox[FIFONumber].RDTR >> 8);

  /* Get the data field */
  RxMessage->Data[0] = (u8)0xFF & CAN->sFIFOMailBox[FIFONumber].RDLR;
  RxMessage->Data[1] = (u8)0xFF & (CAN->sFIFOMailBox[FIFONumber].RDLR >> 8);
  RxMessage->Data[2] = (u8)0xFF & (CAN->sFIFOMailBox[FIFONumber].RDLR >> 16);
  RxMessage->Data[3] = (u8)0xFF & (CAN->sFIFOMailBox[FIFONumber].RDLR >> 24);

  RxMessage->Data[4] = (u8)0xFF & CAN->sFIFOMailBox[FIFONumber].RDHR;
  RxMessage->Data[5] = (u8)0xFF & (CAN->sFIFOMailBox[FIFONumber].RDHR >> 8);
  RxMessage->Data[6] = (u8)0xFF & (CAN->sFIFOMailBox[FIFONumber].RDHR >> 16);
  RxMessage->Data[7] = (u8)0xFF & (CAN->sFIFOMailBox[FIFONumber].RDHR >> 24);

  /* Release the FIFO */
  CAN_FIFORelease(FIFONumber);

}

使用特权

评论回复
6
baidudz| | 2009-9-17 21:24 | 只看该作者
程序看的不是太懂,但数据清空,应该是要靠你的软件清空的

使用特权

评论回复
7
hsbjb| | 2009-9-17 21:52 | 只看该作者
会不会你本身就是在定时发数据

使用特权

评论回复
8
IJK| | 2009-9-18 09:42 | 只看该作者
搞不懂,参考STM32的CAN例程不就行了吗?

使用特权

评论回复
9
ST_ARM| | 2009-9-18 12:14 | 只看该作者
你的问题所在是:
一、没有通读STM32的CAN章节,
二、没有了解CAN操作的机制,
三、生搬硬套,没有融会贯通。

将你的CAN_Receive(CAN_FIFO0, &RxMessage);改为:
if (CAN_MessagePending(CAN_FIFO0)) {
        CAN_Receive(CAN_FIFO0, &RxMessage);
}
理由:
     在你接收CAN的数据时,你首先要检查FIFO的数据是否是接收数据,故使用CAN_MessagePending(CAN_FIFO0)函数来检测。调用该函数后当你执行CAN_FIFORelease(FIFONumber),硬件就将
FIFO里报文数目减一,直至为0。

不知道你用串口接收数据时是不是,不查标志就不停的读接收数据寄存器?

使用特权

评论回复
10
06quzhi|  楼主 | 2009-9-18 12:28 | 只看该作者
谢谢9楼,问题解决了!

刚开始调CAN没两天,要向你们多多学习啊!

使用特权

评论回复
11
06quzhi|  楼主 | 2009-9-18 12:30 | 只看该作者
在用串口读数据时是没有查询标志,只是在不停的读!

使用特权

评论回复
12
sinadz| | 2009-9-21 15:59 | 只看该作者
那你怎么判断接收了无数次呢,应该只是没清空,不过好像只能被下一次接收的值覆盖,软件只能清标志位

使用特权

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

本版积分规则

3

主题

11

帖子

0

粉丝