CAN通讯协议详解

阅读引言: 本篇博文想给需要的人介绍一下CAN总线, 这个也算是我从B站学习记得笔记分享吧也算是。简单的介绍了CAN总线的大致内容, 简述支持CAN功能的STM32的简单使用例程。本视频的中的图片内容均来自B站爱上半导体博主的内容。

CAN高质量教学视频

目录

1.CAN总线详细讲解

2.STM32的CAN总线通信的简单引入



1.CAN总线详细讲解


  • CAN通讯总线的简单介绍

Can 总线应用最多的是汽车领域,Can 是Control every network 的首字母缩写,意思是控制器局域网

控制器局域网, 该通信总线应用最多的是汽车领域。

局域网,想必大家都很熟悉,就是把几台电脑连到一个路由器上, 这样这几台电脑就可以通讯了

那CAN 和这个也类似,这里的控制器在汽车中的专业术语叫Ecu, 电子控制单元

意思是电子控制单元,它可以看作是一台超小型的计算机,它内部集成了供电系统,单片机驱动系统是汽车里面最小的控制模块,为了能让Ecu之间进行通讯,

ECU是汽车中的最小控制单元

为了能让ECU之间能够进行通信, 人们设计了can通讯, 为了减少线束的数量

而如果不使用看总线,ECU之间是点对点通信的, 那将使用数倍长的铜线,而且线数还非常杂乱,而通过Can 这么多Ecu 只需要挂载到看总线上就可以组成局域网通讯了,大大减少了线束的长度,那接下来我们就来说,一下看总线到底是如何通讯的。

  • CAN的通讯实现

要进行看通讯,需要专门的看收发芯片,这是单片机的发送和接收线,它的逻辑一是高电平逻辑理应是低电平,这种普通逻辑我们很好理解

但是经过CAN收发器之后,普通信号就会被转化成差分信号,差分线是用2根线表示一个信号

如果我们使用单片机给CAN收发器发送一个低电平,它的2根线分别输出3.5伏和1.5伏,它们的电压差是两伏,这是显示电平表示逻辑零而当我们给它发送高电平,平时,它的2根线输出的都是2.5伏压差,电压差是零伏,表示逻辑一,这就是差分信号

同样的看收发器,也可以把接收到的差分信号转化成普通电瓶信号,然后再发给单片机,那采用差分信号有什么好处呢?

那这样有什么好处呢?如果只有一根线,但某一点受到干扰,它的电瓶就会发生跳变,这样就会导致传输出现错误,所以不能进行长距离传输,而看通讯采用的差分信号是2根线共同作用

而CAN通讯采用的时两根线共同作用,而且是双脚线缠绕,这样即使是受到干扰,也是2根线同时受到干扰,它们的压差也会保持不变,这样就能保证传递的信息不受干扰,所以看信号可以传输的距离很长,可达1000米

  • CAN的数据帧

那接下来我们来说一下CAN通讯到底在传递什么可以看一下,这是一帧标准的数据帧

第一位是起始位,它一定得是逻辑0

接下来的11位是识别码根据是11位识别码就能知道这一张信息是发给哪一个设备呢,每一个设备都有属于自己的11位识别码

接下来的一位是用来区分数据帧或者远程请求帧,如果是远程请求帧,这一位是一,而我们这是一串数据帧,这里就必须得是零

接下来的6位是控制码,它是控制数据长度的,先说它的第一位, IDE位,第一位用来区分标准格式和拓展格式,

在标准格式当中,有11位识别码,这一位是逻辑零而在拓展格式中,它的识别码有11位,这一位是逻辑0

下面一位是预留位,它是逻辑零

接下来的4位是DLC 位及数据长度代码,它的二进制编码是零到八,

如果是一则后面的数据位,就只有一个字节8位,而如果它的值是八则后面的数据位就是8个字节64位

