STM32个人笔记-CAN总线通讯

news2024/10/5 20:18:56

笔记来源于STM32F103VET6,野火指南者,中文参考手册,HAL库开发手册和b站的野火指南者视频。观看过好多次了,但往往理解得不够全面,现记下小笔记,用来回顾。属于个人笔记。​​​​​ 

大四实习那年记忆颇深,进入一家船载通讯的公司当嵌入式软件工程师实习生,学习的内容一部分正是CAN和J1939。虽然实习期间匆匆忙忙缝缝补补,但现在还是按着流程学一遍。

CAN协议广泛用于汽车控制服务行业。

CAN物理层:闭环总线和开环总线。

异步通讯,半双工(只有1队差分线,在一个时刻只能表示一个信号),只有两根信号线,CAN_HighCAN_Low两条数据线,共同构成一组差分信号线,以差分信号的形式进行通讯(CAN的可靠性主要来源)

闭环总线网络

适用于高速短距离通讯。总线最大长度为40M通信速度最高1Mbps(并非很高,多用汽车行业),总线两端各要求有一个“120欧”的电阻

开环总线网络

适用于低速远距离通讯。总线最大长度为1KM通信速度最高125kbps,两端总线是独立的、不形成闭环,要求每根总线上各串联一个“2.2千欧”的电阻

通讯节点 

CAN总线上可以挂载多个通讯节点,节点之间的信号经过总线传输,实现节点间通讯。由于CAN通讯协议不对节点进行地址编码,而是对数据内容进行编码,所以网络中的节点个数理论上不受限制,只要总线的负载足够即可,可以通过中继器增强负载。

CAN通讯节点由一个CAN控制器及CAN收发器组成,控制器和收发器之间通过CAN_Tx和CAN_Rx信号线相连,收发器与CAN总线之间使用CAN_High及CAN_Low信号线相连。其中CAN_Tx和CAN_Rx信号线使用普通的类似TTL逻辑信号,而CAN_High及CAN_Low信号线是一对差分信号线,使用比较特别的差分信号。

当CAN节点需要发送数据时,控制器把要发送的二进制编码通过CAN_Tx线发送到收发器,然后由收发器把这个普通的逻辑电平信号转化成差分信号,通过差分线CAN_High和CAN_Low输出到CAN总线网络。而通过收发器接收总线上的数据到控制器时,收发器把总线上收到的CAN_High和CAN_Low信号转换成普通的逻辑电平信号,通过CAN_Rx输出到控制器中。

差分信号(差模信号)

使用差分信号传输时,需要两根信号线,这两个信号线的振幅相等,相位相反,通过两根信号线的电压差值来表示逻辑0和逻辑1。

相对于单信号线传输的方式,使用差分信号传输具有以下优点:

抗干扰性强。当外界存在噪声干扰时,几乎会同时耦合到两条信号线上,而接收端只关心两个信号的差值,所有外界的共模噪声可以被完全抵消。

能有效抑制它对外部的电磁干扰。由于两根信号的极性相反,它们对外辐射的电磁场可以相互抵消,耦合的越紧密,泄放到外界的电磁能量越少。

时序定位精确。由于差分信号的开关变化是位于两个信号的交点,而不像普通单端信号依靠高低两个阈值电压判断,因而受工艺、温度的影响小,能降低时序上的误差,同时也更适合于低幅度信号的电路。

由于差分信号线具有这些优点,所以在USB协议、485协议、以太网协议和CAN协议的物理层中,都使用了差分信号传输。

在CAN总线中,必须使它处于隐性电平(逻辑1)或显性电平 (逻辑0)中的其中一个状态。

假如有两个CAN通讯节点,在同一时间,一个节点输出隐性电平,另一个输出显性电平,类似于I2C总线的"线与"特性将使它处于显性电平状态。

显性电平的名字就是这样来的,即可以认为显性具有优先的意味。

在CAN的通讯网络中,因为共用总线,在整个网络中同一时刻只能有一个通讯节点发送信号,其余的节点在该时刻都只能接收。

CAN协议层

节点间除了使用约定好的波特率进行通讯,也会使用“位同步”的方式来抗干扰、吸收误差,实现对总线电平信号进行正确的采样,确保通讯正常。

位时序分解

为了实现位同步,CAN协议把每一个数据位的时序分解成SS段、PTS段、PBS1段和PBS2段,这四段的长度加起来即为一个CAN数据位的长度。分解后最小的时间单位是Tq,而一个完整的位由8~25个Tq组成。

信号的采样点位于PBS1段和PBS2段之间,通过控制各段的长度,可以对采样点的位置进行偏移,以便准确地采样。

SS段(SYNC SEG,同步段)。若通讯节点检测到总线上信号的跳变沿被包含在SS段的范围之内,则表示节点与总线的时序是同步的,当节点和总线同步时,采样点采集到的总线电平即可被确定为该位的电平。SS段的大小固定为1Tq。

