使用两个 stm32f042 通过 CAN 设置双向通信
在STM32CubeIDE中用 HAL 库在两个板之间建立通信。找了很多示例代码,但都使用了与当前版本的 HAL 不兼容的旧库或自定义库。是否有易于使用的的教程或例程实现以下功能。每个板上都有一个按钮,按下按钮后能够互相发送 CAN 消息。将两个开发板的CAN_TX和CAN_RX分别连接,形成总线拓扑
在总线两端各接一个120Ω电阻,用于阻抗匹配
确保两个开发板共地,避免电压差导致通信异常
// 初始化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) {
// 初始化错误处理
}
}
CAN过滤器用于接收指定ID的报文。
若使用中断,确保CAN中断优先级高于其他任务
用示波器或逻辑分析仪观察CAN总线波形,验证信号完整性
CAN总线是半双工通信,同一时间只能单向传输
添加超时机制,避免因总线故障导致程序卡死
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]