OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4993|回复: 2

弱弱的一句。。。。求解答。

[复制链接]

14

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2013-4-17
在线时间
0 小时
发表于 2013-11-2 14:01:50 | 显示全部楼层 |阅读模式

  TxMessage.StdId=0x12;      // 标准标识符为0
  TxMessage.ExtId=0x12;     // 设置扩展标示符(29位)

当我使用扩展标示符的时候,是把所有的29位全都写在TxMessage.ExtId里边,

还是说把前11位写在TxMessage.StdId,把扩展的18位写在TxMessage.ExtId????

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-11-2 14:28:14 | 显示全部楼层
你分析下库函数的源码,就知道了。
    if (TxMessage->IDE == CAN_Id_Standard)
    {
      assert_param(IS_CAN_STDID(TxMessage->StdId));  
      CANx->sTxMailBox[transmit_mailbox].TIR |= ((TxMessage->StdId << 21) | \
                                                  TxMessage->RTR);
    }
    else
    {
      assert_param(IS_CAN_EXTID(TxMessage->ExtId));
      CANx->sTxMailBox[transmit_mailbox].TIR |= ((TxMessage->ExtId << 3) | \
                                                  TxMessage->IDE | \
                                                  TxMessage->RTR);
    }
都是设置TIR,不论你用标准ID,还是扩展ID。
也就是ID不能同时有效!
要嘛就是标准ID,要嘛就是扩展ID,所以不存在你说的拆分为:11位和18位
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

14

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2013-4-17
在线时间
0 小时
 楼主| 发表于 2013-11-2 20:20:40 | 显示全部楼层

回复【2楼】正点原子:
---------------------------------
谢谢原子哥。我进一步算是搞懂了这个表示符的设置。但是

这个标示符和滤波器一起设置还是出现了问题。还得麻烦您给解答一下。哈哈。
我现在  
  TxMessage.StdId=0x00;  // 标准标识符为0
   TxMessage.ExtId=0x1234;  // 设置扩展标示符(29位)
  TxMessage.IDE=1;  // 使用标准标识符:0,标准;1,扩展
  TxMessage.RTR=0;  // 消息类型为数据帧:一帧8位

然后我在滤波过滤标示符的时候这样设置
  CAN_FilterInitStructure.CAN_FilterNumber=0;   //过滤器0
  CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; 
   CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位 
   CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;////32位ID
   CAN_FilterInitStructure.CAN_FilterIdLow=0x91a4;                       
   CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xffff;//32位MASK
   CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xffff;
   CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0
不知道按我的理解方式对不对??把CAN_FilterInitStructure.CAN_FilterIdLow=0x91a4;    
0x91a4这样计算对么?我不是很确定,但是现在一直接受不到报文。而当我改为
   CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xffff;//32位MASK
   CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xfff0;
的时候,能接受到报文,但是读取的报文位乱码。这是什么情况?

万分感谢原子哥作答啊。

回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-9 10:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表