当前位置: 首页 > news >正文

STM32F103VET6 CAN 双板通信实战:从配置到代码实现

STM32F103VET6 CAN 双板通信实战:从配置到代码实现

在工业控制和汽车电子领域,CAN(Controller Area Network)总线凭借其高可靠性和多主特性,成为最常用的通信协议之一。本文将带你一步步在 STM32F103VET6 上实现两块开发板之间的 CAN 通信,包含硬件连接、HAL 库配置、过滤器设置及中断接收的完整代码。


一、硬件准备与连接

在编写代码之前,物理连接是通信成功的基础。CAN 总线是差分信号,必须严格遵循以下接线规则:

该图来自@Embedd1000010出处
1. 接线图

你需要两块 STM32F103VET6 开发板(或一块板子连接 USB-CAN 分析仪),以及 CAN 收发器(如 TJA1050 模块)。

板子 A (或分析仪)连接线板子 B (或分析仪)
CAN_H<------>CAN_H
CAN_L<------>CAN_L
GND<------>GND(必须共地)
2. 终端电阻

CAN 总线要求在物理链路的两端并联120Ω电阻以消除信号反射。

  • 注意:如果你的开发板板载了 120Ω 电阻,无需额外添加;如果没有,请在两块板子的 CAN_H 和 CAN_L 之间各焊一个 120Ω 电阻。

二、软件架构与流程

根据你提供的流程图,CAN 通信的初始化逻辑非常清晰。在main函数中,我们需要严格按照以下顺序执行:

  1. CAN 初始化:配置波特率、模式(正常/环回)。
  2. 过滤器初始化:决定接收哪些 ID 的数据。
  3. 启动 CAN:进入正常工作模式。
  4. 开启接收中断:让 CPU 在收到数据时自动处理,不阻塞主循环。
  5. 发送数据:在while(1)中循环发送。

三、核心代码实现

以下是基于 STM32 HAL 库的完整实现代码。

1. 头文件与全局变量

首先定义全局的句柄和报文结构体。TxHeaderRxHeader是 HAL 库收发函数的核心参数。

#include "main.h" #include <stdio.h> #include <string.h> CAN_HandleTypeDef hcan; UART_HandleTypeDef huart1; // 用于 printf 打印调试 /* CAN 报文结构体 */ CAN_TxHeaderTypeDef TxHeader; CAN_RxHeaderTypeDef RxHeader; uint8_t RxData[8]; // 接收数据缓存 uint32_t TxMailbox; // 发送邮箱号 char MsgBuffer[50]; // 打印缓存 /* 函数声明 */ void CAN_Filter_Config(void); void CAN_Start_Init(void); void CAN_Send_Msg(uint8_t *data, uint8_t len);
2. CAN 初始化(波特率配置)

MX_CAN_Init()中,波特率是最关键的参数。双板通信必须保证波特率完全一致