接下来是16位Crc 码及循环冗余校验位,它是为了确保数据的准确性而设置的,首先是15位Crc 校验码设备接收端会根据数据计算出它的Crc 位,如果计算出来的和接收到的Crc 不一致,说明数据存在问题,就会重新发送一遍,数据帧下面一位是Crc 的界定符,他是逻辑一目的是为了把后面的信息隔开

然后是2位Ac k 码,第一位是Ac k 确认操发送端发送的是逻辑一而接收端,回复的是逻辑0应来表示应答,第2位是Ac k 界定位,它一定是逻辑一作用是把后面的数据隔开

最后是7位结束位,这7位都是逻辑一表示数据帧传输结束

这就是一串标准数据帧,如果用差分信号表示它的电瓶是这样的。

因为看总线上挂载了很多设备,如果是2个设备同时发送信息,此时哪一个设备发送的信息优先呢,这就得看11位的识别码了,它不仅是设备的唯一识别码,而且还代表了优先级,比如这两帧数据是同时发出的

应该以哪一个为准呢,当总线上同时出现逻辑零和逻辑一的时候,总线会被制为逻辑零,此后上面那个数据帧就不会再发送了好了,这就是我对开通讯的理解,希望对你理解有帮助


2.STM32的CAN总线通信的简单引入


CAN(Controller Area Network)是一种高级串行通信总线,常用于工业控制、汽车电子等领域。STM32微控制器系列中的许多型号都内置了CAN控制器,能够方便地实现CAN总线通信。本文将介绍STM32的CAN总线通信原理以及如何在STM32上实现CAN通信的方法。

CAN总线通信基本原理:

CAN总线是一种基于多主机、分布式、多节点的串行通信系统,支持高速数据传输和优先级控制。CAN总线使用两根不同的线路:CANH和CANL,以差分信号的形式传输数据。CAN总线采用CSMA/CD(Carrier Sense Multiple Access/Collision Detection)的冲突检测机制,可以避免冲突发生。

要在STM32上实现CAN总线通信,首先需要对CAN硬件进行配置和初始化,然后可以使用相应的API函数进行数据的发送和接收。

img

以下是一个使用STM32的CAN总线实现数据发送和接收的示例代码:

