STM32 CAN通信 滤波器配置总结
/*管脚初始化*/
void CAN_PinInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Configure CAN pin: RX */
GPIO_InitStructure.GPIO_Pin = PIN_CAN_RX;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIO_CAN, &GPIO_InitStructure);
/* Configure CAN pin: TX */
GPIO_InitStructure.GPIO_Pin = PIN_CAN_TX;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//GPIO_Mode_Out_PP;
GPIO_Init(GPIO_CAN, &GPIO_InitStructure);
}
/*CAN1配置函数*/
void CAN_Configuration(void)
{
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
// CAN register init
CAN_DeInit(CAN1);
CAN_StructInit(&CAN_InitStructure);
// CAN cell init
CAN_InitStructure.CAN_TTCM=DISABLE;//禁止时间触发通信模式
CAN_InitStructure.CAN_ABOM=DISABLE;
CAN_InitStructure.CAN_AWUM=DISABLE;//睡眠模式通过清除sleep位来唤醒
CAN_InitStructure.CAN_NART=ENABLE;//ENABLE;报文自动重传
CAN_InitStructure.CAN_RFLM=DISABLE;//接收溢出时,FIFO未锁定
CAN_InitStructure.CAN_TXFP=DISABLE;//发送的优先级由标示符的大小决定
CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;//正常模式下
//设置can通讯波特率为50Kbps
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;
CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;
CAN_InitStructure.CAN_Prescaler=45;
CAN_Init(CAN1,&CAN_InitStructure);
// CAN filter init
CAN_FilterInitStructure.CAN_FilterNumber=0;
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;//CAN_FilterScale_16bit; //32bit
CAN_FilterInitStructure.CAN_FilterIdHigh = (((u32)slave_id<21)&0xffff0000)>>16;
CAN_FilterInitStructure.CAN_FilterIdLow = (((u32)slave_id<21)|CAN_ID_STD|CAN_RTR_DA
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //时能过滤器
CAN_FilterInit(&CAN_FilterInitStructure);
CAN_ITConfig(CAN1,CAN_IT_FMP0|CAN_IT_EPV, ENABLE);
}
/*CAN 发送函数*/
unsigned char CAN1_SendData(void)
{
uint16 i;
CanTxMsg TxMessage;
unsigned char TransmitMailbox;
TxMessage.StdId=0x11; //标准标识符
TxMessage.RTR=CAN_RTR_DA
TxMessage.IDE=CAN_ID_STD;//标准帧
TxMessage.DLC=2; //数据长度 2
TxMessage.Da
TxMessage.Da
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号。
STM32CAN通信滤波 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)