CAN协议

news2024/9/19 23:57:58

CAN总线特点:

  1. 多主机多从机

串行异步通讯、没时钟线

    2.只有CAN_HIGH和CAN_LOW两条差分信号

3.连接方式多个节点挂在总线上,比较类似I2C总线,可以再SCL和SDA上挂载多个从

 

4.每个设备都是一个节点Node,节点直接可以相互通讯,相较于I2C总线,CAN线设置了终端电阻,常见的一种闭环连接模式,也有开环的连接模式

CAN的拓扑结构

(1)高速CAN

 

(2)低速CAN,通讯的最大带宽从1Mbps降到125Kbps,并且不再在总线的起点和重点使用两个终端电阻,而是将电阻分布在每个节点

CAN节点

CAN节点分为三个部分

MCU/CPU

CAN控制器

CAN收发器

STM32单片机内有集成的CAN控制器外设

 

CAN总线通过差分信号进行数据传输

CAN收发器将差分信号转换为TTL电平信号,或者将TTL电平信号转换为差分信号

CAN控制器将TTL电平信号接收传输给MCU

CAN总线协议

 

物理层:

前面的硬件拓扑结果,包括高速CAN和低俗CAN,CAN的收发器属于物理层

传输层则是CAN控制器所需要做的事情,包括CAN时序,同步,消息仲裁,确认,错误检验

这一层需要做的工作:

---故障约束

---错误检测

---消息验证

---信息确认

---仲裁

---信息帧

---传输速率和时间

---路由信息

对象层:

MCU属于对象层,需要对CAN消息做消息的过滤设置,CAN消息的处理

应用层:

基于对象层进一步封装,不同的CAN标准,CANopen和UDS

寻址:

CAN总线上每个节点不需要设置节点地址,而是通用消息标识符来区别信息,CAN总线的消息是广播的,就是大家都可以收到消息,比如总线上节点A、节点B、节点C,节点A发消息,节点B和节点C都会收到消息

注意:发送消息的时候,总线处于空闲状态

标识符越小,消息获取总线的优先级越高

帧类型:

数据帧、远程帧、错误帧、过载帧

数据帧:包含用于传输的节点数据的帧

远程帧:由任何检测到错误的节点发送的帧

过载帧:在数据帧或远程帧之间插入延迟的帧

代码:

CAN_HandleTypeDef hCAN;
void MX_CAN_Init(void)
{
    CAN_FilterTypeDef   sFilterConfig;
    /*CAN单元初始化*/
    hCAN.Instance = CAN1;						/* CAN外设 */
	
    /* BTR-BRP 波特率分频器  定义了时间单元的时间长度42/(1+6+7)/6=500Kbps */
    hCAN.Init.Prescaler = 6;
    hCAN.Init.Mode = CAN_MODE_NORMAL;			/* 正常工作模式 */
    hCAN.Init.SyncJumpWidth = CAN_SJW_1TQ;		/* BTR-SJW 重新同步跳跃宽度 1个时间单元 */
    hCAN.Init.TimeSeg1 = CAN_BS1_6TQ;			/* BTR-TS1 时间段1 占用了6个时间单元 */
    hCAN.Init.TimeSeg2 = CAN_BS2_7TQ;			/* BTR-TS1 时间段2 占用了7个时间单元 */
    hCAN.Init.TimeTriggeredMode = DISABLE;		/* MCR-TTCM  关闭时间触发通信模式使能 */	
    hCAN.Init.AutoBusOff = ENABLE;				/* MCR-ABOM  自动离线管理 */
    hCAN.Init.AutoWakeUp = ENABLE;				/* MCR-AWUM  使用自动唤醒模式 */
    hCAN.Init.AutoRetransmission = DISABLE;		/* MCR-NART  禁止报文自动重传	  DISABLE-自动重传 */
    /* MCR-RFLM  接收FIFO 锁定模式  DISABLE-溢出时新报文会覆盖原有报文 */
    hCAN.Init.ReceiveFifoLocked = DISABLE;		
    /* MCR-TXFP  发送FIFO优先级 DISABLE-优先级取决于报文标示符 */
    hCAN.Init.TransmitFifoPriority = DISABLE;	
    if (HAL_CAN_Init(&hCAN) != HAL_OK)
    {
        //Error_Handler();
    }
	// 初始化发送器
	hCAN1_TxMessage.IDE = CAN_ID_STD;
	hCAN1_TxMessage.RTR = CAN_RTR_DATA;
	hCAN1_TxMessage.TransmitGlobalTime = ENABLE;
	
	// 初始化滤波器 设置为0 则不对消息进行过滤
    hCAN1_Filter.FilterIdHigh               = 0;		/* 要过滤的ID高位 */
    hCAN1_Filter.FilterIdLow                = 0;		/* 要过滤的ID低位 */
    hCAN1_Filter.FilterMaskIdHigh         	= 0;		/* 过滤器高16位每位必须匹配 */
    hCAN1_Filter.FilterMaskIdLow            = 0;		/* 过滤器低16位每位必须匹配 */
    hCAN1_Filter.FilterFIFOAssignment 		= CAN_FILTER_FIFO0;/* 过滤器被关联到FIFO 0 */
    hCAN1_Filter.FilterBank                 = 0;
    hCAN1_Filter.FilterMode                 = CAN_FILTERMODE_IDMASK;	/* 工作在标识符屏蔽位模式 */
    hCAN1_Filter.FilterScale                = CAN_FILTERSCALE_32BIT; 	/* 过滤器位宽为单个32位。*/
    hCAN1_Filter.FilterActivation       	= ENABLE;
    hCAN1_Filter.SlaveStartFilterBank 		= 0;	
	
	HAL_CAN_ConfigFilter(&hCAN, &hCAN1_Filter);
	
	while(HAL_CAN_Start(&hCAN) != HAL_OK )
	{
		printf("\nCAN_Start Failed!!");
		HAL_Delay(100);
	}
	HAL_CAN_ActivateNotification(&hCAN, CAN_IT_RX_FIFO0_MSG_PENDING);
}