PTS段(PROP SER,传播时间段)。用来补偿网络的物理延时时间。是总线上输入比较器延时和输出驱动器延时总和的两倍。PTS段的大小可以为1~8Tq。这概念看看就行,在STM32中,PTS段和PBS1段合在一起的。

PBS1段(PHASE SER1,相位缓冲段)。用来补偿边沿阶段的误差,它的时间长度在重新同步的时候可以加长。PBS1段的初始大小可以为1~8Tq。这概念看看就行,在STM32中,PTS段和PBS1段合在一起的。

PBS2段(PHASE SER2,相位缓冲段)。用来补偿边沿阶段的误差,它的时间长度在重新同步的时候可以缩短。PBS1段的初始大小可以为2~8Tq。

总线上的各个通讯节点只要约定好1个Tq的时间长度和每一个数据位占据多少个Tq,就可以确定CAN通讯的波特率。

例如,假设上图中的1Tq=1us,而每个数据位由19个Tq组成,则传输一位数据需要时间T1=19us,从而每秒可以传输的数据位个数为:1*16^6/19=52631.6(bps),这个每秒可传输的数据位的个数即为通讯中的波特率。

CAN的报文

当使用CAN协议进行通讯时,需要对数据、操作命令(如读/写)和同步信号进行打包,打包后的这些内容称为报文。

在原始数据段的前面加上传输起始标签、片选(识别)标签和控制标签,在数据的尾段加上CRC校验标签、应答标签和传输结束标签。把这些内容按特定的格式打包好,就可以用一个通道表达各种信号,各种各样的标签就如同SPI中各种通道上的信号,起到了协调传输的作用。当整个数据包被传输到其他设备时,只要这些设备按格式去解读,就能还原出原始数据,这样的报文就被称为CAN的“数据帧”。

为了更有效地控制通讯,CAN一共规定了5种类型的帧。

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

数据帧

数据帧以一个显性位(逻辑0)开始,以7个连续的隐性位(逻辑1)结束。

帧开始(SOF段,Start Of Frame)。帧起始信号只有一个数据位,是一个显性电平,用于通知各个节点将有效数据传输,其它节点通过帧开始信号的电平跳变沿来进行硬同步。

仲裁段。当同时有两个报文被发送时,总线会根据仲裁段的内容决定哪个数据包能被传输。仲裁段的主要内容为本数据帧的ID信息(标识符)。数据帧具有标准格式和扩展格式两种,区别就在于ID信息的长度。标准格式的ID为11位,扩展格式的ID为29位,扩展格式ID是在标准格式ID的基础上多出18位。

在CAN协议中,ID决定着数据帧发送的优先级,也决定着其它节点是否会接收这个数据帧。CAN协议不对挂载在它之上的节点分配优先级和地址,对总线的占有权是由信息的重要性决定的,即对于重要的信息,可给它打包成一个优先级高的ID,使它能够及时地发送出去。

RTR位(Remote Transmission Request Bit,远程传输请求位)。用于区分数据帧和遥控帧。当它为显性电平时表示数据帧,隐性电平时表示遥控帧。

IDE位(ID Extension Bit,标识符扩展位)。用于区分标准格式和扩展格式。当它为显性电平时表示标准格式,隐性电平时表示扩展格式。

SRR位(Substitute Remote Request Bit)。只存在于扩展格式,用于替代标准格式中的RTR位。由于扩展帧中的SRR位为隐性位,RTR在数据帧为显性位,所以在两个ID相同的标准格式报文与扩展格式报文中,标准格式的优先级较高。

控制段。在控制段中的r1和r0为保留位,默认设置为显性位。它最主要的是DLC段(Data Length Code,数据长度码),由4个数据位组成,用于表示本报文中的数据段含有多少个字节,DLC段表示的数字为0~8。

数据段。由0~8个字节组成,MSB先行。

CAN外设

STM32芯片中具有bxCAN(Basic Extended CAN),它支持CAN协议2.0A和2.0B标准。

外设中有三个发送邮箱,发送报文的优先级可以使用软件控制,还可以记录发送的时间;

具有两个3级深度的接收FIFO,可使用过滤功能只接收或不接收某些ID号的报文;

可配置成自动重发;

不支持使用DMA进行数据收发。

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

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

相关文章

基于Java+Springboot+Vue+elememt宠物用品商城系统设计实现

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取联系🍅精彩专栏推荐订阅👇&#x1f…

K线形态识别_空方尖兵

写在前面: 1. 本文中提到的“K线形态查看工具”的具体使用操作请查看该博文; 2. K线形体所处背景,诸如处在上升趋势、下降趋势、盘整等,背景内容在K线形态策略代码中没有体现; 3. 文中知识内容来自书籍《K线技术分析》…

第九章 内置模块

目录 第九章 内置模块 1.math模块 1.查看: 2.常用方法: 2.random模块 1.查看: ​2.例: 3.random(a,b) 4.random.sample(range(0,20),10) 3.os模块与os.path模块 1.作用 2.目录 3.os模块与操作系统的关系 4.路径 5.判…

自我实现tcmalloc的项目简化版本

