结合STM32F4关于CAN基本的信息描述

发布者:RadiantWhisper最新更新时间:2023-09-20 来源: elecfans关键字:STM32F4  CAN  编码方式 手机看文章 扫描二维码
随时随地手机看文章

CAN,Controller Area Network(控制器局域网络),在汽车电子、工业控制领域的应用比较多,通常用于局域组网。


CAN总线和UART、I2C、SPI总线最大的区别主要在于取消了传统的地址编码方式,理论上讲总线上的互联节点数不受限制,拥有强大的握手与出错管理及重发机制,具有很强的抗干扰能力。


1

STM32 CAN 基础内容CAN网络中主要由CAN控制器和CAN收发器组成,大部分STM32内部都集成了CAN控制器,如果需要使用CAN功能,还需要在外部连接一个CAN收发器才能使用。

6be1ba8a-92ed-11eb-8b86-12bb97331649.png

▲ CAN 网络拓扑结构

STM32内部集成的CAN控制器,支持 2.0A 和 B 版本的 CAN 协议。还有通信速度更快的CAN FD、 CAN XL,目前一部分STM32支持CAN FD(比如STM32H7)。

下面结合STM32F4描述一下关于CAN基本的信息:

1. CAN总线

CAN总线上的数据是基于差分信号,通常只有两根线:CAN_L和CAN_H。从STM32芯片引出来的两个信号脚CAN发送和CAN接收,有点类似UART的收发引脚,但内部控制逻辑完全不一样。经过CAN收发器后形成两根信号线CAN_L和CAN_H挂到CAN总线上。

2. CAN波特率

CAN 总线属于异步通信,和UART类似,因此具有通信的波特率,标准 CAN 波特率通常支持高达 1 Mb/s。当然,也可以配置成500Kb/s、 250Kb/s等。

CAN 波特率由多个参数决定,下面章节会讲述波特率配置。

3. CAN发送

STM32集成的CAN控制器支持三个发送邮箱,也就是说可以支持队列发送消息(数据),如果同一时间发送数据比较多,使用邮箱就比较高效,不用消耗CPU资源,CAN控制器自动发送,直到完成。

4. CAN接收

和发送类似,CAN接收支持接收FIFO,可以连续接收多个消息(数据),CPU空闲了再去处理接收到的数据。

同时,CAN控制器还支持接收过滤配置,也就是说,有些数据我不需要,CAN控制器可以自动过滤掉。

通过一张CAN框图来认识CAN控制器:

6c0cc37e-92ed-11eb-8b86-12bb97331649.png

关于CAN的更多信息,可以参看芯片对应的手册和CAN相关协议资料。

2

STM32 CAN 常规配置STM32 CAN控制器需要配置的参数比较多,对于初学者而言,重点就是波特率。如果你只使用一些基本的功能,不使用的功能建议参考官方代码默认配置即可。

1. CAN引脚时钟配置

引脚和时钟是使用外设基本的配置,比如F4例程:

GPIO_InitTypeDef GPIO_InitStructure;

RCC_AHB1PeriphClockCmd(CAN_GPIO_CLK, ENABLE);RCC_APB1PeriphClockCmd(CAN_CLK, ENABLE);

GPIO_PinAFConfig(CAN_GPIO_PORT, CAN_RX_SOURCE, CAN_AF_PORT);GPIO_PinAFConfig(CAN_GPIO_PORT, CAN_TX_SOURCE, CAN_AF_PORT);

GPIO_InitStructure.GPIO_Pin = CAN_RX_PIN | CAN_TX_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(CAN_GPIO_PORT, &GPIO_InitStructure);

2. CAN常规配置

这些基本参数,需要进一步功能的作用,默认DISABLE。

CAN_InitTypeDef CAN_InitStructure;

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;CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;

3. CAN波特率配置

波特率是第一步需要掌握的,波特率不对,就不能正常通信。波特率 = 时钟 ÷ Prescaler ÷ (SJW + BS1 + BS2);

比如:42M / 2 / (1 + 12 +8) = 1M

CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;CAN_InitStructure.CAN_BS1 = CAN_BS1_12tq;CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq;CAN_InitStructure.CAN_Prescaler = 2;

4. CAN过滤配置CAN过滤是相对更高级的功能,建议深入了解,否则建议默认配置即可。

CAN_FilterInitTypeDef CAN_FilterInitStructure;CAN_FilterInitStructure.CAN_FilterNumber = 0;CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;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;CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;CAN_FilterInit(&CAN_FilterInitStructure);

以上是通过标准外设库配置的参数,使用STM32CubeMX就可以很轻松的一键配置了。

6c25ad58-92ed-11eb-8b86-12bb97331649.png

对CAN有一定基础了解,同时掌握HAL库使用方法的人,建议直接使用STM32CubemMX 配置并生成初始化代码。

3

STM32 CAN 常见问题STM32的CAN控制器功能相对比较强大,实际开发过程中容易遇到问题,软件硬件都有可能导致通信异常,下面整理几点常见问题。

