HAL库配置CAN通信

一、CAN总线波特率计算

CAN总线通信的各节点通信时会产生相位差,所以要进行位同步,两个节点保持步调一致。
CAN_SJW:重新同步跳跃宽度(SJW) 。定义了在每位中可以延长或缩短多少个时间单元的上限。其值可以编程为1到4个时间单元。
CAN_BS1:时间段1(BS1):定义采样点的位置。其值可以编程为1到16个时间单元,但也可以被自动延长,以补偿因为网络中不同节点的频率差异所造成的相位的正向漂移。
CAN_BS2:时间段2(BS2):定义发送点的位置。其值可以编程为1到8个时间单元,但也可以被自动缩短以补偿相位的负向漂移。
CAN_Prescaler:直观理解就是分频率。
CAN总线的波特率是取自于总线APB1(PCLK1),通过函数RCC_PCLK1Config给PCLK1配置频率。设置了以上的四个值之后,
CAN总线的波特率=PCLK1/((CAN_SJW +CAN_BS1 + CAN_BS2)*CAN_Prescaler)
假设PCLK1=36MHz、CAN_SJW=1、CAN_BS1=8、CAN_BS2=7、CAN_Prescaler=9
则CAN总线的波特率=PCLK1/((1 + 8 + 7) * 9) = 36MHz / 16 / 9 = 250Kbits

二、查看对应数据手册(stm32F407ZG),看CAN挂载在哪条总线上面,以及对应的引脚 

三、CAN过滤器介绍

typedef struct
{__IO uint32_t FR1;           //标识符屏蔽位模式中标识符寄存器,配置ID__IO uint32_t FR2;           //标识符屏蔽位模式中屏蔽寄存器
}CAN_FilterRegister_TypeDef;  //标识符列表模式中为2个标识符寄存器,配置ID

例如:屏蔽位寄存器的bit15=1,标识符寄存器的bit15=0,那么接受的Message里面的标识符的bit15必须为0才可能被硬件接受。如果屏蔽位寄存器的bit15=0,Message里面的标识符的bit15无论为什么值,bit15都能匹配通过。

32位屏蔽位模式下:1个过滤器。FR2指定需要关心哪些位,FR1指定这些位的标准值
32位列表模式下:2个过滤器,FR1指定过滤器0的标准值,FR2指定过滤器1的标准值
16位屏蔽位模式下:2个过滤器。FR1高位配置过滤器0标准值,低位配置给过滤器1的标准值。FR2高位配置过滤器0关心的位,低位配置给过滤器1的关心的位。
16位列表模式下:4个过滤器。FR1低位配置过滤器0,高位配置过滤器1。FR2配置过滤器2和过滤器3

IDE=0为标准ID,IDE=1为扩展ID。
RTR=0代表数据帧,RTR=1代表远程帧。
MASKID设置屏蔽码,ID设置标准值。

四、CAN过滤器配置

只有配置了CAN过滤器才能接收到数据,下面配置过滤器是所有ID都可以接收。加入到CAN初始化的函数中

	CAN_FilterTypeDef sFilterConfig;sFilterConfig.FilterBank = 0;   //过滤器0sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;   //标识符屏蔽位模式sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;  //过滤器位宽为单个32位sFilterConfig.FilterIdHigh = 0x0000;  //标识符寄存器   sFilterConfig.FilterIdLow = 0x0000;   //标识符寄存器   sFilterConfig.FilterMaskIdHigh = 0x0000;   //屏蔽寄存器,只存在于标识符屏蔽位模式中,在标识符列表模式中为标识符寄存器 sFilterConfig.FilterMaskIdLow = 0x0000;    //屏蔽寄存器                                 sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0; //FIFO0的中断和FIFO1的中断是不一样的,这里是把接收到的报文放入到FIFO0中sFilterConfig.FilterActivation = CAN_FILTER_ENABLE;   //enable filtersFilterConfig.SlaveStartFilterBank = 0;    /* 过滤器配置 */if (HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig) != HAL_OK){Error_Handler();}/* 启动CAN外围设备 */if (HAL_CAN_Start(&hcan1) != HAL_OK){Error_Handler();}

