9424|11

77

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

STM32CAN调试问题 [复制链接]

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

最新回复

                                 那你怎么判断接收了无数次呢,应该只是没清空,不过好像只能被下一次接收的值覆盖,软件只能清标志位  详情 回复 发表于 2009-9-21 15:59
点赞 关注
 

回复
举报

71

帖子

0

TA的资源

一粒金砂(初级)

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

回复

75

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
                                 问题补充:准确的说应该是上边发送一次,然后下边接收到后,虽然释放了输出邮箱,但却没能将上次接收到的数据清空,尝试很多次都没能清掉
此帖出自stm32/stm8论坛
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

4
 
                                 问题补充:准确的说应该是上边发送一次,然后下边接收到后,虽然释放了输出邮箱,但却没能将上次接收到的数据清空,尝试很多次都没能清掉
此帖出自stm32/stm8论坛
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

5
 
部分代码如下: 请帮忙分析下
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);

}
此帖出自stm32/stm8论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

6
 
                                 程序看的不是太懂,但数据清空,应该是要靠你的软件清空的
此帖出自stm32/stm8论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

7
 
                                 会不会你本身就是在定时发数据
此帖出自stm32/stm8论坛
 
 
 

回复

96

帖子

0

TA的资源

一粒金砂(中级)

8
 
                                 搞不懂,参考STM32的CAN例程不就行了吗?
此帖出自stm32/stm8论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

9
 
你的问题所在是:
一、没有通读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。

不知道你用串口接收数据时是不是,不查标志就不停的读接收数据寄存器?
此帖出自stm32/stm8论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

10
 
谢谢9楼,问题解决了!

刚开始调CAN没两天,要向你们多多学习啊!
此帖出自stm32/stm8论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

11
 
                                 在用串口读数据时是没有查询标志,只是在不停的读!
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

12
 
                                 那你怎么判断接收了无数次呢,应该只是没清空,不过好像只能被下一次接收的值覆盖,软件只能清标志位
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

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