历史上的今天
返回首页

历史上的今天

今天是:2024年10月08日(星期二)

正在发生

2019年10月08日 | STM32F103 CAN总线配置总结

2019-10-08 来源:eefocus

stm32的can总线的配置如下:


      CAN_InitStructure.CAN_TTCM=DISABLE;//禁止时间触发通信模式

      CAN_InitStructure.CAN_ABOM=DISABLE;

      CAN_InitStructure.CAN_AWUM=DISABLE;

      CAN_InitStructure.CAN_NART=DISABLE;//CAN报文只被发送1次,不管发送的结果如何(成功、出错或仲裁丢失) 

      CAN_InitStructure.CAN_RFLM=DISABLE;

      CAN_InitStructure.CAN_TXFP=DISABLE;

      CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;

      //CAN_Mode_LoopBack

      //CAN_Mode_Normal

      CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;

      CAN_InitStructure.CAN_BS1=CAN_BS1_5tq;//1--16

      CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;//1--8

      CAN_InitStructure.CAN_Prescaler=2;

 

      CAN_Init(&CAN_InitStructure);

       /* CAN filter init */

      CAN_FilterInitStructure.CAN_FilterNumber=0;//选择过滤器0

      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//指定过滤器被设置为标识符屏蔽模式

      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;//给出过滤器位宽为32位

下面根据设置的参数不同来决定can总线can总线的配置情况:


