前一篇博客介绍了使用hal库进行CAN的发送数据,接下来介绍使用CAN进行数据接收。
建议先看前一篇文章,再看这一篇文章。
CAN数据发送 ,文章地址。
硬件配置,以及stm32的配置,和前一篇文章相同。

2.发送数据

使用CAN进行接收数据, 需要先进行过滤器的配置才能接收到数据 。参考stm32的数据手册。

2.1,接收过滤器配置

void CAN_Filter_Config()
	CAN_FilterTypeDef sFilterConfig;
	//声明 CAN过滤器结构体
	//列表模式的四个id
	uint32_t std_id1=0x123;
	uint32_t std_id2=0x223;
	uint32_t std_id3=0x323;
	uint32_t std_id4=0x423;
		//使用列表模式
	  sFilterConfig.FilterMode = CAN_FILTERMODE_IDLIST;
	//16位,因为使用的是标准帧
	  sFilterConfig.FilterScale = CAN_FILTERSCALE_16BIT;
	  sFilterConfig.FilterIdHigh = std_id1<<5;
	  sFilterConfig.FilterIdLow = std_id2<<5;
	  sFilterConfig.FilterMaskIdHigh = std_id3<<5;
	  sFilterConfig.FilterMaskIdLow = std_id4<<5;
//将四个id写入寄存器
	  sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0;
	  sFilterConfig.FilterActivation = ENABLE;
	  sFilterConfig.FilterBank = 0;
	  if(HAL_CAN_ConfigFilter(&hcan, &sFilterConfig)!=HAL_OK)
		  printf("filter_config_failed\r\n");

接收过滤器的配置如上图,注意我使用的是列表模式,关于列表模式与掩码模式的区别,在这里简单的赘述一下:列表模式就是只接收这几个id的数据,比如按照我上图的配置方法,只接收ID为0x123,0x223,0x323,0x423的数据,其他ID发送的数据不接受,掩码模式会比较ID的每一个bit位,只要对应的bit位符合要求,就接收数据。

2.2 中断回调函数编写

我们已经打开了CAN的接收中断,只需要在中断回调函数里面接收数据就可以了。

void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
	uint8_t aRxData[8], i;
	CAN_RxHeaderTypeDef hCAN1_RxHeader;
	    if(HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &hCAN1_RxHeader, aRxData) == HAL_OK)
	        printf("\nGet Rx Message Success!!\r\nData:");
	        for(i=0; i<8; i++)
	            printf("%d", aRxData[i]);

写到这里是不是就能正常接收数据了呢?答案是不能,我们在主函数前面,还需要加一句

HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING)
//打开CAN的接收中断

到此,就能完成CAN的数据接收了。

CAN发送数据
CAN发送数据,使用CAN上位机发送数据,注意发送ID,需要是我们前面配置的ID,否则会被过滤器筛选,无法接收。
串口助手
可以看到串口接收到了我们发送的数据。

到此就完成了CAN总线的数据收发。

在调试CAN总线的过程中,也踩了许多坑。

1.波特率的配置,CAN总线的波特率设置还是有点讲究的,在使用的时候,注意波特率的配置。
2.要先配置过滤器,才能接收到数据。

数据帧分为标准帧(CAN2.0A)和扩展帧(CAN2.0B),主要体现在仲裁段和控制段数据帧由7段组成,数据帧又分为标准帧(CAN2.0A)和扩展帧(CAN2.0B),主要体现在仲裁段和控制段显性信号为0,隐形信号为12.CAN位时序介绍CAN总线以“位同步”机制,实现对电平的正确采样。位数据都由四段组成:同步段(SS),一个Tq传播时间段(PTS),两个Tq相位缓冲段1(PBS1)三个Tq相位缓冲段2(PBS2),三个Tq每段又由多个时序Tq组成,(Tq可以理解为单位长度) CAN笔记 虽然CAN协议本身具有一定的复杂度,但实际上使用CAN进行基本的数据收发是非常简单的,因为大部分工作都是硬件帮我们完成的,我们要做的仅仅是使用库函数往FIFO(CAN外设的某几个寄存器)中写入/读取数据而已。 CAN有ISO 11898 和 ISO 11519-2 两种标准,本文只涉及ISO 11898(闭环、高速) 一、基本概念 CAN是一种通讯协议,在汽车、工业、机器人等领域广泛使用。 1、CAN的波形 ​ CAN有两根通讯线:CAN H 和 CAN L 。图中黄色的为CAN H, 使能过滤器 定义过滤器模式:编码模式/掩码模式 定义过滤 今天有个很大的收获,就是知道了什么是【回调函数】哈哈哈。。。 好吧言归正传,这个文章是我在调试我的ABS控制器的时候写的,本来打算写在项目笔记里,但是觉得这应该算是通用型的知识,而且我一开始是用野火的开发板调试的,所以打算把它写在STM32学习笔记下面。 其实这不应该是第二篇学习笔记,因为至少之前写过一篇SPI通讯的,虽然是和5048磁编码... 控制器局域网总线(CAN,Controller Area Network)是一种用于实时应用的串行通讯协议总线,它可以使用双绞线来传输信号,是世界上应用最广泛的现场总线之一。CAN协议用于汽车中各种不同元件之间的通信,以此取代昂贵而笨重的配电线束。该协议的健壮性使其用途延伸到其他自动化和工业应用。CAN协议的特性包括完整性的串行数据通讯、提供实时支持、传输速率高达1Mb/s、同时具有11位的寻址以及检错能力 CAN协议基础知识 I2C.SPI总线多用于短距离传输,协议简单,数据量少,主要用于IC之间的通讯,而 CAN 总线则不同,CAN(Controller Area Network) 总线定义了更为优秀的物理层、数据链路层,并且拥有种类丰富、简繁不一的上层协议。与I2C、SPI有时钟信号的同步通讯方式不同,CAN通讯并不是以时钟信号来进行同步的,它是一种异步通讯,只具有CAN_High和CAN_L... HAL库 的应该用比较新潮,经常找不到资料。今天说说,在CAN开发中的应用。 一,发送。 static HAL_StatusTypeDef Can_MsgSend(uint32_t ID,uint8_t * pData,uint8_t len) HAL_StatusTypeDef retSTD; canTxMsg.StdId=ID;//0x500|(GetLocalID()&0xFF 2021/07/20 悍匠暑假集训第三天CAN 控制 RM 电机1、CAN 概述1.1、仲裁场1.2、控制场和数据场2、RM C620电机使用2.1、电调发送报文格式2.2、电调接收报文格式3、CAN在cubeMX中的配置4、CAN发送函数4.1、CAN_cmd_chassis函数4.1.1、CAN发送的函数 HAL_CAN_AddTXMessage5、CAN接收中断回调5.1、接收函数 HAL_CAN_GetRxMessage5.1.1、解码函数 get_motor_measure CAN 控制 RM / 例: 500kbps = 36MHz / 9 / (3 + 4 + 1) 36MHz为该例程APB1的总线时钟。// CAN接收中断。// CAN波特率 = CAN时钟频率 / Prescaler / (TimeSeg1 + TimeSeg2 + 1)直接根据芯片和原理图在CubeMX设置就好了。(写两次两次忘记使能时钟)不使能中断没有办法接收数据。这个是从别的博主那里找到的。