通信接口CAN

article/2025/8/30 0:30:36

CAN通信

目前(2021年6月)我用到的CAN电路原理图:
can电路原理图

  • 判断电路有没有接好,其中一个标准就是,测量接入的电阻阻值是不是60Ω。
  • 上图两个60.4Ω之间,可以接一个电容到GND。

1. Bit Timing(位时序)

参考连接

  • 用于确定波特率。
    CAN 具有 处理长总线长度(与比特率相比)中发现的时间延迟 和 处理总线上节点的时钟晶体频率差异的高级功能。
    位时序的选择非常重要,因为它决定了位速率、采样点和重新同步的能力。
  • 位段(博世标准)
    每个比特分为四段——同步段(synchronisation)、传播段(propagation)和相位段一和二(phase1,2)。
    在这里插入图片描述
    每一段由一个或多个时间量组成。时间量是从 CAN 控制器时钟导出的固定时间量,具有预定标因子。
  • 同步段(Synch_Seg)
    同步段用于同步总线上的各个节点。当在总线上发送一个比特时,预计前沿在该段内。 该段固定为 一个时间量程长。
  • 传播段(Prop_Seg)
    需要传播段来补偿总线中的延迟。段大小在 1 到 8 个时间量程之间可编程。
  • 相位段1(Phase_Seg1),相位段2(Phase_Seg2)
    可以通过重新同步来延长或缩短这些段。
  • 采样点
    通常每一位只有一个采样点,在这种情况下,采样点在TSEG1和TSEG2之间的边缘。
    (但是,有些CAN控制器也可以对每一位采样3次。这种情况下,该位将被采样3次 在一行中,最后一个样本取自 TSEG1 和 TSEG2 之间的边缘。三个样本应该只用于相对较慢的波特率。)

1.1 波特率和采样点的计算

  • 波特率
    总线的波特率可以通过下式计算:
    在这里插入图片描述

  • 采样点
    样品前量子=TSEG1+1
    样品后量子=TSEG2
    采样点通常以位时间的百分比给出。是:(TSEG1+1)/(TSEG1+1+TSEG2)

2. CAN波特率配置

20220727新增补充。

2.1 stm32f107vc

  • 配置为 1000K波特率。
    在这里插入图片描述
  • 配置为 500K波特率。
    在这里插入图片描述
CAN_HandleTypeDef hcan1;
CAN_HandleTypeDef hcan2;
void CAN1_Init(void)
{hcan1.Instance = CAN1;hcan1.Init.Prescaler = 6;//6--1000K   12--500K hcan1.Init.Mode = CAN_MODE_NORMAL;hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;hcan1.Init.TimeSeg1 = CAN_BS1_3TQ;hcan1.Init.TimeSeg2 = CAN_BS2_2TQ;hcan1.Init.TimeTriggeredMode = DISABLE;hcan1.Init.AutoBusOff = DISABLE;hcan1.Init.AutoWakeUp = DISABLE;hcan1.Init.AutoRetransmission = DISABLE;hcan1.Init.ReceiveFifoLocked = DISABLE;hcan1.Init.TransmitFifoPriority = DISABLE;if (HAL_CAN_Init(&hcan1) != HAL_OK){Error_Handler();}
}
void CAN2_Init(void)
{hcan2.Instance = CAN2;hcan2.Init.Prescaler = 6;//6--1000K   12--500K hcan2.Init.Mode = CAN_MODE_NORMAL;hcan2.Init.SyncJumpWidth = CAN_SJW_1TQ;hcan2.Init.TimeSeg1 = CAN_BS1_3TQ;hcan2.Init.TimeSeg2 = CAN_BS2_2TQ;hcan2.Init.TimeTriggeredMode = DISABLE;hcan2.Init.AutoBusOff = DISABLE;hcan2.Init.AutoWakeUp = DISABLE;hcan2.Init.AutoRetransmission = DISABLE;hcan2.Init.ReceiveFifoLocked = DISABLE;hcan2.Init.TransmitFifoPriority = DISABLE;if (HAL_CAN_Init(&hcan2) != HAL_OK){Error_Handler();}
}

2.2 HHD32f107

