CAN通讯协议详解

news2024/11/18 2:35:31

阅读引言: 本篇博文想给需要的人介绍一下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://www.coloradmin.cn/o/1443373.html

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

相关文章

AI嵌入式K210项目(28)-在线模型训练

文章目录 前言一、平台介绍二、创建项目三、上传数据集图像分类图像检测图片上传压缩包上传 四、新建任务总结 前言 前面我们使用已经训练好的模型在K210开发板上进行了人脸识别,口罩识别,手写数字识别等实验,那么模型除了使用已经训练好的&…

【Make编译控制 01】程序编译与执行

目录 一、编译原理概述 二、编译过程分析 三、编译动静态库 四、执行过程分析 一、编译原理概述 make: 一个GCC工具程序,它会读 makefile 脚本来确定程序中的哪个部分需要编译和连接,然后发布必要的命令。它读出的脚本(叫做 …

机器学习2--逻辑回归(案列)

糖尿病数据线性回归预测 import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.datasets import load_diabetes diabetesload_diabetes() datadiabetes[data] targetdiabetes[target] feature_namesdiabetes[feature_names] data.shape df …

【数据结构】双向链表(链表实现+测试+原码)

前言 在双向链表之前,如果需要查看单链表来复习一下,链接在这里: http://t.csdnimg.cn/Ib5qS 1.双向链表 1.1 链表的分类 实际中链表的结构非常多样,以下情况组合起来就有8种链表结构: 1.1.1 单向或者双向 1.1.2 …

leetcode——滑动窗口题目汇总

本章总结一下滑动窗口的解题思路: 在字符串中使用双指针 left 和 right 围成的一个左闭右开的区域作为一个窗口。不断将 right 向右滑动,直到窗口中的字符串符合条件。此时将 left 向右滑动,直到窗口中的字符串不符合条件,期间需…

PyTorch 2.2 中文官方教程(三)

使用 PyTorch 构建模型 原文:pytorch.org/tutorials/beginner/introyt/modelsyt_tutorial.html 译者:飞龙 协议:CC BY-NC-SA 4.0 注意 点击这里下载完整示例代码 介绍 || 张量 || 自动微分 || 构建模型 || TensorBoard 支持 || 训练模型 ||…

大模型学习笔记二:prompt工程

文章目录 一、经典AI女友Prompt二、prompt怎么做?1)注重格式:2)prompt经典构成3)简单prompt的python询问代码4)python实现订阅手机流量套餐的NLU5)优化一:加入垂直领域推荐6&#xf…

【glyphicon对照表】bootstrap样式可直接使用的图标大全

代码: <ul class="bs-glyphicons"><li><span class="glyphicon glyphicon-adjust"></span><span class="glyphicon-class">.glyphicon .glyphicon-adjust</span></li><li><span class=&qu…

为什么大模型需要向量数据库?

AIGC 时代万物都可以向量化&#xff0c;向量化是 LLM 大模型以及 Agent 应用的基础。 比如&#xff1a;爆火的 Google 大模型 Gemini 1.0 原生支持的多模态&#xff0c;在预训练的时候就是把文本、图片、音频、视频等多模态先进行 token 化&#xff0c;然后构建一维的“语言”…

《Python 网络爬虫简易速速上手小册》第7章:如何绕过反爬虫技术?(2024 最新版)

文章目录 7.1 识别和应对 CAPTCHA7.1.1 重点基础知识讲解7.1.2 重点案例&#xff1a;使用Tesseract OCR识别简单CAPTCHA7.1.3 拓展案例 1&#xff1a;使用深度学习模型识别复杂CAPTCHA7.1.4 拓展案例 2&#xff1a;集成第三方 CAPTCHA 解决服务 7.2 IP 轮换与代理的使用7.2.1 重…

【RabbitMQ(一)】:基本介绍 | 配置安装与快速入门