五、HAL库初始化

发送函数代码具体如下: 

CAN_TxHeaderTypeDef g_canx_txheader;    /* 发送参数句柄 */
CAN_RxHeaderTypeDef g_canx_rxheader;    /* 接收参数句柄 *//**
* @brief CAN 发送一组数据
* @note 发送格式固定为: 标准 ID, 数据帧
* @param id : 标准 ID(11 位)
* @retval 发送状态 0, 成功; 1, 失败;
*/
uint8_t can_send_msg(uint32_t id, uint8_t *msg, uint8_t len)
{uint32_t TxMailbox = CAN_TX_MAILBOX0;g_canx_txheader.StdId = id; /* 标准标识符 */g_canx_txheader.ExtId = id; /* 扩展标识符(29 位) */g_canx_txheader.IDE = CAN_ID_STD; /* 使用标准帧 */g_canx_txheader.RTR = CAN_RTR_DATA; /* 数据帧 */g_canx_txheader.DLC = len;if (HAL_CAN_AddTxMessage(&g_canx_handler, &g_canx_txheader,msg, &TxMailbox) != HAL_OK) {return 1;}/* 等待发送完成,所有邮箱为空(3 个邮箱) */while (HAL_CAN_GetTxMailboxesFreeLevel(&g_canx_handler) != 3);return 0;
}

在 CAN 初始化时,我们对于过滤器的配置是不过滤任何报文 ID,也就是说可以接收全部
报文。但是我们可以编写接收函数时,使用软件的方式过滤报文 ID,通过形参来跟接收到的报
文 ID 进行匹配。接收函数代码具体如下: 

/**
* @brief CAN 接收数据查询
* @note 接收数据格式固定为: 标准 ID, 数据帧
* @param id : 要查询的 标准 ID(11 位)
* @param buf : 数据缓存区
* @retval 接收结果
* @arg 0 , 无数据被接收到;
* @arg 其他, 接收的数据长度
*/
uint8_t can_receive_msg(uint32_t id, uint8_t *buf)
{if (HAL_CAN_GetRxFifoFillLevel(&g_canx_handler, CAN_RX_FIFO0) != 1){return 0;}if (HAL_CAN_GetRxMessage(&g_canx_handler, CAN_RX_FIFO0, &g_canx_rxheader,buf) !=HAL_OK){return 0;}/* 接收到的 ID 不对 / 不是标准帧 / 不是数据帧 */if (g_canx_rxheader.StdId!= id || g_canx_rxheader.IDE != CAN_ID_STD ||g_canx_rxheader.RTR != CAN_RTR_DATA){return 0;}return g_canx_rxheader.DLC;
}

 六、验证代码

(1)将CAN配置为静默回环模式,配置过滤器不过滤