1、对扩展数据帧进行过滤:(只接收扩展数据帧)

      CAN_FilterInitStructure.CAN_FilterIdHigh   = (((u32)slave_id<<3)&0xFFFF0000)>>16;

      CAN_FilterInitStructure.CAN_FilterIdLow   = (((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号。

标准帧,扩展帧混合配置:


void CAN_Configuration(void)

{

CAN_InitTypeDef        CAN_InitStructure;

  CAN_FilterInitTypeDef  CAN_FilterInitStructure;

// CAN_DeInit();

RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE); //

RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, ENABLE ); //复位CAN1所有寄存器

 

/* CAN cell init */

CAN_InitStructure.CAN_TTCM=DISABLE;   //ʹÄÜ»òÕß½ûֹʱ¼ä´¥·¢Í¨ÐÅģʽ

CAN_InitStructure.CAN_ABOM=DISABLE;   //ʹÄÜ»òÕß½ûÖ¹×Ô¶¯¹Ø±Õ¹ÜÀí

CAN_InitStructure.CAN_AWUM=DISABLE;   //ʹÄÜ»òÕß½ûÖ¹×Ô¶¯»½ÐÑģʽ

CAN_InitStructure.CAN_NART=ENABLE;//DISABLE;   //使能或禁止自动重传模式

CAN_InitStructure.CAN_RFLM=DISABLE;   //ʹÄÜ»òÕß½ûÖ¹½ÓÊÕFIFOËø¶¨Ä£Ê½

CAN_InitStructure.CAN_TXFP=DISABLE;   //ʹÄÜ»òÕß½ûÖ¹·¢ËÍFIFOÓÅÏȼ¶

CAN_InitStructure.CAN_Mode= CAN_Mode_Normal;   //CANÓ²¼þ¹¤×÷ÔÚÆÕͨģʽÏ CAN_Mode_Normal   CAN_Mode_LoopBack

CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;   //

CAN_InitStructure.CAN_BS1=CAN_BS1_4tq;   //

CAN_InitStructure.CAN_BS2=CAN_BS2_3tq;   //

CAN_InitStructure.CAN_Prescaler=1;   //4000K/(1+1+4)/1 = 500K

CAN_Init(&CAN_InitStructure);

 

#define   ID_REQUEST                          0xf9

  /*第0组滤波器初始化 CAN filter init */

CAN_FilterInitStructure.CAN_FilterNumber = 0;//第0组滤波器

CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;

CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; //一个32位过滤器

CAN_FilterInitStructure.CAN_FilterIdHigh = (((u32)ID_REQUEST<<21)&0xffff0000)>>16;

//(u32)(((CAN_EXT0_ID<<3)&0xFFFF0000)>>16);

CAN_FilterInitStructure.CAN_FilterIdLow =  (((u32)ID_REQUEST<<21)|CAN_ID_STD|CAN_RTR_DATA)&0xffff;

//(u32)(((CAN_EXT0_ID<<3)|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);

/*第1组滤波器初始化 CAN filter init */

CAN_FilterInitStructure.CAN_FilterNumber=1; //第1组滤波器

CAN_FilterInitStructure.CAN_FilterIdHigh=(u32)(((CAN_EXT1_ID<<3)&0xFFFF0000)>>16);

CAN_FilterInitStructure.CAN_FilterIdLow=(u32)(((CAN_EXT1_ID<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF); //Ñ¡Ôñ¹ýÂËÆ÷±êʶºÅ£¨µÍ£©

CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xFFFF;

CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xFFFF;

CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;

CAN_FilterInit(&CAN_FilterInitStructure);

/*µÚ3×éÂ˲¨Æ÷³õʼ»¯CAN filter init */

CAN_FilterInitStructure.CAN_FilterNumber=3; //µÚ3×é¹ýÂËÆ÷

CAN_FilterInitStructure.CAN_FilterIdHigh=(u32)(((CAN_EXT3_ID<<3)&0xFFFF0000)>>16); //Ñ¡Ôñ¹ýÂËÆ÷±êʶºÅ£¨¸ß£©

CAN_FilterInitStructure.CAN_FilterIdLow=(u32)(((CAN_EXT3_ID<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF); //Ñ¡Ôñ¹ýÂËÆ÷±êʶºÅ£¨µÍ£©

CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xFFFF;

CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xFFFF;

CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;

CAN_FilterInit(&CAN_FilterInitStructure);

/*µÚ5×éÂ˲¨Æ÷³õʼ»¯CAN filter init */

CAN_FilterInitStructure.CAN_FilterNumber=5; //µÚ5×é¹ýÂËÆ÷

CAN_FilterInitStructure.CAN_FilterIdHigh=(u32)(((CAN_EXT5_ID<<3)&0xFFFF0000)>>16); //Ñ¡Ôñ¹ýÂËÆ÷±êʶºÅ£¨¸ß£©

CAN_FilterInitStructure.CAN_FilterIdLow=(u32)(((CAN_EXT5_ID<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF); //Ñ¡Ôñ¹ýÂËÆ÷±êʶºÅ£¨µÍ£©

CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xFFFF;

CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xFFFF;

CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;

CAN_FilterInit(&CAN_FilterInitStructure);

/*µÚ6×éÂ˲¨Æ÷³õʼ»¯CAN filter init */

/* CAN_FilterInitStructure.CAN_FilterNumber=6; //µÚ6×é¹ýÂËÆ÷

CAN_FilterInitStructure.CAN_FilterIdHigh=(u32)(((CAN_EXT6_ID<<3)&0xFFFF0000)>>16); //Ñ¡Ôñ¹ýÂËÆ÷±êʶºÅ£¨¸ß£©

CAN_FilterInitStructure.CAN_FilterIdLow=(u32)(((CAN_EXT6_ID<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF); //Ñ¡Ôñ¹ýÂËÆ÷±êʶºÅ£¨µÍ£©

CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xFFFF;

CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xFFFF;

CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;

CAN_FilterInit(&CAN_FilterInitStructure);*/

/*µÚ9×éÂ˲¨Æ÷³õʼ»¯CAN filter init */

/* CAN_FilterInitStructure.CAN_FilterNumber=9; //µÚ9×é¹ýÂËÆ÷

CAN_FilterInitStructure.CAN_FilterIdHigh=(u32)(((CAN_EXT9_ID<<3)&0xFFFF0000)>>16); //Ñ¡Ôñ¹ýÂËÆ÷±êʶºÅ£¨¸ß£©

CAN_FilterInitStructure.CAN_FilterIdLow=(u32)(((CAN_EXT9_ID<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF); //Ñ¡Ôñ¹ýÂËÆ÷±êʶºÅ£¨µÍ£©

CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xFFFF;

CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xFFFF;

CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;

CAN_FilterInit(&CAN_FilterInitStructure);*/

/*µÚ13×éÂ˲¨Æ÷³õʼ»¯CAN filter init */

/* CAN_FilterInitStructure.CAN_FilterNumber=13; //µÚ13×é¹ýÂËÆ÷

CAN_FilterInitStructure.CAN_FilterIdHigh=(u32)(((CAN_EXT13_ID<<3)&0xFFFF0000)>>16); //Ñ¡Ôñ¹ýÂËÆ÷±êʶºÅ£¨¸ß£©

CAN_FilterInitStructure.CAN_FilterIdLow=(u32)(((CAN_EXT13_ID<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF); //Ñ¡Ôñ¹ýÂËÆ÷±êʶºÅ£¨µÍ£©

CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xFFFF;

CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xFFFF;

CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;

CAN_FilterInit(&CAN_FilterInitStructure);*/

  /* CAN FIFO0 message pending interrupt enable */ 

  CAN_ITConfig(CAN_IT_TME, ENABLE);

CAN_ITConfig(CAN_IT_FMP0, ENABLE);

CAN_ITConfig(CAN_IT_FF0, ENABLE);

CAN_ITConfig(CAN_IT_FOV0, ENABLE);

/* CAN_ITConfig(CAN_IT_FMP1, ENABLE);

CAN_ITConfig(CAN_IT_FF1, ENABLE);

CAN_ITConfig(CAN_IT_FOV1, ENABLE);

CAN_ITConfig(CAN_IT_EWG, ENABLE);

CAN_ITConfig(CAN_IT_EPV, ENABLE);

CAN_ITConfig(CAN_IT_BOF, ENABLE);

推荐阅读

史海拾趣

DB Unlimited公司的发展小趣事

DB Unlimited始终将技术创新作为公司发展的核心驱动力。公司不断投入大量资源进行技术研发和创新,推出了多项具有行业领先水平的音频技术。这些技术的推出不仅提升了公司的竞争力,也推动了整个音频行业的发展。DB Unlimited的技术创新能力和成果得到了业界的广泛认可。

Diamond SA公司的发展小趣事

随着技术的不断成熟,Diamond SA公司开始积极拓展市场。他们与全球知名的电子产品制造商建立了合作关系,将自己的芯片技术应用于各种电子设备中。同时,公司还加大了品牌推广力度,通过一系列营销活动提升了品牌知名度和美誉度。随着市场份额的逐步扩大,Diamond SA公司成为了电子行业中的领军企业。

CDI-DIODE公司的发展小趣事

随着市场竞争的加剧,CDI-DIODE公司意识到传统的营销方式已经无法满足市场需求。于是,公司开始尝试新的营销策略,如线上推广、社交媒体营销等。这些创新的营销方式不仅提升了公司的知名度,也增强了与客户的互动和联系,进一步提升了品牌影响力。

DeLorme公司的发展小趣事

DeLorme公司成立于20世纪80年代初,当时正值全球定位系统(GPS)技术快速发展的时期。创始人XXX和XXX看到了GPS技术在户外导航领域的巨大潜力,于是决定投身这一领域。然而,创业初期他们面临了资金短缺、技术瓶颈和市场接受度低等多重挑战。他们通过不断的技术创新、优化产品设计和积极的市场推广,逐渐赢得了消费者的认可,并在行业内树立了良好的口碑。

Antiference公司的发展小趣事

在追求经济效益的同时,Antiference公司始终不忘履行社会责任。公司积极参与环保事业,推动绿色生产,努力降低生产过程中的能耗和排放。此外,Antiference还积极投身公益事业,支持教育事业和扶贫工作,为社会做出了积极贡献。

EMS GmbH公司的发展小趣事

为了进一步提升公司的规模和实力,EMS GmbH公司积极寻求并购和资源整合的机会。通过并购其他具有技术优势和市场资源的公司,EMS GmbH公司能够快速扩大生产规模、提升技术水平和市场份额。同时,公司还注重与被并购公司的资源整合和协同发展,以实现双方的优势互补和互利共赢。这些并购和资源整合的举措使EMS GmbH公司在电子行业中的竞争地位得到了进一步巩固和提升。

请注意,以上故事仅为框架性描述,并未包含具体的细节和数据。在实际撰写时,您可以根据具体情况进行补充和完善。

问答坊 | AI 解惑

读《把时间当作朋友》(九):推迟满足感

《把时间当作朋友》原文: 提出“情商”(Emotional Intelligence)概念的美国著名心理学家戈尔曼 (Daniel Goleman)曾做过一个关于“推迟满足”(delaying gratification) 的实验。 找来一批四岁孩子,给他们每人一块糖,并告诉他们若能等 ...…

查看全部问答>

开关控制LED——ARM的Proteus实验

实验原理ARM的P0.1口接按钮,再通过P0.0控制LED的亮、灭。本实验的电路图以及实验均在上一个实验基础之上修改。其中电路图只多了一个开关。 Proteus仿真电路图 实验步骤略(与上一实验相同) C语言源程序/************************************* ...…

查看全部问答>

车辆主动防碰撞控制系统的设计

一、引言   随着社会的不断进步,汽车正为越来越多的人所使用,而相应的,交通事故也越来越多。全球每年由交通事故造成的人员和财产损失的数目是惊人的,因此,车辆安全问题已引起人们的高度重视。对大量交通事故的分析表明,80%以上的车祸是由 ...…

查看全部问答>

各位大侠,给个CE6下添加CELLCORE组件的完整流程,谢谢

各位大侠,给个CE6下添加CELLCORE组件的完整流程,谢谢。…

查看全部问答>

WINCE的调试信息异常

Loaded symbols for \'D:\\WINCE500\\PBWORKSPACES\\VIA500_FAB\\RELDIR\\CEPC_X86_RELEASE\\ATAPI.DLL\' Unloaded symbols for \'D:\\WINCE500\\PBWORKSPACES\\VIA500_FAB\\RELDIR\\CEPC_X86_RELEASE\\ATAPI.DLL\' Loaded symbols for \'D:\\W ...…

查看全部问答>

关于多文件的组织中的define

刚刚看到了我们的辛大斑竹写的一个帖子,我就把我最近看的一个问题贴出来,程序是我的一个学长写的,一般我们在写单片机程序的时候是把不同功能的文件写成一个模块,即.c文件,然后再写出对应的.h文件作出对外的接口和函数申明,当在别人地方需要使 ...…

查看全部问答>

基于MCF52259的RS232串口-CAN转换器的实现

转来一片小论文关于MCF52259的[local]1[/local]…

查看全部问答>

论坛技术请看,反应几个问题

1、关于TI教室中课程,除了第一个有进度其他的看了,没进度,不知道什么原因,希望能给个解释。 [ 本帖最后由 Sur 于 2013-12-3 21:20 编辑 ]…

查看全部问答>

2013年终企业评估表格---新鲜出炉!

转眼又是年末了,大家都辛苦忙了一年,在这一年里相信有人哭也有人笑.岁末年初也是新旧交替之时,有不少朋友们都忙着找更好的下家。 但换工作总之的有个理由吧,不能感觉他不行就是不行,这也是曾经纠结过我N次的,最近终于做了一个评估表格,拿来 ...…

查看全部问答>