问题一:CAN总线接线问题

CAN控制器出来的信号为CAN_TX和CAN_RX,有点类似UART,但它和外面的收发器接法是TX对应TX,不是UART交叉连接。

同时,CAN总线和485类似是差分信号,具有极性。通常CAN总线只有两根线CAN_L和CAN_H。

上面指出来的两点,任意一处接线错误都会导致通信失败。所以,建议参考官方给出的电路原理图。

问题二:通信波特率配置问题

CAN属于异步通信,如果波特率不对,就会通信失败,或者接收到乱码。影响波特率的因素有很多:CAN时钟、分频值、位时序。

CAN时钟也就是RCC出来进入CAN控制器的APB时钟,比如上面代码中配置的是APB1,42M时钟。(一定要分清,不能认为是84M)。

6c4437dc-92ed-11eb-8b86-12bb97331649.png

位时序也是比较重要的一个配置,包含同步段、位段等,需要根据实际情况调整对应的值。

6c61bca8-92ed-11eb-8b86-12bb97331649.png

问题三:CAN接收数据丢包问题

通常来说,CAN组网之后,总线上的数据量比较大,如果你配置或者处理不正确,就会导致丢失数据的情况。

1. CAN接收数据,通常使用中断

CAN中断入口和CAN中断函数处理比较容易引起数据丢失的问题。

有些CAN中断入口和其它外设的共用,比如STM32F103的CAN和USB共用一个中断入口。

通信时,由于CAN中断频率较高,中断函数不能占用太多时间,通常来说,只对接收到的数据进行一些简单搬运处理,不建议在中断程序里处理较为复杂的逻辑或算法运算。

2. 双CAN过滤器管理问题

部分STM32芯片具有双CAN模块,从整体功能上讲,两个CAN是独立的。但是,两个CAN共用过滤器管理模块,对于STM32芯片来讲,该过滤器控制模块由CAN1统一管理,所以即使只是单独使用CAN2进行收发,也须开启CAN1,否则会因为过滤器未能开启,导致单独使用CAN2时无法收发的情形。

3.CAN接收过滤

CAN总线接收可以通过配置,对一些“无用”或不需要的信息进行过滤,换言之即对总线上的信息选择性地进行接收。这个功能也算是CAN总线的高级功能,只有深入理解该功能之后方能灵活使用之。否则会因为过滤配置不当导致收发异常。

复盘一下▼CAN 基础内容:CAN总线、波特率、发送和接收;▼CAN 常规配置:引脚时钟、常规配置、波特率配置、过滤配置;▼CAN 常见问题:接线问题、波特率配置问题、接收数据丢包问题;


关键字:STM32F4  CAN  编码方式 引用地址:结合STM32F4关于CAN基本的信息描述

上一篇:使用STM32G474芯片做Half模式的PWM输出
下一篇:一款基于stm32的毕业设计方案

推荐阅读最新更新时间:2024-11-14 11:38