//CAN_BAUD_1M CAN_BAUD_500K CAN_BAUD_250K
#define PROJ_CAN_SRC_NODE		(0x01)
can_init(CAN1, CAN_BAUD_1M, PROJ_CAN_SRC_NODE, 0x0000000);//	can_init(CAN1, CAN_BAUD_1M, 0x7ff, 0x00);
can_init(CAN2, CAN_BAUD_1M, PROJ_CAN_SRC_NODE, 0x0000000);

3. CAN数据接收设置

针对两种MCU的过滤器设置。

stm32f105

网上全是参考代码,这里直接贴上我的过滤器代码

  • 列表模式,CAN1 32位ID过滤,CAN2 16位ID过滤
    CAN_FilterTypeDef  sFilterConfig;sFilterConfig.FilterMode =  CAN_FILTERMODE_IDLIST;  //设为列表模式 //CAN1----------------------------------------------   sFilterConfig.FilterFIFOAssignment = CAN1FIFO;      //接收到的报文放入到FIFO0中 sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;sFilterConfig.FilterActivation = ENABLE;  sFilterConfig.SlaveStartFilterBank  = 14; //过滤器0sFilterConfig.FilterBank = 0;                       sFilterConfig.FilterIdHigh = ((ID1<<3)>>16)&0xffff;sFilterConfig.FilterIdLow  = ((ID1<<3)&0xffff)|CAN_ID_EXT; sFilterConfig.FilterMaskIdHigh =((ID2<<3)>>16)&0xffff;sFilterConfig.FilterMaskIdLow  =((ID2<<3)&0xffff)|CAN_ID_EXT; HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig);//过滤器1sFilterConfig.FilterBank = 1;sFilterConfig.FilterIdHigh     	= ((ID3<<3)>>16)&0xffff;sFilterConfig.FilterIdLow     	= ((ID3<<3)&0xffff)|CAN_ID_EXT; 
//    sFilterConfig.FilterMaskIdHigh 	= ((ID4<<3)>>16)&0xffff;
//    sFilterConfig.FilterMaskIdLow  	= ((ID4<<3)&0xffff)|CAN_ID_EXT; 
//    HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig);//CAN2----------------------------------------sFilterConfig.FilterFIFOAssignment = CAN2FIFO;sFilterConfig.FilterScale = CAN_FILTERSCALE_16BIT;sFilterConfig.FilterBank = 14;sFilterConfig.FilterIdHigh 		= 0x020 <<5;sFilterConfig.FilterIdLow  		= 0x021 <<5; sFilterConfig.FilterMaskIdHigh 	= 0x022<<5;sFilterConfig.FilterMaskIdLow  	= 0x023 <<5; HAL_CAN_ConfigFilter(&hcan2, &sFilterConfig);//过滤器15sFilterConfig.FilterBank = 15;sFilterConfig.FilterIdHigh     	= 0x030 <<5;sFilterConfig.FilterIdLow      	= 0x031 <<5; sFilterConfig.FilterMaskIdHigh 	= 0x032<<5;sFilterConfig.FilterMaskIdLow  	= 0x033 <<5; HAL_CAN_ConfigFilter(&hcan2, &sFilterConfig);HAL_CAN_Start(&hcan1);  HAL_CAN_ActivateNotification(&hcan1,   CAN_IT_RX_FIFO0_MSG_PENDING);HAL_CAN_Start(&hcan2);  HAL_CAN_ActivateNotification(&hcan2,   CAN_IT_RX_FIFO1_MSG_PENDING);
  • 如果需要接受全部帧,不进行硬件过滤。如下 所示:
