STM32CubeMX 之 CAN通讯

STM32CubeMX 之 CAN通讯文章下方附学习资源 自助领取一 CAN 总线简介 CAN 是控制器局域网络 Controller Area Network CAN 的简称 是由以研发和生产汽车电子产品著称的德国 BOSCH 公司开发的 是国际上应用最广泛的现场总线之一

大家好,欢迎来到IT知识分享网。

文章下方附学习资源,自助领取

一、CAN总线简介

CAN是控制器局域网络(Controller Area Network,CAN)的简称,是由以研发和生产汽车电子产品著称的德国BOSCH公司开发的,是国际上应用最广泛的现场总线之一。

CAN控制器通过组成总线的2根线(CAN-H和CAN-L)的电位差来确定总线的电平,信号是以两线之间的“差分”电压形式出现,这点与RS485类似,但两者电平值不同。CAN总线电平分为显性电平和隐性电平。

CAN总线采用两种互补的逻辑数值“显性”和“隐性”。其中,“显性”数值表示逻辑“0”,而“隐性”表示逻辑“1”。

当总线上同时出现“显性”位和“隐性”位时,最终呈现在总线上的是“显性”位。 在“隐性”状态下,VCAN_H和VCAN_L被固定于平均电压电平,Vdiff近似为零,此时VCAN_H和VCAN_L的标称值为2.5V。“显性”位以大于最小阀值的差分电压表示,此时VCAN_H的标称值为3.5V,VCAN_L的标称值为1.5V,如下图所示:

STM32CubeMX 之 CAN通讯

二、CAN帧结构

CAN总线节点上的节点发送数据,是以报文的形式广播给网络中所有节点。收发器接收到数据就把数据传送给控制器,再由控制器检查判断是不是所需数据,不是则忽略。

● 网络上任何一个节点在任何时候都可以发送数据;

多个节点发送数据,优先级低主动退出发送;

短帧结构,每帧数据信息为0~8字节(具体用户定义),对数据编码而不是地址编码;

CAN每帧都有CRC校验和其他检验措施,严重错误的情况下具有自动关闭输出的功能。

至于报文传输,则由以下5个不同的帧类型所表示和控制:

数据帧:数据帧携带数据从发送器至接收器。

远程帧:总线单元发出远程帧,请求发送具有同一识别符的数据帧。

错误帧:任何单元检测到总线错误就发出错误帧。

帧间隔:数据帧(或远程帧)通过帧间空间与前述的各帧分开。

过载帧:过载帧用以在先行的和后续的数据帧(或远程帧)之间提供附加的延时。

嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!

无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。

点击这里找小助理0元领取:嵌入式物联网学习资料(头条)

STM32CubeMX 之 CAN通讯

STM32CubeMX 之 CAN通讯

三、硬件设计

现在很多单片机中内置CAN总线协议控制器,只要外接总线驱动芯片和适当的抗干扰电路就可以很方便地建立一个CAN总线智能测控节点。

驱动芯片如下:

STM32CubeMX 之 CAN通讯

四、软件设计

这里以STM32L431单片机为例,建立STM32CubeMX工程,使能CAN接口,设置时钟及分配系数等参数,如下图所示:

STM32CubeMX 之 CAN通讯

STM32L431的系统时钟为80M,上图中设置的波特率为100kbps。计算方法如下:

CAN波特率为 = 系统时钟/Prescaler/ (SJW+BS1+BS2) = 80MHz/32/(1+16+8) = 100KHz

使能接收中断:

STM32CubeMX 之 CAN通讯

生成代码后,添加CAN滤波器配置函数,如下:

//can滤波器配置函数 void CANFilter_Config(void) { CAN_FilterTypeDef sFilterConfig; sFilterConfig.FilterBank = 0; //CAN过滤器编号,范围0-27 sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; //CAN过滤器模式,掩码模式或列表模式 sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; //CAN过滤器尺度,16位或32位 sFilterConfig.FilterIdHigh = 0x000 << 5; //32位下,存储要过滤ID的高16位 sFilterConfig.FilterIdLow = 0x0000; //32位下,存储要过滤ID的低16位 sFilterConfig.FilterMaskIdHigh = 0x0000; //掩码模式下,存储的是掩码 sFilterConfig.FilterMaskIdLow = 0x0000; sFilterConfig.FilterFIFOAssignment = 0; //报文通过过滤器的匹配后,存储到哪个FIFO sFilterConfig.FilterActivation = ENABLE; //激活过滤器 sFilterConfig.SlaveStartFilterBank = 0; if (HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig) != HAL_OK) { Error_Handler(); } }

编写接收中断函数和发送数据函数:

static CAN_TxHeaderTypeDef TxMessage; //CAN发送的消息的消息头 static CAN_RxHeaderTypeDef RxMessage; //CAN接收的消息的消息头 //can总线接收中断函数 void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) { uint8_t data[8]; //接收数据缓存 HAL_StatusTypeDef status; if (hcan == &hcan1) { status = HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxMessage, data); if (HAL_OK == status) { //数据处理。。。 } } } //can发送数据函数 void CAN1_Send_Test() { uint8_t data[4] = {0x01, 0x02, 0x03, 0x04}; //需要发送的数据 TxMessage.IDE = CAN_ID_STD; //设置ID类型 TxMessage.StdId = 0x222; //设置ID号 TxMessage.RTR = CAN_RTR_DATA; //设置传送数据帧 TxMessage.DLC = 4; //设置数据长度 if (HAL_CAN_AddTxMessage(&hcan1, &TxMessage, data, (uint32_t*)CAN_TX_MAILBOX0) != HAL_OK) { Error_Handler(); } } 

在主函数中调用滤波器配置函数,启动CAN总线,使能接收中断,并循环发送测试数据:

 CANFilter_Config(); HAL_CAN_Start(&hcan1); HAL_CAN_ActivateNotification(&hcan1,CAN_IT_RX_FIFO0_MSG_PENDING); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { CAN1_Send_Test(); HAL_Delay(100); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ }

通过USB转CAN的工具可以在电脑端查看数据是否成功。可以看到,数据可以正常发送。

STM32CubeMX 之 CAN通讯

END

文章来源于嵌入式技术开发 ,作者Mr张工

版权声明:本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/98593.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信