首页 STM32F103芯片CAN总线应用程序

STM32F103芯片CAN总线应用程序

举报
开通vip

STM32F103芯片CAN总线应用程序/******************************************************************* ---------------------Copyright(a)----------------------------------- 作者: 日期: 修改记录: 描述: STM32共有14组过滤器,用以对接收到的帧进行过滤。每组过滤器包括了2个可配置的32位寄存器:CAN_FxR0和CAN_FxR1。 对于过滤器组,可以将其配置成屏蔽位模式,这样CAN_FxR...

STM32F103芯片CAN总线应用程序
/******************************************************************* ---------------------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; } */ } /****************************************************************************** ****/
本文档为【STM32F103芯片CAN总线应用程序】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_997338
暂无简介~
格式:doc
大小:35KB
软件:Word
页数:0
分类:互联网
上传时间:2019-08-23
浏览量:29