#include "stm32xxxx.h"
​
CAN_HandleTypeDef hcan1;
​
void CAN_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct;// 使能CAN时钟__HAL_RCC_CAN1_CLK_ENABLE();// 配置CAN引脚GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_12;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;GPIO_InitStruct.Alternate = GPIO_AF_CAN1;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);// 配置CAN控制器hcan1.Instance = CAN1;hcan1.Init.Mode = CAN_MODE_NORMAL;hcan1.Init.AutoBusOff = ENABLE;hcan1.Init.AutoWakeUp = DISABLE;hcan1.Init.AutoRetransmission = DISABLE;hcan1.Init.ReceiveFifoLocked = DISABLE;hcan1.Init.TransmitFifoPriority = DISABLE;hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;hcan1.Init.TimeSeg1 = CAN_BS1_3TQ;hcan1.Init.TimeSeg2 = CAN_BS2_2TQ;HAL_CAN_Init(&hcan1);
}
​
void CAN_SendData(uint8_t* pData, uint32_t size)
{CAN_TxHeaderTypeDef TxHeader;TxHeader.StdId = 0x123;TxHeader.ExtId = 0;TxHeader.IDE = CAN_ID_STD;TxHeader.RTR = CAN_RTR_DATA;TxHeader.DLC = size;TxHeader.TransmitGlobalTime = DISABLE;uint32_t TxMailbox;HAL_CAN_AddTxMessage(&hcan1, &TxHeader, pData, &TxMailbox);// 等待发送完成while (HAL_CAN_GetTxMailboxesFreeLevel(&hcan1) != 3) {}
}
​
void CAN_ReceiveData(void)
{CAN_RxHeaderTypeDef RxHeader;uint8_t RxData[8];HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &RxHeader, RxData);// 处理接收到的数据
}
​
int main(void)
{HAL_Init();CAN_Init();while (1){// 主循环代码// 发送数据uint8_t data[8] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};CAN_SendData(data, sizeof(data));// 接收数据CAN_ReceiveData();}
}

在上述代码中,我们首先初始化了CAN硬件(通过CAN_Init函数)。然后,我们使用HAL_CAN_AddTxMessage函数发送数据,使用HAL_CAN_GetRxMessage函数接收数据。在主循环中,我们可以编写其他代码并调用CAN_SendData和CAN_ReceiveData函数来进行数据的发送和接收。

通过配置CAN的控制器和引脚,以及编写相应的代码,我们可以轻松地在STM32上实现CAN总线通信。使用CAN总线可以实现高速的分布式数据通信,适用于许多应用领域,如工业控制、汽车电子等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2775399.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

问题:在填制记账凭时,应注意以下几个方面:( ) #知识分享#其他

问题:在填制记账凭时,应注意以下几个方面:( ) A:记账凭证各项内容必须完整 B:必须以审核无误的原始凭证为依据 C:记账凭证应连续编号 D:记账凭证的书写应清楚、规范。 参考答案如图所示

C++算法之双指针、BFS和图论

一、双指针 1.AcWing 1238.日志统计 分析思路 前一区间和后一区间有大部分是存在重复的 我们要做的就是利用这部分 来缩短我们查询的时间 并且在使用双指针时要注意对所有的博客记录按时间从小到大先排好顺序 因为在有序的区间内才能使用双指针记录两个区间相差 相当于把一个…

Leecode之随机链表的复制

一.题目及剖析 https://leetcode.cn/problems/copy-list-with-random-pointer/ 这个题目的意思就是拷贝一份复杂链表,难点在于它的random指针所指向的空间与拷贝下来的链表之间缺少一种联系,当然可以用遍历链表的方式通过value去找那块空间,不过时间复杂度太高. 二.思路引入 …

Redis Centos7 安装到启动

文章目录 安装Redis启动redis查看redis状况连接redis服务端 安装Redis 1.下载scl源 yum install centos-release-scl-rh2.下载redis yum install rh-redis5-redis 3. 创建软连接 1.cd /usr/bin 2. In -s /opt/rh/rh-redis5/root/usr/bin/redis-server ./redis-server 3. …

Ajax+JSON学习一

AjaxJSON学习一 文章目录 前言一、Ajax简介1.1. Ajax基础1.2. 同源策略 二、Ajax的核心技术2.1. XMLHttpRequest 类2.2. open指定请求2.3. setRequestHeader 设置请求头2.4. send发送请求主体2.5. Ajax取得响应 总结 前言 一、Ajax简介 1.1. Ajax基础 Ajax 的全称是 Asynchron…

雾计算:去中心化计算的未来之旅

雾计算是去中心化计算的基石,它将重塑我们的数字格局。通过使计算和存储更接近数据源,它改变了我们处理物联网生成数据的方式。通过雾计算探索未来,揭示了减少延迟、增强隐私和高效网络利用等好处。 随着传感器和可穿戴设备等物联网设备的数…

5.常量和数据类型(数字类型,字符串类型,模板字符串,布尔类型undefined,null检测数据类型),类型转化

什么是常量 常量就是不能改变的量&#xff0c;就是向计算机内存要一款空间然后存储的东西不能改变用const声明并且一定要初始化值 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-C…

基于LightGBM的回归任务案例

在本文中&#xff0c;我们将学习先进的机器学习模型之一&#xff1a;Lightgbm。在对XGB模型进行了越来越多的改进以获得更好的性能之后&#xff0c;XGBoost是一种极限梯度提升机器&#xff0c;但通过lightgbm&#xff0c;我们可以在没有太多计算的情况下实现类似或更好的结果&a…

【C++修行之道】(引用、函数提高)

目录 一、引用 1.1引用的基本使用 1.2 引用注意事项 1.3 引用做函数参数 1.4 引用做函数返回值 1.5 引用的本质 1.6 常量引用 1.7引用和指针的区别 二、函数提高 2.1 函数默认参数 2.2函数占位参数 2.3 函数重载 2.4函数重载注意事项 一、引用 1.1引用的基本使用 …

Ubuntu22.04 gnome-builder gnome C 应用程序习练笔记(二)

gnome-builder创建的程序&#xff0c;在工程树中有三个重要程序&#xff1a;main主程序、application应用程序和window主窗口程序。main整个程序的起始&#xff0c;它会操作application生产应用环境&#xff0c;application会操作window生成主窗口&#xff0c;于是就有了 appli…

Zookeeper集群搭建(3台)

准备工作 1、提前安装好hadoop102、hadoop103、hadoop104三台机器&#xff0c;参照&#xff1a;CentOS7集群环境搭建&#xff08;3台&#xff09;-CSDN博客 2、提前下载好Zookeeper安装包并上传到/opt/software上、安装包&#xff0c;链接&#xff1a;https://pan.baidu.com/…

Xcode配置GLFW GLAD (MAC)

这里的GLFW用的是静态链接 博主反复修改&#xff0c;实在是没能找到为什么用动态会出现线程报错 下载GLAD:版本我一般是选倒数第二新&#xff0c;profile记得选core 点击GENRATE 点glad.zip获得下载 下载GLFW 点击download 最后&#xff0c;将两个文件都放到项目里面去 打开…

深入理解Netty及核心组件使用—上

目录 Netty的优势 为什么Netty使用NIO而不是AIO&#xff1f; Netty基本组件 Bootstrap、EventLoop(Group) 、Channel 事件和 ChannelHandler、ChannelPipeline ChannelFuture Netty入门程序 服务端代码 客户端代码 运行结果 Netty的优势 1. API 使用简单&#xff0c…

用HTML5实现灯笼效果

本文介绍了两种实现效果&#xff1a;一种使用画布&#xff08;canvas&#xff09;标签/元素&#xff0c;另一种不用画布&#xff08;canvas&#xff09;标签/元素主要使用CSS实现。 使用画布&#xff08;canvas&#xff09;标签/元素实现&#xff0c;下面&#xff0c;在画布上…

Transformer实战-系列教程13:DETR 算法解读

&#x1f6a9;&#x1f6a9;&#x1f6a9;Transformer实战-系列教程总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 点我下载源码 1、物体检测 说到目标检测你能想到什么 faster-rcnn系列&#xff0c;开山之作&…

基于 Python opencv 的人脸识别的酒店客房入侵系统的检测

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

【深度学习:掌握监督学习】掌握监督学习综合指南

【深度学习&#xff1a;掌握监督学习】掌握监督学习综合指南 监督学习的定义和简要说明监督学习在人工智能中的重要性和相关性概述什么是监督学习&#xff1f;基本概念主要组件&#xff1a;输入要素和目标标签 训练监督式学习模型监督学习算法的类型分类回归每个类别中的流行算…

Rust 格式化输出

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、format! 宏二、fmt::Debug三、fmt::Display四、? 操作符 循环打印 前言 Rust学习系列-本文根据教程学习Rust的格式化输出&#xff0c;包括fmt::Debug&…

3.4-媒资管理之视频处理+xx-job分布式任务

文章目录 媒资管理6 视频处理6.1 需求6.1.1 总体需求6.7.3 FFmpeg 的基本使用6.7.4 视频处理工具类 6.2 分布式任务处理6.2.1 什么是分布式任务调度6.2.2 XXL-JOB介绍6.2.3 搭建XXL-JOB6.2.3.1 调度中心6.2.3.2 执行器6.2.3.3 执行任务 6.2.4 分片广播 6.3 技术方案6.3.1 作业分…

【博云2023】乘龙一跃腾云海,侧目抬手摘星河

癸卯渐远&#xff0c;甲辰渐至&#xff0c;预示着被汗水浇灌的种子&#xff0c;必将顶开冻土&#xff0c;迎接阳光。 每逢春节&#xff0c;当亲友彼此问候&#xff0c;博云人总能自豪地说&#xff0c;我们认真地、努力地奋斗&#xff0c;让我们能自信地踏上新的征程。 我们的…