项目介绍 该项目是基于现代多核多线程的开发环境和谷歌项目原型tcmalloc的自我实现的简化版本,相比于本身就比较优秀的malloc来说,能够略胜一筹,因为其考虑了 性能,多线程环境,锁竞争和内存碎片的问题,主要利用了池化思想来管理内存分配,对于每个线程,都有自己的私…

鸿蒙开发套件全面升级,助力鸿蒙生态蓬勃发展

目录 1. 全场景分布式系统 2. HarmonyOS的超能力:ArkTS API万箭齐发 3.解锁“鸿蒙开发套件”的新技能 (1) 智能代码编辑器 (2)Hvigor编译构建 (3)热重载:向看直播一样查看运行…

MySQL : 彻底搞懂一条SQL的执行过程

整体流程 组件介绍 连接器 处理客户端的连接,一般处理我们这个命令,判断是否满足接入server的条件 mysql ‐h host[数据库地址] ‐u root[用户] ‐p root[密码] ‐P root查询缓存 在8.0之前,如果用户开启了查询缓存的开关,那么…

vue2.6 + ts 使用vuex

目录vue2.6 ts 使用vuex安装01:直接使用 store / index.ts的数据store / index.tsmain.ts001:同步mutation操作vuex数据与获取getters001:效果002:异步action、mutation操作vuex数据002:效果02:引入其他模…

CANoe 简介

🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】🍅 玩转CANoe&…

Go 语言项目源码解析:定时任务库 cron

环境准备 首先我们将源码克隆(Fork)为自己的个人仓库,只需要在 GitHub 项目主页点击 Fork 按钮,然后输入项目名称点击确认即可。克隆完毕后,可以下载到本地,或者直接在科隆后的 GitHub 仓库主页上点击 Cre…

RabbitMQ

RabbitMQ 1.MQ引言 MessageQueue: 消息队列 模块之间的耦合度多高,导致一个模块宕机后,全部功能都不能用了,并且同步通讯的成本过高,用户体验差。 1.1什么是MQ MQ(Message Queue)消息队列,是基…

Android Studio App开发实战项目之广告轮播(附源码 可用于大作业)

需要图片集和源码请点赞关注收藏后评论区留言即可~~~ 电商App的首页上方,都在明显位置放了一栏广告条,并且广告条会轮播,非常吸引眼球,这种广告轮播的功能,为推广热门事物出力甚大。 轮播视频已上传至我的主页&#x…

【云原生】docker 搭建ElasticSearch7

前言 本篇演示如何基于docker环境快速搭建起es7的环境 安装es7.6 1、拉取镜像 docker pull elasticsearch:7.6.2 2、执行下面的命令进行安装 docker run -p 9200:9200 -p 9300:9300 -e "discovery.typesingle-node" -e ES_JAVA_OPTS"-Xms512m -Xmx512m"…

Android Studio App开发实战项目之计时器(附源码 简单易懂,适合新手学习)

运行有问题或需要源码请点赞关注收藏后评论区留言~~~ 一、Handler的延迟机制 活动页面的Java代码通常是串行工作的,而且App界面很快就加载完成容不得半点延迟,不过偶尔也需要某些控件时不时的动一下,好让界面呈现动画效果更加活泼&#xff0…

shiro框架04会话管理+缓存管理+Ehcache使用

目录 一、会话管理 1.基础组件 1.1 SessionManager 1.2 SessionListener 1.3 SessionDao 1.4 会话验证 1.5 案例 二、缓存管理 1、为什么要使用缓存 2、什么是ehcache 3、ehcache特点 4、ehcache入门 5、shiro与ehcache整合 1)导入相关依赖&#xff0…

2019银川F,ccpc威海D - Sternhalma 2022

1401D - Maximum Distributed Tree 求每个边经过的次数,假设求u,v这条边的次数,边的左端是u这个集合一共有n-siz[v]个点,右端是v这个集合有siz[v]个端点,经过这条边的次数就是siz[v]*(n-siz[v]),然后再按照次数多的乘以大的质因数…

【附源码】Python计算机毕业设计汽车租赁管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

Go 语言中的 Moduels 管理(Let‘s Go 三十四)

在 Go 1.11以前使用包管理一直被开发者所诟病。既然GOPATH这种包管理引起了一线开发者的一片骂声,所以,Go官方体恤一线开发者对GOPATH这种包管理的情绪,一直致力努力提供对一线开发者友好的包管理解决方法而奋斗。从最初的GOPATH到GO VENDOR&…

基于遗传算法、元胞自动机邻域和随机重启爬山混合优化算法(GA-RRHC)的柔性车间调度研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

LeetCode50天刷题计划第二季(Day 27 — 寻找旋转排序数组中的最小值(9.50- 11.20)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、题目寻找旋转排序数组中的最小值示例提示:二、思路三、代码前言 芜湖 一、题目 寻找旋转排序数组中的最小值 已知一个长度为 n 的数组&#…

web前端期末大作业——基于HTML+CSS+JavaScript实现中国茶文化(30页)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…