历史上的今天

今天是:2024年09月30日(星期一)

正在发生

2019年09月30日 | 关于STM32F105 双CAN口通信的一些学习心得

发布者:老卫 来源: eefocus关键字:STM32F105  双CAN  通信 手机看文章 扫描二维码
随时随地手机看文章

在项目中用到stm32f105芯片,需要使用到两个CAN口进行通讯,以下是在运行调试过程中出现的问题以及一些解决方法和学习心得。


对GPIO口进行设置

在这里RX使用的是上拉输入,TX是推免输出。这里需要注意的是,在对外设时钟进行设置的时候需要考虑一下CAN口的主从模式。105芯片的CAN2口是从bxCAN,它不能直接的访问SRAM存储器。所以如果在项目中只需要使用CAN2的话,在进行GPIO口外设时钟设置的时候,需要将CAN1的时钟也使能。 如果两个CAN口都有使用到,那么在进行CAN2口设置的时候使能2口的外设时钟就可以了。


设置中断优先级

这里的设置就比较简单,没有什么需要特别注意的地方。设置中断通道、优先级以及子优先级,最后使能中断


    static void CAN_NVIC_Config(void)

    {

        NVIC_InitTypeDef NVIC_InitStructure;

       /* Configure one bit for preemption priority */

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

    /* 中断设置 */

    NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;    //CAN1 RX0中断

        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;    //抢占优先级1

        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;    //子优先级为2

        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

        NVIC_Init(&NVIC_InitStructure);

    }


模式配置

先对相关的寄存器进行初始化。这里主要提一下CAN_MODE以及波特率(CAN_SJW、CAN_BS1、CAN_BS2、CAN_Prescaler)设置时候的一些注意事项


工作方式

CAN口主要有以下几种工作方式,它们的特点如下:


正常模式(CAN_Mode_Normal):可以正常的接收和发送报文

环回模式(CAN_Mode_LoopBack):将CAN口发送的报文当做接收的报文并保存(如果可以通过接收过滤)在接收邮箱里。环回模式可以避免外部影响,用于自测试。

静默模式(CAN_Mode_Silent):可以正常的接收数据帧和远程帧,智能发出隐性位,而不能真正的发出报文。所以,静默模式通常用于分析CAN总线活动,而不会对总线造成影响。

环回静默模式(CAN_Mode_Silent_LoopBack):该模式可用于“热自测试”,像环回模式那样测试CAN口,但却不会影响CANTX和CANRX所连接的整个CAN系统。在环回静默模式下,CANRX引脚与CAN总线断开,同时CANTX引脚被驱动到隐性位状态

波特率设置

波特率的计算公式如下:

CAN 波特率 = RCC_APB1Periph_CAN / Prescaler / (SJW + BS1 + BS2);

RCC_APB1Periph_CAN是CAN控制器外设挂载的APB总线频率;

CAN_Prescaler是CAN预分频系数,设置范围为0-1024;

SJW一般固定为1;

注意以上参数任何一个都不能设为0,否则会乱


过滤器配置

过滤器号:STM32F105芯片复位后默认的0-13号过滤寄存器可以定向到CAN1的 FIFO1或者FIFO0,14-17号定向到CAN2的FIFO1或者FIFO0

