但是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接口也是一样的,不知道问题出在哪里