ESP32(ESP-IDF)TWAI发送正常但接收失效问题求助
ESP32(ESP-IDF)TWAI(CAN)通信接收功能故障
问题概述
ESP32基于ESP-IDF的TWAI(CAN)通信中,发送功能正常,但接收完全无法工作。此前看到有示例用旧版driver/can.h实现功能,但该头文件在ESP-IDF v5.0中已被移除,CAN功能已与TWAI合并。
环境信息
- ESP-IDF版本:v5.0、v4.4.4
- 操作系统:Windows
- 开发与烧录工具:VS Code IDE
- CAN收发器:已测试验证的MCP2515
代码实现
#include "driver/gpio.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "stdio.h" #include "stdlib.h" #include "driver/twai.h" void twai_setup_and_install(){ //Initialize configuration structures using macro initializers twai_general_config_t g_config = { .mode = TWAI_MODE_NORMAL, .tx_io = GPIO_NUM_5, .rx_io = GPIO_NUM_4, .clkout_io = TWAI_IO_UNUSED, .bus_off_io = TWAI_IO_UNUSED, .tx_queue_len = 5, .rx_queue_len = 5, .alerts_enabled = TWAI_ALERT_NONE, .clkout_divider = 0 }; twai_timing_config_t t_config = TWAI_TIMING_CONFIG_500KBITS(); twai_filter_config_t f_config = TWAI_FILTER_CONFIG_ACCEPT_ALL(); // Install TWAI driver if (twai_driver_install(&g_config, &t_config, &f_config) == ESP_OK) { printf("Driver installed\n"); } else { printf("Failed to install driver\n"); return; } // Start TWAI driver if (twai_start() == ESP_OK) { printf("Driver started\n"); } else { printf("Failed to start driver\n"); return; } } void new_message(twai_message_t *message, uint32_t id, uint8_t dlc, uint8_t *data) { message->flags = TWAI_MSG_FLAG_NONE; message->identifier = id; message->data_length_code = dlc; for (int i = 0; i < dlc; i++) { message->data[i] = data[i]; } printf("Message created\nID: %ld DLC: %d Data:\t", message->identifier, message->data_length_code); for (int i = 0; i < message->data_length_code; i++) { printf("%d\t", message->data[i]); } printf("\n"); } void transmit_message(twai_message_t *message) { if (twai_transmit(message, pdMS_TO_TICKS(1000)) == ESP_OK) { printf("Message queued for transmission\n"); } else { printf("Failed to send message\n"); } } void receive_message(twai_message_t *message) { if (twai_receive(message, pdMS_TO_TICKS(1000)) == ESP_OK) { printf("Message received:\n"); printf("ID: %ld DLC: %d Data:\t", message->identifier, message->data_length_code); for (int i = 0; i < message->data_length_code; i++) { (message->extd)?printf("Extended ID"):printf("Standard ID"); printf("%d\t", message->data[i]); } } else { printf("Failed to receive message\n"); } } void app_main() { twai_setup_and_install(); twai_message_t message; twai_message_t message1; // Set the data to send uint8_t data[8] = {rand() % 255, rand() % 255, rand() % 255, rand() % 255, rand() % 255, rand() % 255, rand() % 255, rand() % 255}; while(true){ // Create a new message new_message(&message, 0x123, 8, data); // Transmit the message to a queue transmit_message(&message); // Receive the message from the queue receive_message(&message1); // Wait for 1 second vTaskDelay(1000 / portTICK_PERIOD_MS); } }
已执行排查步骤
- 基于ESP-IDF v5.0与VS Code完成开发
- 参考官方文档编写TWAI收发代码
- 使用经过测试验证的MCP2515作为CAN收发器
- 确认发送功能正常,但接收功能完全失效
期望输出
Message received: ID: 0x123 DLC: 8 Data: 1 2 3 4 5 6 7 8 In my source code, I have implemented random data bits, so data may vary
实际输出
Failed to receive message
恳请各位提供解决帮助,万分感谢!
内容的提问来源于stack exchange,提问作者Kunaal Kiran Kumar
相关产品推荐
相关产品推荐