下面是CAN发送的函数,我们需要自己构建相应的消息帧格式,通常需要设置消息帧的ID格式,消息长度,具体如下;

void CAN_TxMessage(CAN_HandleTypeDef *hcan,uint16_t ID ,uint8_t aData[], uint8_t DLC)
{
    uint32_t Tx_MailBox;
    /*-1- 配置数据段长度 ----------------------------------------*/	
	hCAN1_TxMessage.IDE		= 	 CAN_ID_STD;
	hCAN1_TxMessage.RTR		= 	 CAN_RTR_DATA;
	hCAN1_TxMessage.StdId	= 	 ID;
    hCAN1_TxMessage.DLC    	=    DLC;		
	hCAN1_TxMessage.TransmitGlobalTime = ENABLE;
    /*-2- 发送aData ---------------------------------------------*/
    while(HAL_CAN_AddTxMessage(hcan, &hCAN1_TxMessage, aData, &Tx_MailBox) != HAL_OK)
    {
        HAL_Delay(5);
    }
}
  • CAN_ID_STD设置为标准ID;
  • CAN_RTR_DATA设置消息为数据帧;
  • StdId为当前消息的ID;
  • DLC为当前消息的长度;

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

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

相关文章

使用PHP实现随机调用图片

💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 预览地址:ht…

JavaWeb博客项目--推荐算法--完整代码及思路

基于用户的协同过滤算法(UserCF) 因为我写的是博客项目,博客数量可能比用户数量还多 所以选择基于用户的协同过滤算法 重要思想 当要向用户u进行推荐时,我们先找出与用户u最相似的几个用户,再从这几个用户的喜欢的物…

【NX】NX二次开发中如何绕固定轴旋转矢量

如何让任意矢量绕着任意轴旋转一定角度,得到新的矢量,在NX中,通过矩阵运算,可以直接得到目标向量。 直接上代码: AUTUMOON::AUTUMOONMathVector3d CAMToolPathToolkit::RotateVector(const AUTUMOONMathVector3d &…

版本控制工具Git集成IDEA的使用(超详细)

目录 一、团队内协作和跨团队协作讲述 1、团队内协作 2、跨团队协作 二、Gitee的使用 1、注册网站会员 2、用户中心 3、创建远程仓库 4、配置SSH免密登录 三、集成IDEA,Git项目搭建 1、本地仓库搭建 1)创建一个新项目 2)打开终端&…

windos安装oracle数据库图文教程

首先准备安装包, 链接:https://pan.baidu.com/s/17ltLy9TCwb5fAlaWq3hW4g 提取码:dsmd 这个版本是11.2,如果需要其他版本可以通过官网下载。 下载完成之后,保存路径不要有中文。 右键解压,会多出来个data…

重建与突破,探讨全链游戏的现在与未来

全链游戏(On-Chain Game)是指将游戏内资产通过虚拟货币或 NFT 形式记录上链的游戏类型。除此以外,游戏的状态存储、计算与执行等皆被部署在链上,目的是为用户打造沉浸式、全方位的游戏体验,超越传统游戏玩家被动控制的…

USB2.0与USB3.0接口的PCB布局布线要求

USB是通用串行总线的英文缩写,是连接外部装置的一个串口总线标准,也是一种输入输出接口的技术规范,被广泛地应用于个人电脑和移动设备等信息通迅产品,并扩展到摄影器材,数字电视(机顶盒)、游戏机…

智能仓储管理系统(自动化仓库管理解决方案)

