STM32里CAN总线的问题

来源:互联网 发布:石墨文档 mac 编辑:程序博客网 时间:2024/05/21 23:32
小弟是一名新手,对CAN里的通信的ID和屏蔽码还有验收码搞不懂,求大大们指导!
发送程序中的stdid是不是只要和接收程序中过滤器的id一样就行了,还是说过滤器的id是经过一定的协议转换以后得到的??


CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
CAN_FilterInitStructure.CAN_FilterIdLow = 0x01e5;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xffff;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xffff;
通信

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册 

x
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0

回复 收藏 分享 淘帖 赏

举报



0331631

0

主题

12

帖子

47

积分

实习生

  • 关注TA
  • 发消息

专家等级:

结帖率:0%

沙发
 发表于 2013-8-24 09:14 | 只看该作者 |返回版面
个人理解有点类似modbus 的站台号!
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0

回复 赏

举报



feilusia
     

108

主题

1729

帖子

5600

积分

高级工程师

  • 关注TA
  • 发消息

专家等级:

结帖率:81%

打赏:1.20

受赏:48.57

板凳
 发表于 2013-8-24 16:07 | 只看该作者 |返回版面
本帖最后由 feilusia 于 2013-8-24 16:11 编辑

不是这么简单用的,我几个月前才写STM8的CAN,当时搞了1个星期搞的很清楚,现在又忘了,忒悲剧了……
貌似是酱紫的,看那张图,假设你用的是1个32位的过滤器。
那么,如果你用的是标准格式的,就是11位的ID,那这个ID是存在STID里,也就是图中的最高的那几位。
如果你用的是扩展帧格式的,那么就是29位的ID,那这个ID就是存在EXID,也就是从第3位开始的中间那一段。
而屏蔽码也要跟ID地址对应起来,把不想验证的位数屏蔽掉,一般这个要可由用户来设置。
至于验收码,我已经忘了是什么东西了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册 

x
博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC26xx群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);

回复 赏

举报



wukon

5

主题

11

帖子

33

积分

实习生

  • 关注TA
  • 发消息

专家等级:

结帖率:50%

地板
  楼主| 发表于 2013-8-24 22:48 | 只看该作者 |返回版面
feilusia 发表于 2013-8-24 16:07 
不是这么简单用的,我几个月前才写STM8的CAN,当时搞了1个星期搞的很清楚,现在又忘了,忒悲剧了……
貌似 ...

CAN_DeInit(CAN1); 
CAN_InitStructure.CAN_TTCM=DISABLE;//禁止时间触发通信模式
CAN_InitStructure.CAN_ABOM=DISABLE;//软件对CAN_MCR寄存器的INRQ位进行置1随后清0后,一旦硬件检测到128次11位连续的隐性位,就退出离线状态。
CAN_InitStructure.CAN_AWUM=DISABLE;//睡眠模式通过清除CAN_MCR寄存器的SLEEP位,由软件唤醒
CAN_InitStructure.CAN_NART=ENABLE;//CAN报文只被发送1次,不管发送的结果如何(成功、出错或仲裁丢失)
CAN_InitStructure.CAN_RFLM=DISABLE;//在接收溢出时FIFO未被锁定,当接收FIFO的报文未被读出,下一个收到的报文会覆盖原有的报文
CAN_InitStructure.CAN_TXFP=DISABLE;//发送FIFO优先级由报文的标识符来决定
   CAN_InitStructure.CAN_Mode=CAN_Mode_Normal; //CAN硬件工作在正常模式 
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;//重新同步跳跃宽度1个时间单位
CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;//时间段1为8个时间单位
CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;//时间段2为7个时间单位
CAN_InitStructure.CAN_Prescaler = 9; //(pclk1/((1+8+7)*9)) = 36Mhz/16/9 = 250Kbits设定了一个时间单位的长度9
CAN_Init(CAN1,&CAN_InitStructure);
   RxMessage.StdId=0x05;
  RxMessage.IDE=CAN_ID_STD;
  RxMessage.RTR=CAN_RTR_DATA;
  CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh = (0x0005<<5);
