历史上的今天
返回首页

历史上的今天

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

正在发生

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

2019-09-30 来源:eefocus

在项目中用到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);

 }

推荐阅读

史海拾趣

EM Microelectronic-Marin SA公司的发展小趣事

EM Microelectronic-Marin SA,作为斯沃琪集团公司(The Swatch Group)的一部分,自1971年起便开始了对超低功率集成电路的探索。在当时,电子设备的功耗是一个重要的挑战,尤其是在移动和便携式设备中。EM Microelectronic-Marin凭借其前瞻性的技术视野,投入大量资源进行研发,逐渐在行业内建立了低功耗技术的领先地位。

歌尔(Goertek)公司的发展小趣事

1995年,Philips Semiconductors收购了Mikron Graz,这一事件标志着EM Microelectronic-Marin与Philips在半导体领域的深度合作。此后,两家公司共同推动了RFID(射频识别)技术的发展,使其逐渐成为电子行业中不可或缺的一部分。EM Microelectronic-Marin凭借其在低功耗技术方面的优势,为RFID技术提供了强有力的支持。

Cortina Systems Inc公司的发展小趣事

随着RFID技术的广泛应用,制定统一的国际标准变得尤为重要。EM Microelectronic-Marin积极参与了RFID标准制定机构的讨论,与其他企业一起提交了RFID标准建议。这一过程中,公司不断推动技术创新,力求在标准制定中占据有利地位。虽然最终的标准之争结果未知,但EM Microelectronic-Marin的技术实力和创新精神得到了业界的广泛认可。

Crystalfontz America Inc公司的发展小趣事

随着产品技术的不断提升,Crystalfontz America Inc公司开始积极拓展市场。公司通过与各大电子设备制造商建立合作伙伴关系,将产品应用于嵌入式系统、机架式服务器、仪器集群等领域。同时,公司还积极参加各类行业展会和技术交流活动,提升品牌知名度,吸引更多潜在客户。这些举措有效推动了公司市场份额的扩大和业务的快速增长。

Colibrys SA公司的发展小趣事

随着市场的不断扩大和客户需求的多样化,Colibrys逐渐发展成为一站式制造商。公司提供从设计到制造以及最终测试的完整供应链服务,确保客户能够安全、高效地采购到一流性能的MEMS产品。这种服务模式不仅提高了公司的市场竞争力,也赢得了客户的广泛认可和信赖。

FILTRAN公司的发展小趣事

Colibrys SA公司的故事始于2001年,它作为瑞士科技孵化器的衍生公司诞生。瑞士以其精密制造和微机械技术闻名于世,这为Colibrys的起步提供了得天独厚的条件。初期,公司专注于MEMS(微机电系统)技术的研发,凭借对专业知识的深入理解和不懈探索,逐步在行业内崭露头角。

问答坊 | AI 解惑

无形的屏幕

哇,我的电脑屏幕隐形了,成透明的了,这...这...怎么可能?淡定淡定,这不是灵异事件,奥秘来自于墙纸...厌倦了常规的墙纸当屏幕背景,那就看一下这一组怪异墙纸,它们会让你的屏幕变无形。但是事实是,屏幕还在,只不过是视觉欺骗了我们的感觉。 ...…

查看全部问答>

有人知道用920T的盒做个ARM9的板子,大约要多少钱吗?

有人知道用920T的盒做个ARM9的板子,大约要多少钱吗?芯片在哪买?…

查看全部问答>

能否根据windows驱动程序(release bin)编写linux驱动

有没有可能通过反编译等方式生成一个linux驱动 有没有捷径可以走…

查看全部问答>

请教一个简单的C51程序,

#include main() {         TMOD=0X10;         TH1=0XFE;         TL1=0X0C;         TR1=1;         ET1=1;       ...…

查看全部问答>

wince下调用软键盘的问题

在wince下调用软键盘,代码如下 void CRecorderDlg::OnBnClickedButton6() {         // TODO: Add your control notification handler code here         SipShowIM(SIPF_ON);  //Shows&nb ...…

查看全部问答>

在wince 下怎么能读取 一个像素 alpha 通道的值

我想把一个带 透明通道的bitmap作为前景贴到一个不带透明通道的背景bitmap上,试了几种方法 都不理想,包括 TransparentBlt(...),alphablend(...),还使用过maskdc 的方法,都不理想。 前两种方法把我的小的前景,拉伸到跟背景一样大;而且Transpa ...…

查看全部问答>

发个清华蓬远地取模软件

前几天取汉字模从网上下个软件,不太好,就因为取然的格式带H地,我要C语言数组地,以前用过清华蓬远的取模软件,我认为是最好地,今天翻出特发上来,大家共享,我也MARK,省得以后再找不到,呵呵…

查看全部问答>

一个晶振引发的问题

本来是51好板,就是CPU座松了,让同事搞一下变紧,拿回来突然不好用,仿真器上也不好用,本来屏幕可显开机画面,但怎么也搞不定,由于急有找了另一台机器总算把程序实验完,第二天对着这个坏板研究起来,首先是换51的40脚DIP座,小心得很,因为板上 ...…

查看全部问答>

菜农友情为STM32设计一种通用加密方法之原理

今天连续看了两篇关于加密方面的帖子,感觉自己应该友情奉献一回了~~~ 设想一种加密办法,大家看看可行吗? 关于STM32F器件电子签名以及加密问题-请指点 今日方知STM32的UID为96位即12个字节,以前知道STM32内嵌CRC32. 网上在线CRC演算工 ...…

查看全部问答>

急求一个实际应用中的反向比例运算放大电路

简要说明一下放大电路的原理和作用…

查看全部问答>