STM32---CAN

2024-03-23 03:10
文章标签 stm32

本文主要是介绍STM32---CAN,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一.CAN协议简介

二.CAN物理层

三.CAN的协议层

1.位时序

2.CAN的报文

四.CAN外设

1.主控制寄存器CAN_MCR

2.位时序寄存器CAN_BTR

3.CAN的发送邮箱 

4.CAN的接收FIFO

5.验收筛选器

五.CAN库函数相关结构体

1.初始化GPIO结构体:

2.初始化CAN结构体

3.发送及接收结构体

4.筛选器结构体

六.写代码

易出错点:


一.CAN协议简介

CAN是Controller Area Network的缩写。它具有高可靠性和错误检查能力,广泛应用在汽车计算机控制系统和环境恶劣,电磁辐射强及振动大的工业环境。

二.CAN物理层

CAN是异步通讯,半双工。有CAN_High和CAN_Low两条通讯信号线共同组成一组差分信号线。

CAN物理层的形式主要分为闭环总线和开环总线网络。

  1. 闭环总线网络:高速,短距离,两端串联120欧的电阻
  2. 开环总线网络:低速,远距离。两根总线独立,不形成闭环,每条线上串联2.2k欧电阻

 什么是差分信号?差分信号又称差模信号。使用差分信号传输时,需要两根线,这两个信号的振幅相等,相位相反,通过两条线的电压差来表示逻辑0和逻辑1.

差分信号的抗干扰性强,共模噪声完全被抵消。它对外部的电磁干扰可以有效抑制。差分信号的时序定位精准。由于差分信号的这些优点,在USB协议,485协议,以太网协议以及CAN协议的物理层中都使用了差分信号传输。

CAN总线上可以挂载多个节点,节点之间的信号经过总线传输。CAN总线对数据内容进行编码,所以网络中的节点数量不受限制,只要总线的负载足够即可,可以通过中继器增强负载。

CAN_Tx和CAN_Rx使用普通的类似TTL的逻辑信号,而CAN_High和CAN_Low是差分信号。收发器起到两种信号相互转换的作用。

在高速CAN协议中,表示逻辑1(隐形电平),电压差为0;表示逻辑0(显性电平),电压差为2V。在CAN协议中,必须使它处于隐形电平或者显性电平。如果同一时间有一个节点是隐形电平(逻辑1),另一个节点是逻辑0(显性电平),类似I2C的线与特性将使它处于显性电平逻辑0的状态。

三.CAN的协议层

CAN没有时钟信号线,节点间使用配置好的波特率进行通讯,还会使用位同步方式来吸收误差。

1.位时序

为了实现位同步,CAN协议把每一个数据位的时序分解成SS,PTS,PBS1,PBS2四段。分解的最小时间单位为Tq。

信号的采样点在PBS1和PBS2之间。

  •  SS:同步段。当检测到信号跳变沿在SS范围内,则表示节点与总线是同步的,采样点是有效的。SS段固定为1Tq.
  • PTS:这个时间段用来补偿网络的物理延时。
  • PBS1:用来补偿边沿阶段的误差,可以加长。
  • PBS2:用来补偿边沿阶段的误差,可以缩短。

举例说明PBS1和PBS2对于位同步的作用:

        当信号跳变的边沿不在SS段内,而是出现在SS段之前时,可以通过缩短PBS2,使得下一次边沿来临时,落在SS段内;当信号跳变边沿出现在SS段之后时,可以通过加长PBS1,使得下一次边沿来临时,落在SS段内。

2.CAN的报文

(1)有哪些种类?

  • 数据帧:向外发送数据
  • 遥控帧:请求数据
  • 错误帧:通知校验错误,请求重新发送上一个数据
  • 过载帧:通知远端节点本节点尚未做好接收准备
  • 帧间隔:将数据帧和遥控帧与前面的帧分离开来

(2)数据帧的结构?

  •  帧起始:1个低电平,用于通知各个节点有数据传输,其他节点通过帧起始信号的电平跳变边沿进行硬同步。
  • 帧结束:7个连续的高电平。
  • 仲裁段:主要内容是ID信息。数据帧有标准格式和扩展格式,区别在于ID信息的长度。
  • 控制段
  1. RTR:远程传输请求位。为1,是遥控帧;为0,是数据帧。
  2. IDE:标识符扩展位。为1,是扩展格式;为0,是标准格式。
  3. SRR:用于代替标准格式的RTR,只用于扩展格式。
  4. r0,r1:默认低电平,是保留位。
  5. DLC:数据长度,表示报文中的数据段有多少个字节。 
  • 数据段:发送的数据,MSB先行。
  • CRC:校验码。当出现错误时,它会像发送节点反馈,利用错误帧请求重新发送。
  • ACK:接收节点发送0表示应答。

