/*******************************************************************
---------------------Copyright(a)-----------------------------------
作者:
日期:
修改记录:
描述:
STM32共有14组过滤器,用以对接收到的帧进行过滤。每组过滤器包括了2个可配置的32位寄存器:CAN_FxR0和CAN_FxR1。
对于过滤器组,可以将其配置成屏蔽位模式,这样CAN_FxR0中保存的就是标识符匹配值,CAN_FxR1中保存的是屏蔽码,
即CAN_FxR1中如果某一位为1,
则CAN_FxR0中相应的位必须与收到的帧的标志符中的相应位吻合才能通过过滤器; CAN_FxR1中为0的位
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示CAN_FxR0中的相应位可不必与收到的帧进行匹配。
过滤器组还可以被配置成标识符列表模式,此时CAN_FxR0和CAN_FxR1中的都是要匹配的标识符,收到的帧的标识符必须与其中的一个吻合才能通过过滤。
例如:
CAN_FilterInitStructure.CAN_FilterNumber=0;
//设置第一组过滤器
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
//屏蔽位模式
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
//32位
CAN_FilterInitStructure.CAN_FilterIdHigh=(0x0635<<5);
//接收ID为635的消息11位帧ID 标准帧因此左移5
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xffff;
//
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xffff;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;
//第一组过滤器指向FIFO0
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
滤波器配置详细如下:
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)&0xFF FF;
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号。
********************************************************************/
#include "CAN.h"
/*******************************************************************/
//全局变量声明/引用处
extern volatile unsigned char Can_Flag; //CAN发送数据完成flag 标志
/*******************************************************************
作者:
描述:CAN 初始化、CAN波特率=PCLK1/(BRP+1)*(TS1+TS2+3)
********************************************************************/
void Init_CAN(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); // CAN 口时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // I/O 口时钟使能
/* Configure CAN pin: RX PA11 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure CAN pin: TX PA12*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* 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=DISABLE; //ENABLE;报文自动重传
CAN_InitStructure.CAN_RFLM=DISABLE; //接收溢出时,FIFO未锁定
CAN_InitStructure.CAN_TXFP=DISABLE; //发送的优先级由标示符的大小决定CAN_InitStructure.CAN_Mode=CAN_Mode_Normal; //CAN_Mode_LoopBack;//
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; //SJW=0 //波特率计算, PCLK1=36MHZ,CAN波特率=36MHZ/(2+1)*(15+6+3)=500Kbs
CAN_InitStructure.CAN_BS1=CAN_BS1_16tq; //TS1=15 //波特率计算, PCLK1=36MHZ,CAN波特率=PCLK1/(BRP+1)*(TS1+TS2+3)
CAN_InitStructure.CAN_BS2=CAN_BS2_7tq; //TS2=6
CAN_InitStructure.CAN_Prescaler=3; //BRP=2 9/ 45=50K/
CAN_Init(CAN1,&CAN_InitStructure);
/* CAN filter init */
CAN_FilterInitStructure.CAN_FilterNumber=0; //第1组过滤器
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //屏蔽位模式
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位
CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0; //第一组过滤器指向FIFO0
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
/* Enable CAN RX0 interrupt IRQ channel*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //中断优先级组选择0组使用
NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; //USB_HP_CAN1_TX_IRQn 接收中断使能
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //响应优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* CAN FIFO0 message pending interrupt enable */
CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE); //使能过滤器中断
}
/*******************************************************************
作者:
描述:CAN 发送一标准帧数据
********************************************************************/
void CAN_Send(unsigned short int SID,unsigned char data1,unsigned char data2,unsigned char data3,
unsigned char data4,unsigned char data5,unsigned char data6,unsigned char data7) //CAN 发送一标准帧数据
{
CanTxMsg TxMessage;
CanRxMsg RxMessage;
unsigned char TransmitMailbox;
Can_Flag = 0;
/* transmit 1 message */
TxMessage.StdId=SID;//0x101; //SID;//0x00; ID标示符
// TxMessage.ExtId=0x1234;
TxMessage.RTR=CAN_RTR_DATA; //选择数据帧
TxMessage.IDE=CAN_ID_STD; //CAN_ID_EXT;// //选择标准帧TxMessage.DLC=7;
TxMessage.Data[0]=data1; //data1;
TxMessage.Data[1]=data2; //data2;
TxMessage.Data[2]=data3; //data3;
TxMessage.Data[3]=data4; //data4;
TxMessage.Data[4]=data5; //data5;
TxMessage.Data[5]=data6; //data6;
TxMessage.Data[6]=data7; //data7;
// TxMessage.Data[7]=0x00; //data8;
TransmitMailbox = CAN_Transmit(CAN1,&TxMessage);
while(CAN_TransmitStatus(CAN1,TransmitMailbox) != CANTXOK);
Can_Flag = 1;
/* receive*/
RxMessage.StdId=0x00;
RxMessage.IDE=CAN_ID_STD;
RxMessage.DLC=0;
RxMessage.Data[0]=0x00;
RxMessage.Data[1]=0x00;
CAN_Receive(CAN1,CAN_FIFO0, &RxMessage);
}
/****************************************************************************** *
* Function Name : USB_LP_CAN_RX0_IRQHandler
* Description : This function handles USB Low Priority or CAN RX0 interrupts
* requests.
* Input : None
* Output : None
* Return : None
******************************************************************************* /
void USB_LP_CAN1_RX0_IRQHandler(void)//CAN 中断接收程序
{
CanRxMsg RxMessage;
RxMessage.StdId=0x00;
RxMessage.ExtId=0x00;
RxMessage.IDE=0;
RxMessage.DLC=0;
RxMessage.FMI=0;
RxMessage.Data[0]=0x00;
RxMessage.Data[1]=0x00;
CAN_Receive(CAN1,CAN_FIFO0, &RxMessage);
/*
if((RxMessage.ExtId==0x1234) && (RxMessage.IDE==CAN_ID_EXT)
&& (RxMessage.DLC==2) && ((RxMessage.Data[1]|RxMessage.Data[0]<<8)==0xDECA)) {
ret = 1;
}
else
{
ret = 0;
}
*/
}
/****************************************************************************** ****/