esp32s3 twai接口接收数据不回调问题,帮忙看下,谢谢

raffeale
Posts: 1
Joined: Fri Dec 12, 2025 1:44 pm

esp32s3 twai接口接收数据不回调问题,帮忙看下,谢谢

Postby raffeale » Fri Dec 12, 2025 1:51 pm

你好,我使用esp32s3 的twai接口测试can数据的收发 ,我将twai的rx和tx互相连接,这样发送后出去的就剋月自己接收。
但是on_rx_done回调永远都不会被调用。很奇怪。 我使用示波器观察tx的gpio是有波形输出的,但是rx就是没有接收。
但是如果断开,tx<->rx 的线,就会提示
“ esp_twai: _node_queue_tx(594): node is bus off
ESP_ERROR_CHECK failed: esp_err_t 0x103 (ESP_ERR_INVALID_STATE) at 0x42001e72
file: "/Users/raffeale/Documents/Arduino/esp32_can_raw_test/esp32_can_raw_test.ino" line 92
func: void loop()
expression: twai_node_transmit(node_hdl, &frame, 0)

abort() was called at PC 0x4037a233 on core 1"
我使用的arduino开发环境 ,开发板位esp32s3 module dev, 开发板的sdk版本为3.3.4,从官方下载的。
代码如下

Code: Select all


#include "esp_twai.h"
#include "esp_twai_onchip.h"

twai_node_handle_t node_hdl = NULL;

volatile int recv_ok = 0;

 uint8_t recv_buff[80];
bool twai_rx_cb(twai_node_handle_t handle, const twai_rx_done_event_data_t *edata, void *user_ctx)
{
    
    twai_frame_t rx_frame = {
        .buffer = recv_buff,
        .buffer_len = sizeof(recv_buff),
    };
    if (ESP_OK == twai_node_receive_from_isr(handle, &rx_frame)) {
        // receive ok, do something here
        Serial.println("recv one frame!");
        recv_ok = 1;
        return true;
    }else {
       Serial.println("recv failed!");
       recv_ok = -1;
      return false;
    }
    
}

bool twai_err_cb(twai_node_handle_t handle, const twai_error_event_data_t *edata, void *user_ctx) {
  return true;
}

void setup() {
  // put your setup code here, to run once:
 Serial.begin(115200);

  Serial.println("Initializing ...");
  
twai_onchip_node_config_t cfg = {
.io_cfg = {.tx = GPIO_NUM_4,
            .rx = GPIO_NUM_17,
},

.bit_timing = {.bitrate = 200000,},
.tx_queue_depth = 100,
.flags =  {.enable_self_test = 1},
};
ESP_ERROR_CHECK(twai_new_node_onchip(&cfg, &node_hdl));

twai_event_callbacks_t user_cbs = {
    .on_rx_done = twai_rx_cb,
    .on_error = twai_err_cb,
};
ESP_ERROR_CHECK(twai_node_register_event_callbacks(node_hdl, &user_cbs, NULL));

ESP_ERROR_CHECK(twai_node_enable(node_hdl));




}

static uint8_t data[8] = {0x01,0x02,0x03};

void loop() {
  // put your main code here, to run repeatedly:

switch (recv_ok) {
  case -1:
    Serial.println("recv failed!");
    recv_ok = 0;
    break;
  case 1:
    Serial.println("recv success!");
    recv_ok = 0;
    break;

  case 0:
   Serial.println("recv not run!");
   break;
}


twai_frame_t frame = {
.header={.id = 0x100,
         .ide = false,
        },

.buffer = data,
.buffer_len = sizeof(data)
};
ESP_ERROR_CHECK(twai_node_transmit(node_hdl, &frame, 0));




}



最开始我也怀疑是gpio的问题,但是更换其他的gpio接口也是一样的,不知道问题出在哪里

Who is online

Users browsing this forum: No registered users and 3 guests