void CAN1_recvALL(void)
{CAN_FilterTypeDef  sFilterConfig;TxMeg.IDE=CAN_ID_EXT; //扩展帧TxMeg.RTR=CAN_RTR_DATA;//数据帧sFilterConfig.FilterMode =  CAN_FILTERMODE_IDMASK;  //设为mask模式    sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;//sFilterConfig.FilterFIFOAssignment = CAN1FIFO;      //接收到的报文放入到FIFO0中 sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0; //接收到的报文放入到FIFO0中 sFilterConfig.FilterActivation = ENABLE;  sFilterConfig.FilterBank = 0; //过滤器0sFilterConfig.FilterIdHigh = 0x0000;   //基本ID放入到STID中  sFilterConfig.FilterIdLow  = 0x0000;    		sFilterConfig.FilterMaskIdHigh = 0;//这里设置接收任意ID的CAN数据sFilterConfig.FilterMaskIdLow  = 0;//0表示接收来自发送端任意ID的数据 sFilterConfig.SlaveStartFilterBank  = 14; HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig);
}
void CAN2_recvALL(void)
{CAN_FilterTypeDef  sFilterConfig;sFilterConfig.FilterMode =  CAN_FILTERMODE_IDMASK;  //设为mask模式    sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO1; sFilterConfig.FilterActivation = ENABLE;  sFilterConfig.FilterBank = 14;sFilterConfig.FilterIdHigh = 0x0000;   //基本ID放入到STID中  sFilterConfig.FilterIdLow  = 0x0000;    		sFilterConfig.FilterMaskIdHigh = 0;//这里设置接收任意ID的CAN数据sFilterConfig.FilterMaskIdLow  = 0;//0表示接收来自发送端任意ID的数据 //CAN2 过滤器设置HAL_CAN_ConfigFilter(&hcan2, &sFilterConfig);
}

国产芯片HHD32107

  • 国产芯片文件资料给的不全,且有一些不严谨的地方。只能够按照对stm32 can的理解,来理解国产芯片。
  • 资料中显示,该国产芯片,具有双CAN。但是未具体介绍过滤器是如何使用的。实际使用中发现,can2不能正常的接收数据和发送数据,因而只能对can1进行调试。
  • can1 看起来仅有一个过滤器,实验发现,过滤器实际处于mask模式下,因为项目需要用到的ID比较简单,没有统一的ID特征位,不需要再用mask过滤一遍,索性mask寄存器AMR全部设置为无效位,硬件不过滤。全部接收。最终实行软件代码过滤
  • 能正常工作,就不要去动他了。
// 设置滤波器can->MOD.bit.AFM 	= 0x01;  //1 数据接受采用 4-byte 过滤器(32位过滤器)//0 数据接受采用 2 个 shoter 过滤器(2个16位过滤器)
// 设置接收帧过滤,可以接收任何标识符/*ACR/AMR屏蔽字属性:ACR用于指定CAN ID二进制中关注位和忽略位;AMR用于规定ACR中那些二进制位生效,哪些无效.AMR中0代表有效位,1代表无效位;*/// Acceptance Code Register (注册两个ID,实际不需要)can->DATAINFO.FILTER.ACR[0].all  = ((filterID << 5) >> 8 ) & 0xFF;   //Identifiercan->DATAINFO.FILTER.ACR[1].all  = (filterID << 5) &0xE0 ;  		 //Identifiercan->DATAINFO.FILTER.ACR[2].all  = 0xFF;can->DATAINFO.FILTER.ACR[3].all  = 0xFF;//Acceptance Mask Register (mask设置,不对任何位进行判定)can->DATAINFO.FILTER.AMR[0].all = 0xFF;//((mask << 5) >> 8 ) & 0xFF;can->DATAINFO.FILTER.AMR[1].all = 0xFF;//(mask << 5) &0xE0 ;can->DATAINFO.FILTER.AMR[2].all = 0xff;can->DATAINFO.FILTER.AMR[3].all = 0xff; 

CAN的两种标准

CAN官网入口
我的阿里云参考资料(文件已上传,当前阿里云盘没有分享功能)

  • 2.0A 标准。标识符ID 长度为11bit 。
  • 2.0B 标准。标识符ID 长度支持11位和29bit。
    2.0B标准帧
    2.0B扩展帧

注意:在编写MCU程序时会发现,如果CAN收发芯片,没有接在一个总线中,can驱动代码会卡在等待的死循环中。关于这一点,我们在添加了实时系统之后,在can等待循环中,需要添加系统的delay函数,用以自动切换线程任务。

实际数据帧波形图解析

  • 以2.0A标准帧为例,发送数据,11bit的ID数值为1,发送8个字节的数据(0x12,0x23,0x34,0x45,0x56,0x67,0x78,0x89)。
  • 电表笔 高接CANH,低接CANL,得到的高电平表示0,低电平表示1。
  • 关于速率,当前采用的是500Kbit的速率,在示波器上看,也就是2us一个bit。下图中记录了原始的高低电平。
  • 通过示波器观察每次can总线上的数据,会发现“**位填充”**现象,即总线上,5bit持续同样的电平,发送方会在后面补充1bit的反向电平。

