关于CAN通信的相关介绍

本文介绍了CAN(Controller Area Network)通信的基础知识,包括CAN的作用、总线电平信号和帧种类。重点讲解了数据帧的构成,如仲裁段、控制段、数据段、CRC段和ACK段,并提供了CubeMX中的CAN配置示例以及发送和接收函数的代码实现,帮助读者理解和应用CAN通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

作为一个小萌新,在通过CAN控制6020、3508、2006驱动并实现相关功能后,我决定根据自己的理解介绍一下can通信,不足的地方敬请指正

  1. can的作用
  2. can总线的电平信号
  3. can的帧种类

一、CAN的作用

CAN是控制器局域网络的简称,是ISO国际标准化的串行通信协议。它的英文全称是Controller Area Network,一般简写为CAN。CAN是由以研发和生产汽车电子产品著称的德国BOSCH公司开发的,并最终成为国际标准(ISO 11898),是国际上应用最广泛的现场总线之一

它的特点是:

​ 其为多主机工作模式,可以在一条通信线路上实现多个设备发送信息。各个系统拥有唯一的ID号,在他们同时发送信息时,可以通过自动仲裁机制来使得优先级高的设备优先发送信息,避免了冲突与拥挤。

二、CAN总线的电平信号

img

can用两条线进行数据传输,一为CAN_H,另一个是CAN_L

can通过判断这两条数据线的压差来进行仲裁,即

  • CAN_H=3.5V,CAN_L=1.5V时,即为逻辑一,代表隐性(Recessive)
  • CAN_H=2.5V,CAN_L=2.5V时,即为逻辑零,代表显性(Dominant)

这就是差分信号

三、CAN的帧种类

5kEiqJ.jpg

此中,只介绍数据帧

img

  1. 仲裁段:包括目标设备的ID号RTR

    ID号是用来标识接收设备的。其中的标准格式CAN_ID_STD(0)与扩展格式(!0)取决于ID号的长度。

    RTR是用来标识其是数据帧CAN_RTR_DATA(0)还是遥控帧(!0)的

  2. 控制段:

    IDE指的即为刚刚所讲的ID号

    r0是保留位(用途暂时不清楚,但要求设为显性电平);

    DLC指的是数据长度。设为0x08的时候,可以支持多个设备。

  3. 数据段:

    用于存放数据

  4. CRC段:

    用于检验报文在传输过程中是否出错。这个是由can硬件自动完成的

  5. ACK段:

    相当于一个标志位,发送方的设置为隐形位,当接收方成功接收了之后,变为显性。

在CubeMX上的相关配置
  1. can的相关参数配置

5kGl5T.png

  1. 打开中断
    5kY4gg.png

  2. 控制代码

//过滤器配置
void CAN_FilterInit(CAN_HandleTypeDef *hcan)
{
	CAN_FilterTypeDef  CAN_FilterInitStructure;
	CAN_FilterInitStructure.FilterMode=CAN_FILTERMODE_IDMASK;
	CAN_FilterInitStructure.FilterScale=CAN_FILTERSCALE_32BIT;
	CAN_FilterInitStructure.FilterIdHigh=0x0000;
	CAN_FilterInitStructure.FilterIdLow=0x0000;
	CAN_FilterInitStructure.FilterMaskIdHigh=0x0000;
	CAN_FilterInitStructure.FilterMaskIdLow=0x0000;
	CAN_FilterInitStructure.FilterBank=0;
	CAN_FilterInitStructure.FilterFIFOAssignment=CAN_RX_FIFO0;
	CAN_FilterInitStructure.FilterActivation=ENABLE ;
	CAN_FilterInitStructure.SlaveStartFilterBank=14;    //因为这里规定要是
	if(HAL_CAN_ConfigFilter (hcan,&CAN_FilterInitStructure)!=HAL_OK )
	{
		Error_Handler () ;
	}
if(HAL_CAN_Start(hcan) !=HAL_OK)
{		
  Error_Handler () ;
}

if(HAL_CAN_ActivateNotification(hcan , CAN_IT_RX_FIFO0_MSG_PENDING)!=HAL_OK )
{
	Error_Handler () ;
}
}
//接收函数
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
	CAN_RxHeaderTypeDef rx_header;
	rx_header .IDE =CAN_ID_STD ; //使用标准id
	rx_header .RTR =CAN_RTR_DATA ;//使用数据帧
	rx_header .DLC=0x08;
	HAL_CAN_GetRxMessage (&hcan1 ,CAN_RX_FIFO0 ,&rx_header,rx_data);
	 //这里写你的数据解包函数	

}
//发送函数
void  CAN_Send_Msg(CAN_HandleTypeDef *hcan,uint32_t ID,short int i1,short int i2,short int i3,short int i4)
{
	static CAN_TxHeaderTypeDef  tx_header;
//	uint32_t Tx_mail;
	tx_header .StdId =ID;     //标识符
	tx_header .IDE =CAN_ID_STD ; //使用标准id
	tx_header .RTR =CAN_RTR_DATA ;//使用数据帧
	tx_header .DLC=8;
	tx_data [0] = i1 >>8;
	tx_data [1] = i1;
	tx_data [2] = i2 >>8;
	tx_data [3] = i2;
	tx_data [4] = i3 >>8;
	tx_data [5] = i3;
	tx_data [6] = i4 >>8;
	tx_data [7] = i4;
	HAL_CAN_AddTxMessage(&hcan1,&tx_header,tx_data,(uint32_t *)CAN_TX_MAILBOX0);		
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Teviour Camdylre

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值