CAN_FilterInitStructure.CAN_FilterIdLow =0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xffff;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xffff;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);

这么设置也不行。目标接收到0xff,led灯亮一下。我用CAN_BUS做发送端

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册 

x
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0

回复 赏

举报



vacky

3

主题

38

帖子

114

积分

中级技术员

  • 关注TA
  • 发消息

专家等级:

结帖率:100%

5
 发表于 2013-8-26 09:35 | 只看该作者 |返回版面
我没记错的话,应该CAN_FilterIdHigh+CAN_FilterIdLow是你要对比的位,CAN_FilterMaskIdHigh+CAN_FilterMaskIdLow是对比位的值,比如你设置的CAN_FilterIdHigh+CAN_FilterIdLow为(0x0005<<5)+0x0000=0x00A00000,那么你的要检测的就是帧ID的第27位和25位,另外设置了CAN_FilterMaskIdHigh+CAN_FilterMaskIdLow为OxFFFFFFFF, 1有效,所以当你发送0x00A00000的帧ID时才能接受到数据。
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0

回复 赏

举报



杨爱林林
     

16

主题

543

帖子

1760

积分

助理工程师

  • 关注TA
  • 发消息

专家等级:

结帖率:100%

6
 发表于 2013-8-26 10:00 | 只看该作者 |返回版面
这个主要是看你filter的配置了 
用库函数  其他的都很好配置
你可以先试着  不设置filter屏蔽什么的 
也就是  这样的
CAN_FilterInitTypeDef  CAN_FilterInitStructure;
  
  CAN_FilterInitStructure.CAN_FilterNumber = Num;//0-13
  CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
  CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
  CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;//CAN_FilterIdH(CAN_ID);
  CAN_FilterInitStructure.CAN_FilterIdLow= 0x0000;//CAN_FilterIdL(CAN_ID);
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;//0xffff;//((msk<<1)&0xFFFF0000)>>16;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;//0xffff;//(msk<<1)&0xFFFF;
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO;
  CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
  CAN_FilterInit(&CAN_FilterInitStructure);
然后在接收程序中自己判断 自己想要的标识符

CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;//0xffff;//((msk<<1)&0xFFFF0000)>>16;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;//0xffff;//(msk<<1)&0xFFFF;
这两句的意思是 
不管你接收到什么样的标识符  都接收   也就是  取消了硬件屏蔽
己所不欲,勿施于人,争渡争渡

回复 赏

举报



trumpxp

0

主题

1076

帖子

3239

积分

中级工程师

  • 关注TA
  • 发消息

专家等级:

结帖率:0%

7
 发表于 2013-8-26 19:15 | 只看该作者 |返回版面
这一块   这种协议   吃的不透   需要花时间   仔细钻研钻研   这一块   感觉自己的差距很大啊
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0

回复 赏

举报



wukon

5

主题

11

帖子

33

积分

实习生

  • 关注TA
  • 发消息

专家等级:

结帖率:50%

8
  楼主| 发表于 2013-8-27 16:21 | 只看该作者 |返回版面