过滤模式分为两种。IDMask(标识符屏蔽位模式),特点是不够精准有时候不期望的ID也会通过过滤器,但是允许通过的ID个数会比较多最多无上限;IDList(标识符列表屏蔽模式),特点是可以精准的过滤ID但是数量有限。以下是本人根据CAN2配置的一个过滤器的例程:


  void CAN2_Filter_Config(void)

     {

     

        uint32_t ExtIdArray[4]={ 0x12040080 , 0x12040081 , 0x12000080 , 0x12000081 };

        CAN_FilterInitTypeDef  CAN_FilterInitStructure;

        uint32_t Mask =0 , temp=0 , i=0;

      /*CAN过滤器初始化*/

        /* STM32F105复位后默认的0-13号过滤寄存器可以定向到CAN1的FIFO0或FIFO1,14-17号定向到CAN2的FIFO0或FIFO1*/

      CAN_FilterInitStructure.CAN_FilterNumber = 14; //过滤器组0

        CAN_FilterInitStructure.CAN_FilterMode   =  CAN_FilterMode_IdMask; //工作在标识符屏蔽位模式

      CAN_FilterInitStructure.CAN_FilterScale  = CAN_FilterScale_32bit; //过滤器位宽为单个32位。

      /* 使能报文标示符过滤器按照标示符的内容进行比对过滤,扩展ID不是如下的就抛弃掉,是的话,会存入FIFO0。 */

 

     CAN_FilterInitStructure.CAN_FilterIdHigh= ( (ExtIdArray[0]<<3)&0xFFFF0000 )>>16 ; //要过滤的ID高位 

     CAN_FilterInitStructure.CAN_FilterIdLow= ((ExtIdArray[0]<<3) |CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF; //要过滤的ID低位 

     //计算屏蔽码,ExtIdArray[0]为验证码

     Mask = 0x1FFFFFFF;

     for( i=0;i<4;i++)

     {

         temp = ExtIdArray[i]^(~ExtIdArray[0]);

         Mask &= temp;

     }

     Mask <<=3;

     //计算出的 Mask中置1的位表示与ExtIdArray[0]一样,置0的位表示不关心

     CAN_FilterInitStructure.CAN_FilterMaskIdHigh= (Mask>>16)&0xFFFF; //过滤器高16位每位必须匹配 

     CAN_FilterInitStructure.CAN_FilterMaskIdLow= Mask&0xFFFF; //过滤器低16位每位必须匹配

  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0 ; //过滤器被关联到FIFO0

  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //使能过滤器

  CAN_FilterInit(&CAN_FilterInitStructure);

  /*CAN通信中断使能*/

  CAN_ITConfig(CAN2, CAN_IT_FMP0, ENABLE);

 }

关键字:STM32F105  双CAN  通信 引用地址:关于STM32F105 双CAN口通信的一些学习心得

上一篇:cubemx实现CAN通讯
下一篇:关于由CubeMx 生成stm32f4+freertos,不正常分析之堆栈大小设置

推荐阅读

2018年度中国国际信息通信展览于9月26日至29日在北京国家会议中心举行, 5G,物联网,车联网是本次展览的主要主题。中国信息通信科技集团旗下的大唐电信集团展示了其基于LTE-V的车联网产品和整体解决方案。为了更进一步推动LTE-V产业化落地,此次通信展期间,大唐电信集团的DMD31 LTE-V 通信模组与全球知名测试厂商罗德与施瓦茨公司的CMW500宽带无线综...
在终端需求回暖的影响下,MLCC终于等到了触底反弹的黄金时刻,尤其是5G智能手机正式开启商用信号,对低迷了一整年的MLCC原厂及渠道商来说,无疑是利好面。 自2018年Q3开始至今,MLCC供求经历了“过山车”般的跌宕起伏,2019年全年处于“甩货”清库存的高压时期,然而近期市场传出“风华高科、国巨和华科三家MLCC大厂已经对客户发布暂停接单通知,三星也宣...
本文作者:RISC-V基金会CTO Mark HimelsteinRISC-V已经有十年的历史了。下面我们来看看RISC-V基金会已经完成了什么,以及它是如何通过针对特定计算环境和行业的扩展来向前发展的。RISC-V基金会正在开发一系列可选扩展,旨在以前所未有的新方式支持特定行业以及整个计算行业。本文提供了这些扩展的三个例子:安全、向量和缩减的代码大小。RISC-V最近庆祝了...
聚焦数字赋能,共创可持续未来,罗克韦尔自动化出席世界互联网大会推动制造业高质量发展,共赢数字化未来(2021年9月29日,中国上海)9月27日,2021世界互联网大会“工业互联网的创新与突破”论坛在浙江乌镇隆重开幕。罗克韦尔自动化(中国)有限公司总裁石安应邀出席并参加圆桌对话,聚焦“产业大脑”、“未来工厂”等议题,从多角度出发,为数字经济时代...

史海拾趣

问答坊 | AI 解惑

4*4键盘扫描和按键识别汇编程序

4*4键盘扫描程序,健值采用顺序编码方式,程序有详细注释,并有proteus仿真文件。 [ 本帖最后由 fnsheng 于 2009-6-17 09:16 编辑 ]…

查看全部问答∨

串口不能正确回显

我修改了一个移植到S3C2410目标板的bootloader。烧写到Flash,复位后,在初始化设置的波特率下,终端无回显,在其它波特率下有。请问高手这是什么原因,该如何解决?…

查看全部问答∨

WinCE 5.0

想学习wince 5.0 安装了VS2005 还要安装那些东西? 麻烦尽量说详细点,新手```…

查看全部问答∨

电源技术的进展与电源管理的应用

一、引言 电能是目前人类生产和生活中最重要的一种能源形式。合理、高效、精确和方便地利用电能仍然是人类所面临的重大问题。采用电力电子技术的电源装置给电能的利用带来了革命。在世界范围内,用电总量中经过电力电子装置变换和调节的比例已经成 ...…

查看全部问答∨

如何实现atmega128与plc进行modbus通信

主要是实现plc与atmega128单片机进行modbus通信。单片机如何编程。谢谢各位大侠。…

查看全部问答∨

STM32掉电擦除

在什么地方能更改设置 STM32掉电瞬间的峰值电压过高使其 擦出内部flash 我在关掉电源后 发现内部flash的内容自动全部被擦除了 开始我以为是自己的程序在RAM中运行的 但是我特别的验证了一次 我用三个板子做实验 其中一个是在电源不稳定时候关 ...…

查看全部问答∨

本科组_低功耗 基于MSP430和3G传输的便携式心电监护仪

本帖最后由 paulhyde 于 2014-9-15 03:16 编辑 本科组_低功耗 基于MSP430和3G传输的便携式心电监护仪    …

查看全部问答∨

WinCE注册表永久保存导致系统性能下降解决

当我们终于实现注册表永久保存的时候我们发现我们不得不面对新的问题: 由于注册表要保存到永久存储器(如NAND Flash),每次修改注册表都会去读写NAND Flash , 会严重影响某些应用程序的运行. 比如播放音视频时,会写入很多新的注册表键值,每次 ...…

查看全部问答∨

有关TI蓝牙官方技术群建立

考虑到论坛TI的蓝牙活动正在进行,为了方便大伙技术交流,到时想交流蓝牙技术和参加活动的技术朋友都加入到303514407[backcolor=rgba(255, 255, 255, 0.2)]这个蓝牙技术群。 [ 本帖最后由 wateras1 于 2013-11-21 10:53 编辑 ]…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved