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

[复制链接]
660|10
 楼主| cutfall 发表于 2025-4-9 09:00 | 显示全部楼层 |阅读模式
在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[8];
    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板回复数据
        }
    }
}


您需要登录后才可以回帖 登录 | 注册

本版积分规则

52

主题

53

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部