cutfall 发表于 2025-4-9 09:00

使用两个 stm32f042 通过 CAN 设置双向通信

在STM32CubeIDE中用 HAL 库在两个板之间建立通信。找了很多示例代码,但都使用了与当前版本的 HAL 不兼容的旧库或自定义库。是否有易于使用的的教程或例程实现以下功能。每个板上都有一个按钮,按下按钮后能够互相发送 CAN 消息。

xiaoqizi 发表于 2025-6-8 08:52

将两个开发板的CAN_TX和CAN_RX分别连接,形成总线拓扑

木木guainv 发表于 2025-6-8 11:04

在总线两端各接一个120Ω电阻,用于阻抗匹配

Jiangxiaopi 发表于 2025-6-8 13:28

确保两个开发板共地,避免电压差导致通信异常

荣陶陶 发表于 2025-6-8 15:58

// 初始化CAN句柄
CAN_HandleTypeDef hcan;

void MX_CAN_Init(void) {
    hcan.Instance = CANx; // 替换为CAN1或CAN2
    hcan.Init.Prescaler = 3; // 分频系数,决定波特率
    hcan.Init.Mode = CAN_MODE_NORMAL; // 正常模式
    hcan.Init.SyncJumpWidth = CAN_SJW_1TQ; // 重同步跳跃宽度
    hcan.Init.TimeSeg1 = CAN_BS1_6TQ; // 时间段1
    hcan.Init.TimeSeg2 = CAN_BS2_7TQ; // 时间段2
    hcan.Init.TimeTriggeredMode = DISABLE; // 关闭时间触发模式
    hcan.Init.AutoBusOff = ENABLE; // 自动恢复离线状态
    hcan.Init.AutoWakeUp = ENABLE; // 自动唤醒
    hcan.Init.AutoRetransmission = ENABLE; // 自动重传
    if (HAL_CAN_Init(&hcan) != HAL_OK) {
      // 初始化错误处理
    }
}


Zhiniaocun 发表于 2025-6-8 18:36

CAN过滤器用于接收指定ID的报文。

Zuocidian 发表于 2025-6-8 20:59

若使用中断,确保CAN中断优先级高于其他任务

Puchou 发表于 2025-6-9 08:44

用示波器或逻辑分析仪观察CAN总线波形,验证信号完整性

Xiashiqi 发表于 2025-6-9 11:06

CAN总线是半双工通信,同一时间只能单向传输

小海师 发表于 2025-6-9 13:16

添加超时机制,避免因总线故障导致程序卡死

Haizangwang 发表于 2025-6-9 15:31

int main(void) {
    HAL_Init(); // 初始化HAL库
    MX_CAN_Init(); // 初始化CAN
    CAN_FilterConfig(); // 配置过滤器

    uint8_t sendData[] = {0x01, 0x02, 0x03};
    uint8_t receiveData;
    uint8_t receiveSize;

    while (1) {
      // A板发送数据,B板接收后回复
      CAN_SendData(sendData, sizeof(sendData));
      HAL_Delay(100); // 等待发送完成

      // B板接收数据并发送回复
      CAN_ReceiveData(receiveData, &receiveSize);
      if (receiveSize > 0) {
            // 处理接收数据(例如LED指示)
            uint8_t replyData[] = {0x04, 0x05, 0x06};
            CAN_SendData(replyData, sizeof(replyData));
      }

      // A板接收B板的回复
      CAN_ReceiveData(receiveData, &receiveSize);
      if (receiveSize > 0) {
            // 处理B板回复数据
      }
    }
}


页: [1]
查看完整版本: 使用两个 stm32f042 通过 CAN 设置双向通信