首页 物联网

STM32 CAN 通信疑难杂症:TJA1050 与 USB 供电的那些坑

分类:物联网
字数: (0606)
阅读: (6527)
内容摘要:STM32 CAN 通信疑难杂症:TJA1050 与 USB 供电的那些坑,

最近在调试一个项目,使用 STM32 单片机,配合 TJA1050 CAN 收发器实现 CAN 总线通信。理论上配置都没问题,波特率、滤波、中断等等,但就是死活收不到数据,或者发送出去对方也收不到。排查了一天一夜,差点怀疑人生。今天就来聊聊这个坑,以及我是怎么爬出来的。

问题场景重现

硬件环境:

  • STM32F103C8T6 最小系统板
  • TJA1050 CAN 收发器模块
  • USB 转 CAN 分析仪
  • USB 扩展坞

软件环境:

  • Keil MDK
  • STM32CubeMX 配置工程
  • CAN 分析仪配套上位机软件

现象:

STM32 CAN 通信疑难杂症:TJA1050 与 USB 供电的那些坑
  • 单片机程序运行正常,初始化 CAN 总线无报错。
  • CAN 分析仪上位机显示总线空闲,没有数据收发。
  • 使用示波器观察 CAN_H 和 CAN_L 引脚,波形异常,幅值偏低,不稳定。

底层原理深度剖析

首先,确保你的代码没问题。STM32 CAN 外设的配置相对简单,关键是波特率计算、滤波器设置和中断处理。但如果配置正确,硬件上依然无法通信,那就需要考虑以下几个方面了:

  1. TJA1050 供电问题: TJA1050 需要稳定的 5V 电源供电。如果供电电压不稳定,或者纹波过大,都会影响 CAN 收发器的正常工作。

  2. USB 扩展坞的供电能力: 这是一个容易被忽略的点。很多 USB 扩展坞的 5V 电源输出能力有限,尤其是连接多个 USB 设备时,电压可能会下降。这会导致 CAN 分析仪工作异常,或者无法为 TJA1050 提供足够的供电。

    STM32 CAN 通信疑难杂症:TJA1050 与 USB 供电的那些坑
  3. CAN 总线终端电阻: CAN 总线需要 120 欧姆的终端电阻,以匹配总线阻抗,防止信号反射。如果没有终端电阻,或者终端电阻值不正确,都会导致通信异常。

  4. 共地问题: STM32、TJA1050 和 CAN 分析仪必须共地。如果地线连接不良,会产生共模干扰,影响通信质量。

具体的代码/配置解决方案

以下是一些可能的解决方案,结合我的实际经验:

STM32 CAN 通信疑难杂症:TJA1050 与 USB 供电的那些坑
  1. 优化供电:

    • 尝试使用外部 5V 电源为 TJA1050 供电,避免使用 USB 扩展坞。
    • 在 TJA1050 的电源输入端并联一个 100uF 的电解电容和一个 0.1uF 的陶瓷电容,以滤除电源纹波。
  2. 检查终端电阻:

    • 确保 CAN 总线的两端各有一个 120 欧姆的终端电阻。
    • 使用万用表测量终端电阻的值,确保其在 110-130 欧姆之间。
  3. 确保共地:

    STM32 CAN 通信疑难杂症:TJA1050 与 USB 供电的那些坑
    • 使用短而粗的导线将 STM32、TJA1050 和 CAN 分析仪的地线连接在一起。
    • 避免使用过长的地线,以减少地线阻抗。
  4. STM32 CAN 初始化代码(示例):

// CAN 初始化函数
void CAN_Config(void) {
  CAN_InitTypeDef        CAN_InitStructure;
  CAN_FilterInitTypeDef  CAN_FilterInitStructure;
  GPIO_InitTypeDef         GPIO_InitStructure;

  // 使能 CAN 时钟
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

  // 配置 CAN 引脚:PA11 (CAN_RX) 和 PA12 (CAN_TX)
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;  // TX引脚配置为复用推挽输出
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  // CAN 初始化
  CAN_InitStructure.CAN_TTCM = DISABLE; // 时间触发通信模式
  CAN_InitStructure.CAN_ABOM = DISABLE; // 自动离线管理
  CAN_InitStructure.CAN_AWUM = DISABLE; // 自动唤醒模式
  CAN_InitStructure.CAN_NART = DISABLE; // 禁止报文重传
  CAN_InitStructure.CAN_RFLM = DISABLE; // FIFO 锁定模式
  CAN_InitStructure.CAN_TXFP = DISABLE; // 发送 FIFO 优先级
  CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; // 正常模式
  CAN_InitStructure.CAN_SJW  = CAN_SJW_1tq; // 同步跳转宽度 1 个时间量子
  CAN_InitStructure.CAN_BSeg1 = CAN_BSeg1_8tq; // 时间段 1 8 个时间量子
  CAN_InitStructure.CAN_BSeg2 = CAN_BSeg2_7tq; // 时间段 2 7 个时间量子
  CAN_InitStructure.CAN_Prescaler = 6;       // 波特率分频系数,根据需求调整,影响波特率
  CAN_Init(CAN1, &CAN_InitStructure);

  // CAN 过滤器配置,接收所有ID
  CAN_FilterInitStructure.CAN_FilterNumber = 0; // 过滤器编号
  CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; // 屏蔽位模式
  CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; // 32 位
  CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000; // ID 高位
  CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000; // ID 低位
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000; // 屏蔽位高位
  CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000; // 屏蔽位低位
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0; // FIFO0
  CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; // 激活
  CAN_FilterInit(&CAN_FilterInitStructure);
}

实战避坑经验总结

  • 先排除软件问题,再检查硬件连接。 使用 CAN 分析仪自带的回环测试功能,验证 CAN 分析仪本身是否正常。
  • 供电是关键。 很多时候,看似配置正确,但由于供电问题导致通信失败。尽量使用稳定的外部电源供电。
  • 注意共地。 确保所有设备都连接到同一个地线上,避免共模干扰。
  • 善用示波器。 使用示波器观察 CAN_H 和 CAN_L 引脚的波形,可以快速定位问题。
  • 检查CAN分析仪的配置 有些CAN分析仪需要手动设置波特率等参数,确保和单片机配置一致。

总之,解决 STM32 CAN 通信问题需要耐心和细心。从软件到硬件,逐一排查,最终一定能找到问题所在。

STM32 CAN 通信疑难杂症:TJA1050 与 USB 供电的那些坑

转载请注明出处: 代码一只喵

本文的链接地址: http://m.acea1.store/blog/574647.SHTML

本文最后 发布于2026-04-22 06:15:27,已经过了5天没有更新,若内容或图片 失效,请留言反馈

()
您可能对以下文章感兴趣
评论
  • 真香警告 1 天前
    楼主写得太好了,我之前也遇到过类似的问题,一直没找到原因,看了你的文章才发现是 USB 扩展坞的供电不足导致的,感谢!