硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5255|回复: 3
收起左侧

[有问必答] STM32F4 CAN总线数据接收

[复制链接]

9

主题

128

回帖

155

积分

初级会员

积分
155
发表于 2016-8-18 21:01:47 | 显示全部楼层 |阅读模式
在使用STM32F4的CAN总线接收数据时怎么无法接收到扩展帧呢?
我现在需要接收的数据帧的ID是0x07909ADC,滤波器采用的0,,采用的是32位标识符列表模式,按照官方手册的说明:

截图

截图

我在程序里面是这样配置的:

    CAN_Filter_init.CAN_FilterMode = CAN_FilterMode_IdList;//ÑúÂëÄ£ê½,′Ë′|¿éÅäÖÃÎaÑúÂëÄ£ê½oíáD±íÄ£ê½
    CAN_Filter_init.CAN_FilterScale = CAN_FilterScale_32bit;//
        u32 temp;

    temp = 0x07909ADC>>11;
    temp = temp>>13;
    temp = temp&0x1F;
    CAN_Filter_init.CAN_FilterIdHigh      = ((0x07909ADC&0x7FF)<<5)|temp;//这是获取STD[10:0]和EXID[17:13]
    temp = 0x07909ADC>>11;
    temp &=0x1FFF;
    CAN_Filter_init.CAN_FilterIdLow       = temp<<3|0x04;//这是获取EXID[12:0],同时还将IDE位置位,表示接收扩展帧;
CAN_FilterInit(&CAN_Filter_init);
怎么就不行呢?我也看了寄存器,也没问题啊!如果改为接收标准帧就可以。CAN_Filter_init.CAN_FilterIdLow       = temp<<3|0x00;//这是获取EXID[12:0],同时还将IDE位置位,表示接收扩展帧;这样就能收到0x2DC的数据。
记录本身,即已是反抗!
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2016-8-18 22:17:03 | 显示全部楼层
列表模式设置这两个就可以了,直接将你的ID: 0x07909ADC   高16位和低16位赋值给这两个就可以了,
一个完整的标识符是这样的,不仅仅包含ID号,你设置的时候直接设置标识符就行。
1.jpg




1.jpg
回复

使用道具 举报

9

主题

128

回帖

155

积分

初级会员

积分
155
 楼主| 发表于 2016-8-19 22:56:57 | 显示全部楼层

回 eric2013 的帖子

eric2013:
列表模式设置这两个就可以了,直接将你的ID: 0x07909ADC   高16位和低16位赋值给这两个就可以了,
一个完整的标识符是这样的,不仅仅包含ID号,你设置的时候直接设置标识符就行。



.......
是的,按照手册中的说明如果要配置为32位列表模式, QQ截图20160819225104.png
按照截图中的描述,如果我需要接受0x07909ADC,那么应该把最低的5位  放置在CAN_Filter_init.CAN_FilterIdHigh里面,
同时还需要将EXID[17:13]也放置在CAN_Filter_init.CAN_FilterIdHigh,
temp = (0x07909ADC>>24)&0x1F;//EXID[17:13],不知道是不是我理解错了。
即CAN_Filter_init.CAN_FilterIdHigh      = ((0x07909ADC&0x7FF)<<5)|temp;
按照你的说法我试过还是不行
列表模式设置这两个就可以了,直接将你的ID: 0x07909ADC   高16位和低16位赋值给这两个就可以了,

    CAN_Filter_init.CAN_FilterIdHigh      =0x07909ADC>>16;
    CAN_Filter_init.CAN_FilterIdLow       = 0x07909ADC&0xFFFF;
记录本身,即已是反抗!
回复

使用道具 举报

9

主题

128

回帖

155

积分

初级会员

积分
155
 楼主| 发表于 2016-8-19 23:41:14 | 显示全部楼层

回 596142041 的帖子

596142041:是的,按照手册中的说明如果要配置为32位列表模式,
按照截图中的描述,如果我需要接受0x07909ADC,那么应该把最低的5位  放置在CAN_Filter_init.CAN_FilterIdHigh里面,
同时还需要将EXID[17:13]也放置在CAN_Filter_init.CAN_FilterIdHigh,
temp =  .. (2016-08-19 22:56) 
问题已经解决
记录本身,即已是反抗!
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-14 21:36 , Processed in 0.047211 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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