【STM32】STM32F407 + DHT11
一、DHT11简介 DHT11是一款有已校准数字信号输出的温湿度传感器。 其精度湿度±5%RH, 温度±2℃,量程湿度5~95%RH, 温度-20~+60℃。 ——来自百度百科 测量范围:湿度 5~95%RH, 温度 -20~+60℃ 测量精度:湿度 ±5%RH, 温度 ±2℃ 供电电压:3.3~5.5V DC 输 出:单总线数字信号 分辨率:湿度1%RH, 温度0.1℃ 关于单总线协议可以查看这篇文章:【STM32】stm32f407 + DS18B20 碰出不一样的火花 二、编程思路 温湿度传感器 DHT11 和 温度传感器 DS18B20 均采用 单总线协议,因此两者的编程思路很相似,不过 DHT11 增加了湿度
[单片机]
基于CAN总线和传感器实现自攀爬机器人控制系统的软硬件设计
1、引言 随着机器人技术的发展,高层建筑幕墙自动化清洗成为可能。“复杂弧面幕墙清洗机器人开发”为863计划资助项目,机器人设计任务是清洗位于北京长安街的国家大剧院金属和玻璃顶棚。该剧院地处北京市中心,必将成为北京的标志性建筑之一,加之北方的气候条件恶劣,剧院外露墙面的清洗非常重要。 机器人系统应用于高层幕墙清洗作业,工作条件恶劣,面向工程使用无疑要求系统具有更高的安全性和可靠性。因此机器人需要好的控制系统。本文针对曲面高空作业特点,在介绍自攀爬式机器人的机构组成的基础上详细介绍机器人控制硬件系统和结构。 2、国家大剧院结构特点及机器人设计 剧院主体外形呈半椭球形,外墙由玻璃和钛合覆盖,总表面面积达到36000m2
[机器人]
对一款国产3D霍尔传感器的SPI封装
对一款国产的3D霍尔传感器的SPI封装.上 这篇文章完成我们的封装,以及在STM32F4的板子上面测试。 一次费我这么多引脚,我吐了。看来得上IIC,然后就是板子的引脚选择注意在cubuMX里面和实际的板子丝印多次比对,一个中断脚改了两次,气死我了。 BUTT_OUT 管脚用于检测磁铁与芯片之间的按键功能,并且也可以配置为 Trigger 模式,触发单次测量。 INT:主机向芯片发送持续感应模式或单次测量命令,芯片完成一次对应测量项的测量后,INT 脚会置 1,并且在芯片发送读取命令,读回测量数据以前,都保持为 1。主机向芯片发送唤醒睡眠模式命令后,当芯片周围测量项的变化量超出寄存器中设定的变化阈值时,INT 脚会置 1,并且在芯
[单片机]
对一款国产3D霍尔传感器的SPI封装
基于CP2102高速USB2.0-CAN适配卡的设计
引言   控制器局域网(CAN) 是德国BOSCH公司于1986年为解决汽车内部测量与执行部件之间的数据通信而开发的一种串行数据通信协议。它的网络模型结构包括物理层、 数据链路层和应用层,以双绞线为信号传输介质,通信速率最高可达1Mbps ( 40m ),直接传输距离最远可以达到10km/5Kbit/s,每条总线可挂接设备多达110个,特别适用于实时性要求很高的网络。由于其多主的工作方式、优良的稳定性和实时性能、成熟的仲裁和同步技术,加上开放式总线结构、短报文高速通讯、远程通讯能力、超强的纠错和扩展功能,以及控制简单、应用成本低等优点,已经被越来越多地应用到广大网络控制系统领域,并被公认为最有前途的现场总线技术之一。   USB
[嵌入式]
stm32f407按键输入函数
unsigned char KEY_Scan(unsigned char mode) { static unsigned char key_release = 1; if(mode) key_release = 1; if(key_release && (1 == KEY0 || 1 == KEY1)) { delay_ms(10); key_release = 0; if(1 == KEY0) return 1; else if(1 == KEY1) return 2; } else if(0 == KEY0 && 0 == KEY1) key_release
[单片机]
基于CAN总线的重型汽车内轮差预警系统设计
1 内轮差原理 内轮差是车辆转弯时的前内轮的转弯半径与后内轮的转弯半径之差。由于内轮差的存在,车辆转弯时,前、后车轮的运动轨迹不重合。内轮差的大小与转动方向盘的幅度和车辆轴距的长短有关,方向盘转动幅度越大即转向角度越大,内轮差越大,反之越小;车辆的轴距越长,内轮差越大,反之则越小。重型汽车车身都比较长,尤其是车头转过去后,还有很长的车身没有转过来,极易形成大型车辆司机的 视觉盲区 ,路人步入内轮范围后,容易造成生命危险。如图1中的阴影部分为内轮差的形成区域。 图1 内轮差示意图 2 超声波预警原理 2.1超声波测距原理 谐振频率高于20KHZ的声波被称为超声波。超声波为直线传播,频率越高,则绕射能力越弱,反射能
[单片机]
基于<font color='red'>CAN</font>总线的重型汽车内轮差预警系统设计
STM32开发笔记32:STM32F4定时器驱动程序的移植
单片机型号:STM32F401 本文讲述移植STM32CubeMX生成的驱动程序到自己的项目中,以定时器为例。为什么要写这篇文章呢?是因为定时器移植这件事情耗费了我整整2天的时间,只因为一个特殊的地方没有注意到。把整个移植过程用文字记录下来,以利于自身其它程序的移植,并对本文的读者提供一些技术上的参考。 1、如果仅完成计时功能,在STM32CubeMX中设置比较简单,如下图所示,只需指定其时钟源即可。 2、对时钟进行进一步设置,这个在先前的日志中已经描述过,将分频系数与MCU的主频系数设置成一致,例如我现在MCU的主频是72M,则进行72分频即可,这样单位计数周期是1us,按照下图所示,我在Count
[单片机]
STM32开发笔记32:<font color='red'>STM32F4</font>定时器驱动程序的移植
CAN总线通信原理分析
CAN(Controller Area Network)总线,即控制器局域网总线,在工业控制、医疗电子、家用电器及传感器领域都得到了广泛的应用。目前国内外文献中针对CAN总线协议分析的文章主要是针对CAN协议的帧结构以或位时序特性进行分析,如文献鲜有从通信的角度对CAN总线协议进行分析,鲜有从工程应用的角度出发,对CAN总线的通信机制进行深入分析的文章。 1 CAN应用特性及结构构成 CAN总线协议具有两个国际标准,分别是ISO11898和ISO11519。其中,IS011898是通信速率为125 kbps~1 Mbps的高速CAN通信标准,属于闭环总线,总线最大长度为40 m/1 Mbps。ISO11519定义了通信速率为10
[嵌入式]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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