can实际数据波形图解析


http://chatgpt.dhexx.cn/article/4da1S0Om.shtml

相关文章

STM32之CAN通信

23.1关于 CAN 23.1.1 CAN 电气特性与协议 控制器局域网&#xff08;Controller Area Network&#xff0c;CAN&#xff09;&#xff0c;是由德国BOSCH&#xff08;博世&#xff09;公司开发&#xff0c;是目前国际上应用最为广泛的现场总线之一。其特点是可拓展性好&#xff0…

FPGA实现CAN通信

FPGA实现CAN通信 1、CAN协议物理层和协议层 2、传输的波特率 3、FPGA实现思路 4、FPGA实现代码 1、CAN物理层和协议层 CAN与串口类似&#xff0c;都是异步通信&#xff0c;利用两根差分线来进行信号的传输。 在多节点进行数据传输时主要分为遵循ISO11898标准的高速短距离闭环形…

关于CAN通信速率设置

一、 CAN时钟周期&#xff08;Tq&#xff09;2*晶振时钟*BRP&#xff08;波特率预分频值 baudrate prescaler&#xff09; 一个CAN时间称为一个时间量子 Tq 1&#xff09;同步段&#xff08;Synchronization Segment&#xff09;&#xff1a;1个Tq&#xff0c;tSS 2&#x…

nano的CAN通信

我买的是微雪的树莓派用的SPI转CAN。现在用在jetson nano上。我看了一下俩模块的芯片用的都是一样的&#xff0c;引脚也都对得上&#xff0c;所以我就打算拿这个模块给nano做can通信。 具备CAN功能&#xff0c;使用SPI接口CAN控制器MCP2515&#xff0c;搭配收发器SN65HVD230。 …

CAN通信基础知识

CAN是Controller Area Network 的缩写&#xff08;以下称为CAN&#xff09;&#xff0c;是ISO国际标准化的串行通信协议。由德国电气商博世公司在1986 年率先提出。此后&#xff0c;CAN 通过ISO11898 及ISO11519 进行了标准化。现在在欧洲已是汽车网络的标准协议。 CAN协议经过…

CAN通信详解

本章我们将向大家介绍如何使用STM32自带的CAN控制器来实现两个开发板之间的CAN通讯&#xff0c;并将结果显示在TFTLCD模块上。本章分为如下几个部分&#xff1a; 30.1 CAN简介 30.2 硬件设计 30.3 软件设计 30.4 下载验证 30.1 CAN简介 CAN 是Controller Area Network 的…

CAN通信总结

CAN通信总结 基本介绍 ​ 1. CAN通过两条通信线&#xff08;双绞线&#xff09;产生的电压差传输数据&#xff0c;一个CAN网络里的所有节点都挂在这两条通信线上&#xff0c;使用差分信号半双工通信。 ​ 2. CAN总线是广播类型的总线。所有节点都将始终接收所有通信&#xf…

CAN 通信原理学习

文章目录 CAN通信一&#xff1a;基本概述1.1 can总线是什么1.2 can总线协议的特点1.3 can的网络通信结构1.3.11.3.2 can协议网络层次 二&#xff1a;socket can在通信网络中的应用三 一个程序 CAN通信 一&#xff1a;基本概述 1.1 can总线是什么 CAN 是 Controller Area Net…

CAN通信协议

在 CAN 协议中&#xff0c;所有的消息都以固定的格式发送。总线空闲时&#xff0c;所有与总线相连的单元都可以开始发送新消息。两个以上的单元同时开始发送消息时&#xff0c;根据标识符&#xff08;Identifier 以下称为 ID&#xff09;决定优先级。ID 并不是表示发送的目的地…

CAN通信讲解(1)——基本知识

本文注意参考了《CAN入门书》&#xff0c;源于此书图片不再特殊标注 目录 1.1 CAN总线背景1.2 CAN总线定义1.3 CAN总线信号特性1.4 CAN总线传输1.5 OSI基本参照模型和CAN总线协议 1.1 CAN总线背景 为减少汽车线束数量&#xff0c;1986年&#xff0c;博世开发出面向汽车的CAN通…

CAN通信

