举报
针对ART PI FDCAN卡死在rt_device_write的问题,结合提供的can_sample代码片段,以下是可能的原因和解决方案:
设备未正确打开:
rt_device_open()打开设备,导致写操作阻塞。rt_device_t dev = rt_device_find(can_name);
if (rt_device_open(dev, RT_DEVICE_FLAG_INT_TX | RT_DEVICE_FLAG_INT_RX) != RT_EOK) {
rt_kprintf("Open device failed!n");
return;
}CAN设备配置错误:
struct rt_can_config cfg = {
.baud_rate = BAUD_RATE_500K, // 确认与实际波特率一致
.mode = RT_CAN_MODE_NORMAL // 或RT_CAN_MODE_LISTEN
};
rt_device_control(dev, RT_CAN_CMD_CONFIG, &cfg);发送缓冲池耗尽:
rt_device_write会阻塞等待。硬件或驱动问题:
drv_fdcan.c存在缺陷(如中断未正确处理)。总线状态异常:
// 完整初始化示例
rt_device_t dev = rt_device_find("fdcan1");
RT_ASSERT(dev != RT_NULL);
if (rt_device_open(dev, RT_DEVICE_FLAG_INT_TX | RT_DEVICE_FLAG_INT_RX) != RT_EOK) {
rt_kprintf("CAN device open failed!n");
return -1;
}
// 配置波特率(必须与物理总线一致)
struct rt_can_config cfg = {.baud_rate = 500000}; // 500kbps
rt_device_control(dev, RT_DEVICE_CTRL_CONFIG, &cfg); rt_uint32_t timeout = 100; // 超时时间(tick数)
size = rt_device_write(dev, 0, &msg, sizeof(msg), timeout);
if (size == 0) {
rt_kprintf("Send timeout!n");
} rt_uint32_t free_mbox;
rt_device_control(dev, RT_CAN_CMD_GET_STATUS, &free_mbox);
if (free_mbox == 0) {
rt_kprintf("No free TX mailbox!n");
return;
}drv_fdcan.c中:TX_EFLG寄存器标志。__HAL_RCC_FDCAN_CLK_ENABLE())。打印错误日志:
rt_err_t err = rt_device_write(dev, ...);
if (err != RT_EOK) {
rt_kprintf("Write error: %dn", err);
}启用调试宏:
rtconfig.h中打开CAN调试:#define RT_DEBUG_CAN简化测试:
cfg.mode = RT_CAN_MODE_LOOPBACK; // 数据自发自收通过逐步检查设备初始化、配置、发送流程及硬件状态,可定位问题根源。重点排查设备打开状态和驱动中断处理逻辑。
举报
更多回帖