微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32 CAN通信 滤波器配置总结

STM32 CAN通信 滤波器配置总结

时间:11-17 来源:互联网 点击:

/*管脚初始化*/

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_DATA)&0xffff;
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_DATA;//数据帧
TxMessage.IDE=CAN_ID_STD;//标准帧
TxMessage.DLC=2; //数据长度 2
TxMessage.Data[0]=0xCA; //发送的数据
TxMessage.Data[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号。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top