static void MX_CAN_Init(void) { hcan.Instance = CAN1; hcan.Init.Prescaler = 9; // 波特率分频系数 hcan.Init.Mode = CAN_MODE_NORMAL; // 正常模式(调试时可用环回模式 CAN_MODE_LOOPBACK) hcan.Init.SyncJumpWidth = CAN_SJW_1TQ; hcan.Init.TimeSeg1 = CAN_BS1_6TQ; // 时间段1 hcan.Init.TimeSeg2 = CAN_BS2_1TQ; // 时间段2 // 波特率计算公式: 36MHz / (Prescaler * (1 + BS1 + BS2)) // 36000000 / (9 * (1 + 6 + 1)) = 500Kbps hcan.Init.TimeTriggeredMode = DISABLE; hcan.Init.AutoBusOff = DISABLE; hcan.Init.AutoWakeUp = DISABLE; hcan.Init.AutoRetransmission = ENABLE; // 开启自动重传 hcan.Init.ReceiveFifoLocked = DISABLE; hcan.Init.TransmitFifoPriority = DISABLE; if (HAL_CAN_Init(&hcan) != HAL_OK) { Error_Handler(); } }
3. 过滤器配置

CAN 过滤器决定了单片机“愿意”接收哪些数据。以下代码配置为32位掩码模式,接收所有标准 ID 数据。

void CAN_Filter_Config(void) { CAN_FilterTypeDef sFilterConfig; sFilterConfig.FilterBank = 0; // 过滤器组0 sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; // 掩码模式 sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; // 32位尺度 sFilterConfig.FilterIdHigh = 0x0000; // ID高16位 sFilterConfig.FilterIdLow = 0x0000; // ID低16位 sFilterConfig.FilterMaskIdHigh = 0x0000; // 掩码高16位 (0表示不关心) sFilterConfig.FilterMaskIdLow = 0x0000; // 掩码低16位 sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;// 匹配后存入 FIFO0 sFilterConfig.FilterActivation = ENABLE; // 激活 sFilterConfig.SlaveStartFilterBank = 14; // 仅用于互联型产品,F103可忽略 if (HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK) { Error_Handler(); } }
4. 启动与中断使能

这一步将 CAN 外设置于工作状态,并打开接收中断,允许 CPU 响应收到的数据。

void CAN_Start_Init(void) { // 1. 启动 CAN if (HAL_CAN_Start(&hcan) != HAL_OK) { Error_Handler(); } // 2. 开启接收中断 (FIFO 0 消息挂起中断) if (HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK) { Error_Handler(); } // 3. 配置 NVIC 中断优先级 (通常在 stm32f1xx_it.c 中处理,但需在此使能) HAL_NVIC_SetPriority(CAN1_RX0_IRQn, 1, 0); HAL_NVIC_EnableIRQ(CAN1_RX0_IRQn); }
5. 数据发送函数

封装一个发送函数,方便在while(1)中调用。

void CAN_Send_Msg(uint8_t *data, uint8_t len) { TxHeader.StdId = 0x111; // 标准 ID TxHeader.ExtId = 0x0; // 扩展 ID (不使用) TxHeader.IDE = CAN_ID_STD; // 使用标准 ID TxHeader.RTR = CAN_RTR_DATA; // 数据帧 TxHeader.DLC = len; // 数据长度 TxHeader.TransmitGlobalTime = DISABLE; // 发送数据 if (HAL_CAN_AddTxMessage(&hcan, &TxHeader, data, &TxMailbox) != HAL_OK) { printf("发送失败!\r\n"); } }
6. 接收中断回调

当 CAN 总线收到数据且通过过滤器后,硬件会自动触发中断,并执行此回调函数。

void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) { if (hcan->Instance == CAN1) { // 获取数据 HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxHeader, RxData); printf("---> 接收到数据!\r\n"); printf("ID: 0x%X, DLC: %d\r\n", RxHeader.StdId, RxHeader.DLC); printf("Data: %02X %02X %02X %02X\r\n", RxData[0], RxData[1], RxData[2], RxData[3]); printf("<---\r\n"); } } // 中断服务程序 (需放在 stm32f1xx_it.c 或 main.c 中) void CAN1_RX0_IRQHandler(void) { HAL_CAN_IRQHandler(&hcan); }

四、主函数逻辑

将上述模块在main函数中串联起来。

int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_CAN_Init(); MX_USART1_UART_Init(); // 初始化串口用于 printf /* CAN 配置流程 */ CAN_Filter_Config(); // 配置过滤器 CAN_Start_Init(); // 启动并开启中断 uint8_t tx_data[4] = {0x01, 0x02, 0x03, 0x04}; uint32_t tick = 0; printf("CAN 双板通信测试开始...\r\n"); while (1) { // 每 500ms 发送一次数据 if (HAL_GetTick() - tick > 500) { tick = HAL_GetTick(); tx_data[0]++; // 数据自增,方便观察 CAN_Send_Msg(tx_data, 4); } } }

五、常见问题排查

  1. 收不到数据?
    • 检查 GND 是否连接(共地是必须的)。
    • 检查波特率是否一致(两块板子必须完全相同)。
    • 检查过滤器配置,建议先配置为全接收(掩码全 0)测试通断。
  2. printf 不打印?
    • 确保重定向了_writefputc函数到 USART1。
  3. 报错HAL_CAN_ActivateNotification
    • 确保在stm32f1xx_it.c中添加了CAN1_RX0_IRQHandler中断入口函数。

通过以上步骤,你应该能成功实现 STM32F103 之间的双向数据通信。

http://www.jsqmd.com/news/693614/

相关文章:

  • 王其聪-简历
  • LogExpert:Windows平台最强日志查看工具,告别tail命令的繁琐操作
  • 保姆级教程:在Jetson Nano上搞定IMX219-83双目相机,从硬件连接到ROS驱动
  • 想学无人机编程但怕炸机?试试这个Unity模拟方案:从零配置飞行控制与传感器数据可视化
  • 虚拟机上玩转工业通讯:用Win7+VMware搭建倍福PLC Modbus-TCP测试环境全记录
  • 2026年广州最出名留学机构推荐:五家优选深度对比 - 科技焦点
  • OCR识别 + Excel导出:一键生成商品数据表(批量处理实战)
  • 普通人逆袭!靠游戏搬砖,每月稳稳月入两万
  • 3分钟快速上手:通达信缠论量化分析插件实战指南
  • 基于国家密码管理局发布的商用密码管理条例,国家关键信息基础设施必须采用国产密码算法。在这一政策背景下,国密CPU门禁系统应运而生,成为高安全场所门禁建设的首选方案杜绝NFC普及、卡片复制、射频嗅探泛滥
  • WarcraftHelper:终极魔兽争霸III兼容性修复指南 [特殊字符]
  • 2026年4月广州搬家/红木家具搬运/设备移/起重吊装/公司搬迁服务口碑深度解析,广东人人专业吊装搬运有限公司何以脱颖而出? - 2026年企业推荐榜
  • 2026升学率比较高的国际高中插班,深圳留学机构推荐 - 品牌2026
  • 多通道CNN在文本分类中的应用与实践
  • 抖音下载实战:解密批量下载与去水印的终极方案
  • 终极DLSS Swapper完全指南:3大核心功能解锁游戏性能新高度
  • ISO 26262 深度解读系列(二):Part 2 - 功能安全管理 第1章 Scope
  • 告别HAL库延迟:用STM32CubeMX配置LL库驱动串口,实现高效数据收发实战
  • 深圳服务优质的品牌设计公司推荐:2026 年企业如何选择靠谱的品牌升级机构 - 2026品牌推荐官
  • Wireshark抓包实战:当MQTT遇上TLS加密,如何解密并分析MQTTS数据包?
  • 从零搭建一个小型实验室网络:用FreeRADIUS和OpenWRT实现WPA2-Enterprise认证
  • 英雄联盟智能助手终极指南:如何用League Akari提升你的游戏体验
  • 如何5分钟完成飞书文档批量导出:开源工具终极指南
  • 掌握在线幻灯片创作:PPTist打造专业演示文稿的完整解决方案
  • 科技与港股同步承压,等待市场选择方向!
  • 北京土地纠纷律师张鑫:深耕领域数十年的维权专家 - 律界观察
  • 2026年嘉兴制造业短视频代运营:源头工厂获客全案破局指南 - 优质企业观察收录
  • Pandas数据分析实战:从快乐8开奖数据里,我们能发现什么规律?
  • 2026陕西学化妆哪家好?TOP5正规化妆学校避坑推荐,内行人权威揭秘 - 深度智识库
  • Geehy G32R430 MCU硬件加速与工业控制应用解析