应该是新年前最后一篇博客了&#xff0c;明天浅浅休息一下&#xff0c;提前祝大家新年快乐捏&#xff01;&#x1f60a;&#x1f60a;&#x1f60a; 01. 基础理解 1.1 同步调用和异步调用 &#x1f449; 同步调用 的时候调用者会 阻塞 等待被调用函数或方法执行完成&#xff…

TELNET 远程终端协议

远程终端协议 TELNET TELNET 是一个简单的远程终端协议&#xff0c;也是互联网的正式标准。 用户用 TELNET 就可在其所在地通过 TCP 连接注册&#xff08;即登录&#xff09;到远地的另一个主机上&#xff08;使用主机名或 IP 地址&#xff09;。 TELNET 能将用户的击键传到…

ubuntu20.04 安装mysql(8.x)

安装mysql命令 sudo apt-get install mysql-server安装完毕后&#xff0c;立即初始化密码 sudo mysql -u root # 初次进入终端无需密码ALTER USER rootlocalhost IDENTIFIED WITH caching_sha2_password BY yourpasswd; # 设置本地root密码设置mysql远程登录 设置远程登录账…

【漏洞复现】EPON上行A8-C政企网关信息泄露漏洞

Nx01 产品简介 EPON上行A8-C政企网关是一款终端产品&#xff0c;提供企业网络解决方案。 Nx02 漏洞描述 EPON上行A8-C政企网关敏感信息泄露漏洞&#xff0c;攻击者通过敏感信息泄露获取管理员密码。 Nx03 产品主页 fofa-query: "ZXECS" && title"Web…

ZOJ 3537 Cake 【区间DP + 凸多边形三角剖分】

Cake 题意 给定平面坐标上的 n n n 个点&#xff0c;如果是凸多边形的话&#xff0c;就用最少的花费把这个多边形剖分成若干个三角形&#xff0c;剖分的线段端点只能是原多边形的顶点&#xff0c;一条线段的花费为&#xff1a; ∣ x i x j ∣ ∣ y i y j ∣ m o d p |x_i…

微信小程序开发学习笔记《16》uni-app框架

微信小程序开发学习笔记《16》uni-app框架 博主正在学习微信小程序开发&#xff0c;希望记录自己学习过程同时与广大网友共同学习讨论。建议仔细阅读uni-app对应官方文档 一、uni-app简介 **uni-app是一个使用Vue.js 开发所有前端应用的框架。**开发者编写一套代码&#xff…

70.SpringMVC怎么和AJAX相互调用的?

70.SpringMVC怎么和AJAX相互调用的&#xff1f; &#xff08;1&#xff09;加入Jackson.jar&#xff08;2&#xff09;在配置文件中配置json的消息转换器.(jackson不需要该配置HttpMessageConverter&#xff09; <!‐‐它就帮我们配置了默认json映射‐‐> <mvc:anno…

NTLM||LM算法lsasswinlogon进程

来填坑了&#xff0c;这篇blog我们就来讲一下mimikatz能抓到开机的密码的原理 1.lsass&&winlogon 不知道大家有没有好奇过&#xff0c;我们每次开机输入密码之后&#xff0c;电脑又怎么知道我们是否输入正确呢&#xff1f; &#xff1a;这就要的得益于我们的两个进程…

【前后端的那些事】webrtc入门demo(代码)

文章目录 前端代码apivue界面 后端modelwebsocketconfigresource 龙年到了&#xff0c;先祝福各位龙年快乐&#xff0c;事业有成&#xff01; 最近在搞webrtc&#xff0c;想到【前后端的那些事】好久都没有更新了&#xff0c;所以打算先把最近编写的小demo发出来。 p2p webrt…

Android 移动应用开发 创建第一个Android项目

文章目录 一、创建第一个Android项目1.1 准备好Android Studio1.2 运行程序1.3 程序结构是什么app下的结构res - 子目录&#xff08;所有图片、布局、字AndroidManifest.xml 有四大组件&#xff0c;程序添加权限声明 Project下的结构 二、开发android时&#xff0c;部分库下载异…