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

STM32F103芯片CAN总线应用程序

举报
开通vip

STM32F103芯片CAN总线应用程序Copyright(a)作者:日期:修改记录:描述:STM32共有14组过滤器,用以对接收到的帧进行过滤。每组过滤器包括了2个可配置的32位寄存器:CAN_FxRO和CAN_FxR1。对于过滤器组,可以将其配置成屏蔽位模式,这样CAN_FxRO中保存的就是标识符匹配值,CAN_FxR1中保存的是屏蔽码,即CAN_FxR1中如果某一位为1,则CAN_FxRO中相应的位必须与收到的帧的标志符中的相应位吻合才能通过过滤器;CAN_FxR1中为0的位表示CAN_FxRO中的相应位可不必与收到的帧进行匹配。过滤器组还可以被配...

STM32F103芯片CAN总线应用程序
Copyright(a)作者:日期:修改记录:描述:STM32共有14组过滤器,用以对接收到的帧进行过滤。每组过滤器包括了2个可配置的32位寄存器:CAN_FxRO和CAN_FxR1。对于过滤器组,可以将其配置成屏蔽位模式,这样CAN_FxRO中保存的就是标识符匹配值,CAN_FxR1中保存的是屏蔽码,即CAN_FxR1中如果某一位为1,则CAN_FxRO中相应的位必须与收到的帧的标志符中的相应位吻合才能通过过滤器;CAN_FxR1中为0的位表示CAN_FxRO中的相应位可不必与收到的帧进行匹配。过滤器组还可以被配置成标识符列表模式,此时CAN_FxRO和CAN_FxR1中的都是要匹配的标识符,收到的帧的标识符必须与其中的一个吻合才能通过过滤。例如:CAN_FilterInitStructure.CAN_FilterNumber=O;//设置第一组过滤器CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//屏蔽位模式CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;//32位CAN_FilterInitStructure.CAN_FilterIdHigh=(OxO635<<5);//接收ID为635的消息11位帧ID标准帧因此左移5CAN_FilterInitStructure.CAN_FilterIdLow=OxOOOO;CAN_FilterInitStructure.CAN_FilterMaskIdHigh=Oxffff;//CAN_FilterInitStructure.CAN_FilterMaskIdLow=Oxffff;CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFOO;//第一组过滤器指向FIFOOCAN_FilterInitStructure.CAN_FilterActivation=ENABLE;CAN_FilterInit(&CAN_FilterInitStructure);滤波器配置详细如下:1、对扩展数据帧进行过滤:(只接收扩展数据帧)CAN_FilterInitStructure.CAN_FilterIdHigh=(((u32)slave_id<<3)&OxFFFFOOOO)>>16;CAN_FilterInitStructure.CAN_FilterIdLo=(((u32)slave_id<<3)|CAN_ID_EXT|CAN_RTR_DATA)&OxFFFF;CAN_FilterInitStructure.CAN_FilterMaskIdHigh=OxFFFF;CAN_FilterInitStructure.CAN_FilterMaskIdLow=OxFFFF;(注:标准帧数据帧、标准远程帧和扩展远程帧均被过滤)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"/*//CAN发送数据完成flag标志//全局变量声明/引用处externvolatileunsignedcharCan_Flag;/*作者:描述:CAN初始化、CAN波特率=PCLK1/(BRP+1)*(TS1+TS2+3)voidInit_CAN(void){NVIC_InitTypeDefNVIC_InitStructure;GPIO_InitTypeDefGPIO_InitStructure;CAN_InitTypeDefCAN_InitStructure;CAN_FilterInitTypeDefCAN_FilterInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1,ENABLE);//CAN口时钟使能RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//I/O口时钟使能/*ConfigureCANpin:RXPA11*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_Init(GPIOA,&GPIO_InitStructure);/*ConfigureCANpin:TXPA12*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_Init(GPIOA,&GPIO_InitStructure);/*CANregisterinit*/CAN_DeInit(CAN1);CAN_StructInit(&CAN_InitStructure);/*CANcellinit*/CAN_InitStructure.CAN_TTCM=DISABLE;CAN_InitStructure.CAN_ABOM=DISABLE;CAN_InitStructure.CAN_AWUM=DISABLE;CAN_InitStructure.CAN_NART=DISABLE;CAN_InitStructure.CAN_RFLM=DISABLE;CAN_InitStructure.CAN_TXFP=DISABLE;//禁止时间触发通信模式//睡眠模式通过清除sleep位来唤醒//ENABLE;报文自动重传//接收溢出时,FIFO未锁定//发送的优先级由标示符的大小决定CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;//CAN_Mode_LoopBack;////波特率计算//波特率计算CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;//SJW=0PCLK1=36MHZ,CAN波特率=36MHZ/(2+1)*(15+6+3)=500KbsCAN_InitStructure.CAN_BS1=CAN_BS1_16tq;//TS1=15PCLK1=36MHZ,CAN波特率=PCLK1/(BRP+1)*(TS1+TS2+3)CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;//TS2=6CAN_InitStructure.CAN_Prescaler=3;//BRP=29/45=50K/CAN_Init(CAN1,&CAN_InitStructure);/*CANfilterinit*/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;//第一组过滤器指向FIFO0CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;CAN_FilterInit(&CAN_FilterInitStructure);/*EnableCANRX0interruptIRQchannel*///中断优先级USB_LP_CAN1_RX0_IRQn;//抢占优先级//响应优先级NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);组选择0组使用NVIC_InitStructure.NVIC_IRQChannel=//USB_HP_CAN1_TX_IRQn接收中断使能NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);/*CANFIFO0messagependinginterruptenable*/CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//使能过滤器中断}作者:描述:CAN发送一标准帧数据voidCAN_Send(unsignedshortintSID,unsignedchardata1,unsignedchardata2,unsignedchardata3,unsignedchardata4,unsignedchardata5,unsignedchardata6,unsignedchardata7)//CAN发送一标准帧数据CanTxMsgTxMessage;CanRxMsgRxMessage;unsignedcharTransmitMailbox;Can_Flag=0;/*transmit1message*/TxMessage.StdId=SID;//0x101;//TxMessage.ExtId=0x1234;TxMessage.RTR=CAN_RTR_DATA;TxMessage.IDE=CAN_ID_STD;TxMessage.DLC=7;TxMessage.Data[0]=data1;TxMessage.Data[1]=data2;//SID;//0x00;//选择数据帧//CAN_ID_EXT;//ID标示符//选择标准帧//data1;//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);*FunctionName*Description*:USB_LP_CAN_RX0_IRQHandler:ThisfunctionhandlesUSBLowPriorityorCANRX0interruptsrequests.*Input*Output*Return:None:None:None/voidUSB_LP_CAN1_RX0_IRQHandler(void)//CAN中断接收程序{CanRxMsgRxMessage;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;}elseret=0;}*//*****
本文档为【STM32F103芯片CAN总线应用程序】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_769254
暂无简介~
格式:doc
大小:16KB
软件:Word
页数:9
分类:
上传时间:2019-09-18
浏览量:0