ID信息在CAN协议中的作用?

  • ID信息决定数据帧发送的优先级。由于线与特性,当总线上同时出现两个节点竞争主权时,ID信息中首先出现低电平的即为优先者。CAN协议不分配中断优先级或者地址,谁可以优先占有总线由信息的重要性决定,也就是ID信息。
  • ID信息决定其他节点是否会接收这个数据帧。因为在CAN总线上数据都是广播出去的,所以在总线上的所有节点都可以收到其他节点的信息。由于CAN控制器大多具有根据ID信息过滤报文的功能,它通过ID信息来分辨是否是自己要接收的报文。

四.CAN外设

1.主控制寄存器CAN_MCR

  • DBF调试冻结:处于程序调试模式才使用。可以设置CAN处于工作模式还是禁止收发状态,禁止收发时仍可以访问接受FIFO中的数据。
  • TTCM时间触发模式:设置CAN的时间触发通信模式。在此模式下,CAN使用它内部定时器产生时间戳,并把它保存在CAN_RDTxR,CAN_TDTxR寄存器中。可以利用它实现标准分时同步通信功能。
  • ABOM自动离线管理:当节点检测到他发送错误或者接受错误超过一定值时,会自动离线管理。离线状态下,不能接收或者发送。
  • AWUM自动唤醒:在使用软件进入睡眠后,如果使用自动唤醒,在检测到总线活动时,会自动唤醒。
  • NART自动重传:当报文发送失败会自动重传直到成功为止。
  • RFLM锁定模式:锁定接收FIFO。锁定之后,当接收FIFO溢出时,会丢弃下一个接收的报文。若不锁定,则会覆盖掉之前的报文。
  • TXFP报文发送优先级的判定方法:当邮箱中有多个报文需要发送时,控制它是根据报文的ID优先级还是报文存进邮箱的顺序来发送。

2.位时序寄存器CAN_BTR

  • SILM:为0,正常模式;为1,静默模式
  • LBKM:为1,允许回环模式;为0,禁止回环模式

CAN有四种工作模式。由位时序寄存器的SILM和LBKM组合控制。

 静默模式可以用于分析总线上的流量,用于检测。

回环模式可以用于自检。

回环静默模式在热自检的时候使用(自我检查的时候,不会干扰总线)。

在STM32中的位时序:

SYNC_SEG,BS1,BS2三段,采样点位于BS1和BS2交界处。SYNC_SEG的固定长度是1Tq.BS1和BS2的长度SJW可以在位时序寄存器中配置。

波特率:

STM32的CAN1和CAN2挂载在APB1上。APB1总线的最大频率是36MHz。在使用CAN2时,必须打开CAN1的时钟。

3.CAN的发送邮箱 

CAN外设有三个发送邮箱,即最多可以缓存3个待发送报文。 每个发送邮箱中包含有四个寄存器。

  • 标识符寄存器CAN_TIxR(存储待发送报文的ID,扩展ID,IDE位及RTR位),
  • 数据长度控制寄存器CAN_TDTxR(存储待发送报文的DLC段),
  • 低位数据寄存器CAN_TDLxR(存储数据段的低四个字节内容),
  • 高位数据寄存器CAN_TDHxR(存储高四字节的内容)

发送邮箱的工作过程:当需要发送报文时,把报文分解成各个段存储到不同的寄存器中,并对标识符寄存器的发送请求位置1,即可把数据发送出去。

4.CAN的接收FIFO

CAN外设有2个接收FIFO,每个FIFO中有3个邮箱,即最多可以缓存6个接收报文。当接收到报文时,FIFO报文计数器会自增,当报文被读取之后,计数器会自减。和发送邮箱类似,FIFO有四个寄存器。

  • 标识符寄存器CAN_RIxR(存储接收报文的ID,扩展ID,IDE位及RTR位),
  • 数据长度控制寄存器CAN_RDTxR(存储接收报文的DLC段),
  • 低位数据寄存器CAN_RDLxR(存储数据段的低四个字节内容),
  • 高位数据寄存器CAN_RDHxR(存储高四字节的内容)

5.验收筛选器

