我们已经打开了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上位机发送数据,注意发送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设置就好了。(写两次两次忘记使能时钟)不使能中断没有办法接收数据。这个是从别的博主那里找到的。