问题解决了,贴一下自己的代码吧
void CAN_Configuration(void)
{                                        
        CAN_DeInit(CAN1);        
        CAN_InitStructure.CAN_TTCM=DISABLE;//禁止时间触发通信模式
        CAN_InitStructure.CAN_ABOM=DISABLE;//软件对CAN_MCR寄存器的INRQ位进行置1随后清0后,一旦硬件检测到128次11位连续的隐性位,就退出离线状态。
        CAN_InitStructure.CAN_AWUM=DISABLE;//睡眠模式通过清除CAN_MCR寄存器的SLEEP位,由软件唤醒
        CAN_InitStructure.CAN_NART=ENABLE;//CAN报文只被发送1次,不管发送的结果如何(成功、出错或仲裁丢失)
        CAN_InitStructure.CAN_RFLM=DISABLE;//在接收溢出时FIFO未被锁定,当接收FIFO的报文未被读出,下一个收到的报文会覆盖原有的报文
        CAN_InitStructure.CAN_TXFP=DISABLE;//发送FIFO优先级由报文的标识符来决定
          CAN_InitStructure.CAN_Mode=CAN_Mode_Normal; //CAN硬件工作在正常模式 
        CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;//重新同步跳跃宽度1个时间单位
        CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;//时间段1为8个时间单位
        CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;//时间段2为7个时间单位
        CAN_InitStructure.CAN_Prescaler = 9; //(pclk1/((1+8+7)*9)) = 36Mhz/16/9 = 250Kbits设定了一个时间单位的长度9
        CAN_Init(CAN1,&CAN_InitStructure);



        CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
        CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
        CAN_FilterInitStructure.CAN_FilterIdHigh = ((0x000000aa<<3)&0xffff0000)>>16;
        CAN_FilterInitStructure.CAN_FilterIdLow =((0x000000aa<<3)|(0x00000004))&0xffff;
        CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xffff;
        CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xffff;
        CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;
        CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
        CAN_FilterInit(&CAN_FilterInitStructure);



        CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE);                  //过滤器初始化,所有报文都接收,邮箱为FIFO0。
}
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0

回复 赏

举报



wukon

5

主题

11

帖子

33

积分

实习生

  • 关注TA
  • 发消息

专家等级:

结帖率:50%

9
  楼主| 发表于 2013-8-27 16:23 | 只看该作者 |返回版面
blog。chinaunix。net/uid-21658993-id-3027673。html
关于过滤器设置看这个,会特别清楚,希望大伙儿以后也少走弯路。解决问题了,神清气爽呀
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0

回复 赏

举报



cjhk

1

主题

2634

帖子

7950

积分

高级工程师

  • 关注TA
  • 发消息

专家等级:

结帖率:100%

10
 发表于 2013-8-27 19:00 | 只看该作者 |返回版面
问题解决了就好   谢谢了  楼主   谢谢你将自己的解决方法贴出来   这样以后大家如果遇到同样的问题   就比较方便了
静心

回复 赏

举报



yousi2180

2

主题

34

帖子

105

积分

中级技术员

  • 关注TA
  • 发消息

专家等级:

结帖率:0%

11
 发表于 2013-11-27 15:47 | 只看该作者 |返回版面
wukon 发表于 2013-8-27 16:23 
blog。chinaunix。net/uid-21658993-id-3027673。html
关于过滤器设置看这个,会特别清楚,希望大伙儿以后 ...

恭喜啊。
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0

回复 赏

举报



lz80650904
     

18

主题

120

帖子

363

积分

资深技术员

  • 关注TA
  • 发消息

专家等级:

结帖率:92%

12
 发表于 2014-12-26 22:38 | 只看该作者 |返回版面
wukon 发表于 2013-8-27 16:21 
问题解决了,贴一下自己的代码吧
void CAN_Configuration(void)
{                                       

你好!我现在在调试CAN也遇到些问题未解决,主要是无法进入接收中断,可以留个联系方式交流么?? 我QQ:19152072 ,邮箱lz80650904@126.com
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0

回复 赏

举报



kfliuyan

108

主题

794

帖子

2393

积分

初级工程师

  • 关注TA
  • 发消息

专家等级:

结帖率:0%

13
 发表于 2014-12-28 19:32 | 只看该作者 |返回版面
支持一下
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0

回复 赏

举报



白丁野老

12

主题

195

帖子

589

积分

高级技术员

  • 关注TA
  • 发消息

专家等级:

结帖率:33%

14
 发表于 2014-12-30 21:23 | 只看该作者 |返回版面
了解一下
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0

回复 赏

举报



dammon

0

主题

2

帖子

16

积分

实习生

  • 关注TA
  • 发消息

专家等级:

结帖率:0%

15
 发表于 2016-3-4 16:22 | 只看该作者 |返回版面
发送程序中的stdid是不是只要和接收程序中过滤器的id一样。。。我也想请教跟您一样的问题。。。
原创粉丝点击