STM32F103的CAN外设有14个筛选器组,每组有两个寄存器。CAN1和CAN2共用筛选器。筛选器的作用下,节点只接受需要的报文到自己的FIFO中。筛选器可以调整筛选ID的长度和过滤模式

(1)根据筛选ID长度分类:

  • 32位:STDID[10:0],EXTID[17:0],IDE,RTR
  • 16位:STDID[10:0],EXTID[17:15],IDE,RTR

(2)根据过滤方式分为:

  • 标识符列表模式:要求报文与列表中的ID的每一个标识符相同才接收。
  • 掩码模式:只要报文ID中规定的某些位相同,就会被接收。

筛选尺度寄存器CAN_FS1R的FSCx位可以设置工作在32位还是16位;筛选模式寄存器CAN_FM1R的FBMx位可以设置工作在标识符列表模式还是掩码模式。每组筛选器有2个32位寄存器,分别为CAN_FxR1,CAN_FxR2,用来存储要筛选的ID或者掩码。

五.CAN库函数相关结构体

1.初始化GPIO结构体:

因为需要使用引脚的复用功能,所以需要打开AFIO时钟使用GPIO_Remap函数对CAN1选择Remap1方案(参考数据手册表32).

 

为什么需要使用IO的复用功能?

看STM32的CAN电路原理图,Tx和Rx连接到PB8和PB9上,这两个引脚是在重映射条件下才能作为CAN接口使用的。在使用复用功能重映射的引脚配置时,需要打开AFIO的时钟。

2.初始化CAN结构体

3.发送及接收结构体

4.筛选器结构体

六.写代码

回环模式:用于自测。

 

 

 

易出错点:

  1. 引脚使用了重映射,需要打开AFIO的时钟,以及进行GPIO_Remap配置。
  2. CAN模式配置中需要使传输速率为1Mbps。注意BS1,BS2,SJW,分频因子的取值。
  3. 筛选器配置,特别是模式的配置,还有IDHigh,IDLow。
  4. 需要配置NVIC,设置中断优先级;打开CAN的接收中断。对应地,需要在it.c文件里写对应的中断服务函数。中断服务函数中需要对接收到的数据进行ID筛选,决定是否接收。

这篇关于STM32---CAN的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/836950

相关文章

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介  1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 (OTA) 3在线编程(ICP把整个程序都更新掉) 1 系统的Bootloader写死了,只能用串口下载到指定的位置,启动方式也不方便需要配置BOOT引脚触发启动  4 IAP(自己写的Bootloader,实现程序升级) 1 比如蓝牙转串口,

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类

STM32 ADC+DMA导致写FLASH失败

最近用STM32G070系列的ADC+DMA采样时,遇到了一些小坑记录一下; 一、ADC+DMA采样时进入死循环; 解决方法:ADC-dma死循环问题_stm32 adc dma死机-CSDN博客 将ADC的DMA中断调整为最高,且增大ADCHAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, ADC_Buffer_Size); 的ADC_Bu

基于stm32的河流检测系统-单片机毕业设计

文章目录 前言资料获取设计介绍功能介绍具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机设计精品

STM32的使用方法一

注:我采用的是STM32F103RC芯片、相应的电路图和STM32CubeIDE软件这是在STM32CubeIDE软件定义芯片后,所给的必要的代码逻辑,加上了注释 #include "main.h"/* Private variables ---------------------------------------------------------*//* Private function

STM32 HAL CAN通讯 实操

1、简介 相比于串口通讯,对于刚接触CAN通讯的小白来说,CAN通讯相对复杂,看各种视频、帖子理论,总是一知半解。本次通过傻瓜式操作,先实现CAN通讯的交互,以提高小白的信心,也便于自己复习观看。本次以STM32CubeMX进行初始化配置,通过Keil 5软件进行软件设计,通过CAN盒实现进行数据的交互。该流程实际以STM32F0、F1、F3、F4、F7实测好用(理论上都适用),这三种型号单片机

我在高职教STM32——准备HAL库工程模板(1)

新学期开学在即,又要给学生上 STM32 嵌入式课程了。这课上了多年了,一直用的都是标准库来开发,已经驾轻就熟了。人就是这样,有了自己熟悉的舒适圈,就很难做出改变,老师上课也是如此,排斥新课和不熟悉的内容。显然,STM32 的开发,HAL 库已是主流,自己其实也在使用,只不过更换库就意味着教学内容有很大变化,自己也就迟迟没有迈出调整这一步。现在,是时候做出变化了,笔者计划保持教学项