通讯方式 UART&#xff1a;(Universal Asynchronous Receiver Transmitter&#xff1a;通用异步收发器/异步串行通信口)&#xff0c;是一种通用的串行数据总线&#xff0c;用于异步通信&#xff0c;支持全双工。它包括了RS232、RS499、RS423、RS422和RS485等接口标准规范和总线…

CAN通信----基本原理

STM32标准库开发 文章链接&#xff1a; STM32F103标准库开发----目录 STM32F103标准库开发----CAN总线通信实验----初始化/波特率 STM32F103标准库开发----CAN总线通信实验----发送和接收 资源链接&#xff1a; 本例程已经调试成功&#xff0c;下载即可使用。 STM32F103标准库…

CAN通信详解(全)

本章我们将向大家介绍如何使用STM32自带的CAN控制器来实现两个开发板之间的CAN通讯&#xff0c;并将结果显示在TFTLCD模块上。本章分为如下几个部分&#xff1a; 30.1 CAN简介 30.2 硬件设计 30.3 软件设计 30.4 下载验证 30.1 CAN简介 CAN 是Controller Area Network 的缩…

Tomcat优化禁用AJP协议

登录tomcat 在服务状态页面中可以看到&#xff0c;默认状态下会启用AJP服务&#xff0c;并且占用8009端口。 什么是AJP呢&#xff1f; AJP&#xff08;Apache JServer Protocol&#xff09; AJPv13协议是面向包的。WEB服务器和Servlet容器通过TCP连接来交互&#xff1b;为了…

tomcat启动出现错误:Failed to destroy end point associated with ProtocolHandler[“ajp-nio-8009“](解决非常简单)

tomcat启跑不起来而且报了很多莫名其妙的错误不知道从哪里找起 启动服务器出现这个错误 console提示&#xff1a;Failed to destroy end point associated with ProtocolHandler[“ajp-nio-8009”] 直接看web.xml的url-pattern这个属性是不是哪一个少了‘/’ 或者 如果没有…

Java安全-Tomcat AJP 文件包含漏洞(CVE-2020-1938)幽灵猫漏洞复现

Tomcat AJP 文件包含漏洞&#xff08;CVE-2020-1938&#xff09; CVE-2020-1938 又名GhostCat ApacheTomcat服务器中被发现存在文件包含漏洞&#xff0c;攻击者可利用该漏洞读取或包含Tomcat 上所有 webapp 目录下的任意文件 该漏洞是一个单独的文件包含漏洞&#xff0c;依赖…

Aapache Tomcat AJP 文件包含漏洞-(CVE-2020-1938/CNVD-2020-10487)

漏洞编号 CVE-2020-1938 CNVD-2020-10487 靶机环境 Vulhub虚拟靶场 vulhub-master/tomcat/CVE-2020-1938 启动docker&#xff1a; 启动成功&#xff1a; 0x00 漏洞简介 2月20日&#xff0c;国家信息安全漏洞共享平台&#xff08;CNVD&#xff09;发布了Apache Tomcat文件包含漏…

Apache-Tomcat-Ajp漏洞测试与修复

说明 Apache Tomcat会开启AJP连接器,方便与其他Web服务器通过AJP协议进行交互。由于Tomcat本身也内含了HTTP服务器&#xff0c;因此也可以视作单独的Web服务器。此漏洞为文件包含漏洞&#xff0c;攻击者可利用该漏洞读取或包含 Tomcat 上所有 webapp 目录下的任意文件&#xf…

解决AJP漏洞操作记录

前言 最近Tomcat爆出AJP漏洞&#xff0c;升级对应版本的Tomcat是比较好的规避方法。本文将记录笔者在升级Tomcat 9.0.31时踩过的一些坑&#xff0c;以便大家能快速升级Tomcat。 本文只针对Tomcat 9.0.31版本的操作记录。 Tomcat受影响版本&#xff1a; Apache Tomcat 9.x &l…

tomcat中ajp及8009端口用处

tomcat常用于提供servlet/jsp容器服务&#xff0c;简单方便、使用高效。但是tomcat处理静态文件资源的性能不足&#xff08;应该是serviece部分&#xff09;&#xff0c;同时&#xff0c;如果用户直接与tomcat进行http的连接获取静态资源&#xff08;连接器connector部分&#…