STM32F103芯片CAN总线应用程序.doc_第1页
STM32F103芯片CAN总线应用程序.doc_第2页
STM32F103芯片CAN总线应用程序.doc_第3页
STM32F103芯片CAN总线应用程序.doc_第4页
STM32F103芯片CAN总线应用程序.doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/* -Copyright(a)-作者:日期:修改记录:描述: STM32共有14组过滤器,用以对接收到的帧进行过滤。每组过滤器包括了2个可配置的32位寄存器:CAN_FxR0和CAN_FxR1。 对于过滤器组,可以将其配置成屏蔽位模式,这样CAN_FxR0中保存的就是标识符匹配值,CAN_FxR1中保存的是屏蔽码, 即CAN_FxR1中如果某一位为1, 则CAN_FxR0中相应的位必须与收到的帧的标志符中的相应位吻合才能通过过滤器;CAN_FxR1中为0的位表示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=(0x06355); /接收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_id16; CAN_FilterInitStructure.CAN_FilterIdLo=(u32)slave_id3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF; CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF; CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF; (注:标准帧数据帧、标准远程帧和扩展远程帧均被过滤) 2、对扩展远程帧过滤:(只接收扩展远程帧) CAN_FilterInitStructure.CAN_FilterIdHigh = (u32)slave_id16; CAN_FilterInitStructure.CAN_FilterIdLow = (u32)slave_id3)|CAN_ID_EXT|CAN_RTR_REMOTE)&0xFFFF; CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF; CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF; 3、对标准远程帧过滤:(只接收标准远程帧) CAN_FilterInitStructure.CAN_FilterIdHigh = (u32)slave_id16; CAN_FilterInitStructure.CAN_FilterIdLow = (u32)slave_id21)|CAN_ID_STD|CAN_RTR_REMOTE)&0xffff; CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF; CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF; 4、对标准数据帧过滤:(只接收标准数据帧) CAN_FilterInitStructure.CAN_FilterIdHigh = (u32)slave_id16; CAN_FilterInitStructure.CAN_FilterIdLow = (u32)slave_id21)|CAN_ID_STD|CAN_RTR_DATA)&0xffff; CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF; CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF; 5、对扩展帧进行过滤:(扩展帧不会被过滤掉) CAN_FilterInitStructure.CAN_FilterIdHigh = (u32)slave_id16; CAN_FilterInitStructure.CAN_FilterIdLow = (u32)slave_id3)|CAN_ID_EXT)&0xFFFF; CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF; CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFC; 6、对标准帧进行过滤:(标准帧不会被过滤掉) CAN_FilterInitStructure.CAN_FilterIdHigh = (u32)slave_id16; CAN_FilterInitStructure.CAN_FilterIdLow = (u32)slave_id21)|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.Data0=data1; /data1; TxMessage.Data1=data2; /data2; TxMessage.Data2=data3; /data3; TxMessage.Data3=data4; /data4; TxMessage.Data4=data5; /data5; TxMessage.Data5=data6; /data6; TxMessage.Data6=data7; /data7;/ TxMessage.Data7=0x00; /data8;TransmitMailbox = CAN_Transmit(CAN1,&TxMessage); while(CAN_TransmitStatus(CAN1,TransmitMailbox) != CANTXOK); Can_Flag = 1; /* receive*/ RxMessage.StdId=0x00; RxMessage.IDE=CA

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论