企业实际的仓储管理中,往往会出现那样这样的错误,归根结底,主要是由于没使用合适的仓库管理工具。相反,人工使用合适的仓库管理工具,不仅可以在日常仓库管理方法中根据采集到的产品信息数据,大大地提高管理…

Leangoo领歌免费敏捷看板工具做—用户反馈管理

一个产品在面向市场之后势必会收到来自各个渠道的用户反馈。好的反馈有利于公司品牌的建立,挑剔和负面反馈可以帮助我们了解到用户最真是的需求和使用场景,有利于优化产品提高服务。更加能够提升用户的粘性。 在进行用户反馈管理时,用户反馈…

selenium 选定ul-li下拉选项中某个指定选项

场景:selenium的下拉选项是ul-li模式,选定某个指定的选项。 from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 显示等待def select_li(self, text, *ul_locator):"…

随手笔记——Pose Graph理论以及g2o实现

随手笔记——Pose Graph理论以及g2o实现 说明源代码CMakeLists.txt 说明 源代码 #include <iostream> #include <fstream> #include <string>#include <g2o/types/slam3d/types_slam3d.h> #include <g2o/core/block_solver.h> #include <g2o…

Python实现两个主机的数据库同步

实现两个主机间mysql数据同步 import pymysql import pandas as pd from sqlalchemy import create_engineHOST_SUBOR_SYNCLIST (account_t, measure_system_t) # 需要更新的数据表def syncSqldata(source_db, target_db):for table in HOST_SUBOR_SYNCLIST :query "SE…

小米有品众筹,小米上新3D打印机!米家3D打印机购买前必看的注意事项!

小米推出3D打印机&#xff0c;米家3D打印机购买前必看 3D打印机在人们的生活中发挥着巨大的作用&#xff0c;无论是在科研实验室还是家庭工作室&#xff0c;它们正以惊人的速度改变着我们的世界。最近&#xff0c;科技巨头小米也加入了这一领域&#xff0c;推出了一款全新的&q…

从零实战SLAM-第十课(回环检测与建图)(完)

在七月算法报的班&#xff0c;老师讲的蛮好。好记性不如烂笔头&#xff0c;关键内容还是记录一下吧&#xff0c;课程入口&#xff0c;感兴趣的同学可以学习一下。 --------------------------------------------------------------------------------------------------------…

未来数字银行的样子

对银行长期发展来讲&#xff0c;这意味着将关闭和减少 低效率的实体分行&#xff0c;加速向数字化发展。实现成本节省和 IT 预算提效的需求&#xff0c;将为数字柜台和银行代理点创造新的机遇。 一个崭新的世界&#xff1a;未来数字银行趋势图 现在是银行迎头赶上并为客户提供超…

NFTScan NFT API 在 DID Protocol 开发中的应用

自互联网发展以来&#xff0c;Web2.0 时代产生了网络社会&#xff0c;社会已经不再局限于地理边界&#xff0c;而 Web 3.0 引入了去中心化的理念&#xff0c;强调个体数据隐私和可信互操作性。在这个新的时代中&#xff0c;去中心化身份&#xff08;Decentralized Identifier 即…

百万奖金、大厂offer请你接收!

第三届中国移动“梧桐杯”大数据创新大赛 火热进行中 报名速来~ 今年大学生就业形势格外严峻&#xff1a;全国高校毕业生人数破千万为历年来最多&#xff0c;校招竞争激烈&#xff0c;高薪岗位宁缺毋滥。想弯道超车拿到心仪的offer&#xff1f;仅靠“求神拜佛”对着神明念自己…

生信豆芽菜-差异基因富集分析的圈图

网址&#xff1a;http://www.sxdyc.com/visualsEnrichCirplot 1、数据准备 准备一个基因集的文件 2、选择富集分析的数据库&#xff0c;同时输入展示top几的条目&#xff0c;选择颜色&#xff0c;如果是GO的话选择三个颜色&#xff0c;如果是KEGG选择一个&#xff0c;如果是G…

SpringBoot系列之基于Jersey实现RESTFul风格文件上传API

前言 JAX-RS&#xff1a;JAX-RS是可以用可以用于实现RESTFul应用程序的JAVA API&#xff0c;给开发者提供了一系列的RESTFul注解Jersey&#xff1a;是基于JAX-RX API的实现框架&#xff0c;用于实现RESTful Web 服务的开源框架。 JAX-RX常用的注解&#xff1a; javax.ws.rs.Pa…

ui设计师个人年终工作总结2020最新范文5篇

ui设计师个人年终工作总结(一) 我于20年x育人x日成为公司的试用员工&#xff0c;安排在技术研发中心担任UI界面设计一职&#xff0c;现将我的工作情况分为三个阶段来总结如下汇报&#xff1a; 一、萌芽阶段 记得初次应聘时&#xff0c;我对公司的认识仅仅局限于行业之一&#x…