首页
|
新闻
|
新品
|
文库
|
方案
|
视频
|
下载
|
商城
|
开发板
|
数据中心
|
座谈新版
|
培训
|
工具
|
博客
|
论坛
|
百科
|
GEC
|
活动
|
主题月
|
电子展
注册
登录
论坛
博客
搜索
帮助
导航
默认风格
uchome
discuz6
GreenM
»
MCU 单片机技术
»
ARM
» STM32 CAN通信 滤波器配置总结(4)
返回列表
回复
发帖
发新话题
发布投票
发布悬赏
发布辩论
发布活动
发布视频
发布商品
STM32 CAN通信 滤波器配置总结(4)
发短消息
加为好友
yuyang911220
当前离线
UID
1029342
帖子
9914
精华
0
积分
4959
阅读权限
90
在线时间
286 小时
注册时间
2014-5-22
最后登录
2017-7-24
论坛元老
UID
1029342
性别
男
1
#
打印
字体大小:
t
T
yuyang911220
发表于 2015-3-29 15:24
|
只看该作者
STM32 CAN通信 滤波器配置总结(4)
滤波器
,
color
,
通信
/*CAN 发送函数*/
unsigned
char
CAN1_SendData
(
void
)
{
uint16 i
;
CanTxMsg
TxMessage
;
unsigned
char
TransmitMailbox
;
TxMessage
.
StdId
=
0x11
;
//标准标识符
TxMessage
.
RTR
=
CAN_RTR_DA
TA
;
//数据帧
TxMessage
.
IDE
=
CAN_ID_STD
;
//标准帧
TxMessage
.
DLC
=
2
;
//数据长度 2
TxMessage
.
Da
ta
[
0
]=
0xCA
;
//发送的数据
TxMessage
.
Da
ta
[
1
]=
0xFE
;
TransmitMailbox
=
CAN_Transmit
(
CAN1
,&
TxMessage
);
//发送数据
i
=
0xFFF
;
do
{
_NOP_
(
5
);
}
while
((
CAN_TransmitStatus
(
CAN1
,
TransmitMailbox
)
!=
CANTXOK
)
&&
(--
i
));
if
(
i
<=
0x01
)
return
0
;
else
return
1
;
}
/*中断服务函数*/
void
USB_LP_CAN1_RX0_IRQHandler
(
void
)
{
CanRxMsg
RxMessage
;
CAN_Receive
(
CAN1
,
CAN_FIFO0
,
&
RxMessage
);
}
三、滤波器配置详细如下:
1、对扩展数据帧进行过滤
只接收扩展数据帧)
CAN_FilterInitStructure.CAN_FilterIdHigh = (((u32)slave_id<<3)&0xFFFF0000)>>16;
CAN_FilterInitStructure.CAN_FilterIdLo=(((u32)slave_id<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF;
(注:标准帧数据帧、标准远程帧和扩展远程帧均被过滤)
2、对扩展远程帧过滤
只接收扩展远程帧)
CAN_FilterInitStructure.CAN_FilterIdHigh = (((u32)slave_id<<3)&0xFFFF0000)>>16;
CAN_FilterInitStructure.CAN_FilterIdLow = (((u32)slave_id<<3)|CAN_ID_EXT|CAN_RTR_REMOTE)&0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF;3、对标准远程帧过滤
只接收标准远程帧)
CAN_FilterInitStructure.CAN_FilterIdHigh = (((u32)slave_id<<21)&0xffff0000)>>16;
CAN_FilterInitStructure.CAN_FilterIdLow = (((u32)slave_id<<21)|CAN_ID_STD|CAN_RTR_REMOTE)&0xffff;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF;
4、对标准数据帧过滤
只接收标准数据帧)
CAN_FilterInitStructure.CAN_FilterIdHigh = (((u32)slave_id<<21)&0xffff0000)>>16;
CAN_FilterInitStructure.CAN_FilterIdLow = (((u32)slave_id<<21)|CAN_ID_STD|CAN_RTR_DATA)&0xffff;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF;5、对扩展帧进行过滤
扩展帧不会被过滤掉)
CAN_FilterInitStructure.CAN_FilterIdHigh = (((u32)slave_id<<3)&0xFFFF0000)>>16;
CAN_FilterInitStructure.CAN_FilterIdLow = (((u32)slave_id<<3)|CAN_ID_EXT)&0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFC;
6、对标准帧进行过滤
标准帧不会被过滤掉)
CAN_FilterInitStructure.CAN_FilterIdHigh = (((u32)slave_id<<21)&0xffff0000)>>16;
CAN_FilterInitStructure.CAN_FilterIdLow = (((u32)slave_id<<21)|CAN_ID_STD)&0xffff;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFC;
注:slave_id为要过滤的id号。其中我们可以开启can错误中断,设置响应的标志位,在大循环里面不断的检测是否错误,一旦错误就重新配置can,这样有效地保证了CAN的正常通信。具体操作代码如下:
(u32)slave_id<<3)
官方提供的库函数的CAN发送函数在发送过程中左移了3位,然后接受的时候又右移了三位复原。而过滤过程在这两者之间,所以需要左移三位,才能正确过滤。
接受报文的格式就是你发送报文的格式啊。有标准标识符和扩展标识符两种,然后数据最大是八个字节。
/*CAN错误中断服务函数*/
、
void
CAN1_SCE_IRQHandler
(
void
)
{
CANWorkFlag
&=
~
CAN_RESET_COMPLETE
;
}
/*CAN错误处理函数*/
/************************************************************************
*函数名称: CanErrorProcess
*功能: CAN故障,错误处理
*参数说明: 无
************************************************************************/
void
CanErrorProcess
(
void
)
{
if
((
CANWorkFlag
&
CAN_RESET_COMPLETE
)
==
0
)
{
CAN1_Configuration
();
// CAN2_Configuration();
CANWorkFlag
|=
CAN_RESET_COMPLETE
;
}
// if((CANWorkFlag & CAN2_RESET_COMPLETE) == 0)
// {
// CAN1_Configuration();
// CAN2_Configuration();
// CANWorkFlag |= CAN2_RESET_COMPLETE;
// }
}
/*错误标志的定义*/
extern
uint8
CANWorkFlag
;
/************************************************************************
* CANWorkFlag 标志位掩码定义
************************************************************************/
#define
CAN_INIT_COMPLETE
0x80
//CAN初始化完成标志
//#define CAN_BUS_ERROR 0x40 //CAN总线错误标志
#define
CAN_RESET_COMPLETE
0x40
//CAN控制器复位完成标志
#define CAN2_INIT_COMPLETE 0x20 //CAN2初始化完成标志
//#define CAN_BUS_ERROR 0x40 //CAN总线错误标志
#define
CAN2_RESET_COMPLETE
0x10
//CAN2控制器复位完成标位
收藏
分享
评分
继承事业,薪火相传
回复
引用
订阅
TOP
返回列表
PowerPC
通信技术
电商论坛
Pine A64
资料下载
方案分享
FAQ
行业应用
消费电子
便携式设备
医疗电子
汽车电子
工业控制
热门技术
智能可穿戴
3D打印
智能家居
综合设计
示波器技术
存储器
电子制造
计算机和外设
软件开发
分立器件
传感器技术
无源元件
资料共享
PCB综合技术
综合技术交流
EDA
MCU 单片机技术
ST MCU
Freescale MCU
NXP MCU
新唐 MCU
MIPS
X86
ARM
PowerPC
DSP技术
嵌入式技术
FPGA/CPLD可编程逻辑
模拟电路
数字电路
富士通半导体FRAM 铁电存储器“免费样片”使用心得
电源与功率管理
LED技术
测试测量
通信技术
3G
无线技术
微波在线
综合交流区
职场驿站
活动专区
在线座谈交流区
紧缺人才培训课程交流区
意见和建议