/* CAN1 init function */
void MX_CAN1_Init(void)
{/* USER CODE BEGIN CAN1_Init 0 *//* USER CODE END CAN1_Init 0 *//* USER CODE BEGIN CAN1_Init 1 *//* USER CODE END CAN1_Init 1 */hcan1.Instance = CAN1;hcan1.Init.Prescaler = 16;hcan1.Init.Mode = CAN_MODE_SILENT_LOOPBACK;//静默回环模式hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;hcan1.Init.TimeSeg1 = CAN_BS1_4TQ;hcan1.Init.TimeSeg2 = CAN_BS2_3TQ;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();}/* USER CODE BEGIN CAN1_Init 2 */CAN_FilterTypeDef sFilterConfig;sFilterConfig.FilterBank = 0;   //过滤器0sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;   //标识符屏蔽位模式sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;  //过滤器位宽为单个32位sFilterConfig.FilterIdHigh = 0x0000;  //标识符寄存器   sFilterConfig.FilterIdLow = 0x0000;   //标识符寄存器   sFilterConfig.FilterMaskIdHigh = 0x0000;   //屏蔽寄存器,只存在于标识符屏蔽位模式中,在标识符列表模式中为标识符寄存器 sFilterConfig.FilterMaskIdLow = 0x0000;    //屏蔽寄存器                                 sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0; //FIFO0的中断和FIFO1的中断是不一样的,这里是把接收到的报文放入到FIFO0中sFilterConfig.FilterActivation = CAN_FILTER_ENABLE;   //enable filtersFilterConfig.SlaveStartFilterBank = 0;    /* 过滤器配置 */if (HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig) != HAL_OK){Error_Handler();}/* 启动CAN外围设备 */if (HAL_CAN_Start(&hcan1) != HAL_OK){Error_Handler();}/* USER CODE END CAN1_Init 2 */}

(2)加入CAN数据收发代码

(3)仿真验证数据是否接收成功

	uint8_t buf[10]="aaa";uint8_t buf1[10]={0};can_send_msg(0x12,buf,3);can_receive_msg(0x12,buf1);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/663048.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

centos7 安装nacos

在 CentOS 7 上安装 Nacos 的步骤可以概括如下: 前提条件: 安装Java环境:Nacos依赖于Java 8或以上版本,确保系统已安装Java。可以通过以下命令检查和安装(假设使用OpenJDK): # 检查是否已安装…

【数据分享】1929-2023年全球站点的逐日最低气温数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、湿度等指标,其中又以气温指标最为常用!说到气温数据,最详细的气温数据是具体到气象监测站点的气温数据! 之前我们分享过1929-2023年全球气象站…

【AudioPolicy To AudioHAL笔记(一)】AudioPolicy启动过程

AudioPolicy启动过程 一、总体启动过程二、代码分析三、动态分析 /*****************************************************************************************************************/ 声明: 本博客内容均由https://blog.csdn.net/weixin_47702410原创,转载or…

week03day04(正则表达式2)

一. 正则表达式 1. 匹配次数相关的正则符号 a. 一次或多次(至少一次) ,控制 前面元素的次数,看下面事例 from re import fullmatch a 至少一个a , \d 至少一个数字字符 result fullmatch(r1a2,1aaaaaaaa2) #1和2中间至少要有一个a…

wsl + vscode 离线配置 ERROR: Faild to download https://update.code.visualstudio.com

内网情况配置 wsl 和 vscode。在wsl中下载不了 vscode 的核心。 报错: ERROR: Faild to download https://update.code.visualstudio.com/commit:8b3775030ed1a69b13e4f4c628c612102e30a681/server-linux-x64/stable 很多情况下是没有现成的VS Code Server程序的&…

三好夫人:真爱战胜一切

真爱如同飞蛾扑火,明知前方是毁灭,却仍心甘情愿地奔赴。如果一个男人真心爱你,他会倾尽所有,不遗余力地满足你的需求。这份爱,会在他的言行举止中流露出来。男人对你的爱,常常表现在他的言语之中。 如果他爱…

桌面显示器应用Type-C接口有什么好处

随着科技的不断发展,桌面显示器作为我们日常工作中不可或缺的设备之一,也在不断更新换代。其中,Type-C接口的应用成为了桌面显示器发展的一个重要趋势。那么,桌面显示器应用Type-C接口究竟有什么好处呢? 首先&#xff…

本地运行面壁智能的“贺岁模型”:MiniCPM 2B

简单聊聊可以在端侧运行的 Mini CPM 2B SFT / DPO 版本的模型。 写在前面 模型是好是坏,其实不用看公众号们的营销,小马过河问题,自己试试就知道了。当然,2B 参数量的模型,适合的场景肯定不是 34B / 70B 所擅长的&am…

VBA_MF系列技术资料1-325

MF系列VBA技术资料 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧,我参考大量的资料,并结合自己的经验总结了这份MF系列VBA技术综合资料,而且开放源码(MF04除外),其中MF01-04属于…

项目安全问题及解决方法------使用合适的算法

Spring Security 已经废弃了 MessageDigestPasswordEncoder,推荐使用 BCryptPasswordEncoder private static BCryptPasswordEncoder passwordEncoder new BCryptPasswordEncoder(); GetMapping("performance")public void performance() {StopWatch st…

图数据库Neo4j集成springboot及导入数据踩坑问题

文章目录 ----------------------------------常用cql------------------------------------删除所有节点删除指定节点删除所有关系删除指定关系查看所有节点查看某种节点查看总节点数删除所有关系节点删除所有关系 ------------------------------手动导入数据---------------…

android开发---简单购物商城(JAVA) (一)

包括&#xff1a;商品展示&#xff0c;商品详情&#xff0c;购物车&#xff0c;删除&#xff0c;一键清除&#xff0c;返回 运用sqllist 另外因为一篇写不下 继续可看 源码二 下面是目录 运行样子 下面是源码 AndroidManifest.xml <?xml version"1.0" e…

代码随想录算法训练营29期Day37|LeetCode 738,968

文档讲解&#xff1a;单调递增的数字 监控二叉树 贪心算法总结 738.单调递增的数字 题目链接&#xff1a;https://leetcode.cn/problems/monotone-increasing-digits/description/ 思路&#xff1a; 题目要求小于等于N的最大单调递增的整数&#xff0c;那么拿一个两位的数字…

Android 8.1 铃声音量通话音量同步调节

Android 8.1 铃声音量通话音量同步调节 最近收到客户反馈&#xff0c;想要实现铃声音量通话音量同步调节&#xff0c;具体修改参照如下&#xff1a; /frameworks/base/core/java/android/preference/SeekBarVolumizer.java if (defaultUri null) {if (mStreamType AudioMan…

统计图表在线配置服务-百度 SugarBI的学习笔记

最近&#xff0c;有个产品要支持统计图表在线可配置&#xff0c;这样&#xff0c;当用户有新增统计指标的需求时&#xff0c;运维人员通过界面化配置&#xff0c;就可以增加统计指标了&#xff0c;不用开发写代码&#xff0c;画页面了。 上网查了下相关的组件&#xff0c;感觉…

SG2520CAA汽车用晶体振荡器

爱普生SG2520CAA是简单的封装晶体振荡器&#xff08;SPXO&#xff09;&#xff0c;具有CMOS输出&#xff0c;这款SPXO是汽车和高可靠性应用的理想选择&#xff0c;符合AEC-Q200标准&#xff0c;功耗低&#xff0c;工作电压范围为1.8 V ~ 3.3 V类型&#xff0c;宽工作温度-40℃~…

VPP学习-startup.conf配置文件

背景 VPP&#xff08;Vector Packet Processing&#xff0c;矢量报文处理&#xff09;&#xff0c;作为一个开源的高性能数据包处理框架&#xff0c;旨在提供可扩展、灵活且高效的网络数据包处理能力&#xff1b;由于传统Linux 内核协议栈整体网络吞吐性能的局限性&#xff0c;…

PyTorch和TensorFlow的简介

一、PyTorch和TensorFlow的简介 1.1 Pytorch PyTorch是由Facebook开发的一个开源深度学习框架&#xff0c;它提供了一个动态计算图模型&#xff0c;可以在GPU上运行。它于2017年首次发布。PyTorch提供了一个灵活、动态的计算图&#xff0c;使得深度学习模型的构建和调试更加直…

【Linux】环境基础开发工具的使用之gcc详解(二)

前言&#xff1a;上一篇文章中我们讲解了Linux下的vim和yum的工具的使用&#xff0c;今天我们将在上一次的基础上进一步的讲解开放工具的时候。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:Linux的深度刨析 &#x1f448; &#x1f4a…

小程序配置服务器域名:步骤与注意事项

随着移动互联网的普及&#xff0c;小程序已成为许多企业和开发者的首选应用形式。为了确保小程序的正常运行和最佳用户体验&#xff0c;服务器域名的配置至关重要。本文将详细介绍小程序配置服务器域名的步骤及注意事项。 一、为什么要配置服务器域名&#xff1f; 小程序运行…