mirror of
https://github.com/espressif/esp-idf.git
synced 2025-10-02 18:10:57 +02:00
fix(twai): busoff and clkout may not available in SOC
return ESP_ERR_NOT_SUPPORTED if these signals are required from user but not available in SOC
This commit is contained in:
@@ -127,8 +127,10 @@ static esp_err_t _node_config_io(twai_onchip_ctx_t *node, const twai_onchip_node
|
||||
{
|
||||
ESP_RETURN_ON_FALSE(GPIO_IS_VALID_OUTPUT_GPIO(node_config->io_cfg.tx) || (node_config->flags.enable_listen_only && (node_config->io_cfg.tx == -1)), ESP_ERR_INVALID_ARG, TAG, "Invalid tx gpio num");
|
||||
ESP_RETURN_ON_FALSE(GPIO_IS_VALID_GPIO(node_config->io_cfg.rx), ESP_ERR_INVALID_ARG, TAG, "Invalid rx gpio num");
|
||||
uint64_t reserve_mask = 0;
|
||||
ESP_RETURN_ON_FALSE(!(GPIO_IS_VALID_OUTPUT_GPIO(node_config->io_cfg.quanta_clk_out) && (twai_periph_signals[node->ctrlr_id].clk_out_sig < 0)), ESP_ERR_NOT_SUPPORTED, TAG, "quanta_clk_out is not supported");
|
||||
ESP_RETURN_ON_FALSE(!(GPIO_IS_VALID_OUTPUT_GPIO(node_config->io_cfg.bus_off_indicator) && (twai_periph_signals[node->ctrlr_id].bus_off_sig < 0)), ESP_ERR_NOT_SUPPORTED, TAG, "bus_off_indicator is not supported");
|
||||
|
||||
uint64_t reserve_mask = 0;
|
||||
// Set RX pin
|
||||
gpio_set_pull_mode(node_config->io_cfg.rx, GPIO_PULLUP_ONLY); // pullup to avoid noise if no connection to transceiver
|
||||
gpio_matrix_input(node_config->io_cfg.rx, twai_periph_signals[node->ctrlr_id].rx_sig, false);
|
||||
|
@@ -48,6 +48,8 @@ TEST_CASE("twai install uninstall (loopback)", "[twai]")
|
||||
twai_onchip_node_config_t node_config = {};
|
||||
node_config.io_cfg.tx = TEST_TX_GPIO;
|
||||
node_config.io_cfg.rx = TEST_TX_GPIO; // Using same pin for test without transceiver
|
||||
node_config.io_cfg.quanta_clk_out = GPIO_NUM_NC;
|
||||
node_config.io_cfg.bus_off_indicator = GPIO_NUM_NC;
|
||||
node_config.bit_timing.bitrate = 1000000;
|
||||
node_config.tx_queue_depth = TEST_TWAI_QUEUE_DEPTH;
|
||||
node_config.flags.enable_self_test = true;
|
||||
@@ -111,6 +113,8 @@ static void test_twai_baudrate_correctness(twai_clock_source_t clk_src, uint32_t
|
||||
twai_onchip_node_config_t node_config = {};
|
||||
node_config.io_cfg.tx = TEST_TX_GPIO;
|
||||
node_config.io_cfg.rx = TEST_TX_GPIO;
|
||||
node_config.io_cfg.quanta_clk_out = GPIO_NUM_NC;
|
||||
node_config.io_cfg.bus_off_indicator = GPIO_NUM_NC;
|
||||
node_config.clk_src = clk_src;
|
||||
node_config.bit_timing.bitrate = test_bitrate;
|
||||
node_config.tx_queue_depth = 1;
|
||||
@@ -183,6 +187,8 @@ TEST_CASE("twai transmit stop resume (loopback)", "[twai]")
|
||||
twai_onchip_node_config_t node_config = {};
|
||||
node_config.io_cfg.tx = TEST_TX_GPIO;
|
||||
node_config.io_cfg.rx = TEST_TX_GPIO; // Using same pin for test without transceiver
|
||||
node_config.io_cfg.quanta_clk_out = GPIO_NUM_NC;
|
||||
node_config.io_cfg.bus_off_indicator = GPIO_NUM_NC;
|
||||
node_config.bit_timing.bitrate = 200000;
|
||||
node_config.tx_queue_depth = TEST_TWAI_QUEUE_DEPTH;
|
||||
node_config.flags.enable_self_test = true;
|
||||
@@ -280,6 +286,8 @@ TEST_CASE("twai mask filter (loopback)", "[twai]")
|
||||
twai_onchip_node_config_t node_config = {};
|
||||
node_config.io_cfg.tx = TEST_TX_GPIO;
|
||||
node_config.io_cfg.rx = TEST_TX_GPIO; // Using same pin for test without transceiver
|
||||
node_config.io_cfg.quanta_clk_out = GPIO_NUM_NC;
|
||||
node_config.io_cfg.bus_off_indicator = GPIO_NUM_NC;
|
||||
node_config.bit_timing.bitrate = 1000000;
|
||||
node_config.tx_queue_depth = TEST_TWAI_QUEUE_DEPTH;
|
||||
node_config.flags.enable_self_test = true;
|
||||
@@ -363,6 +371,8 @@ TEST_CASE("twai dual 16bit mask filter (loopback)", "[twai]")
|
||||
twai_onchip_node_config_t node_config = {};
|
||||
node_config.io_cfg.tx = TEST_TX_GPIO;
|
||||
node_config.io_cfg.rx = TEST_TX_GPIO; // Using same pin for test without transceiver
|
||||
node_config.io_cfg.quanta_clk_out = GPIO_NUM_NC;
|
||||
node_config.io_cfg.bus_off_indicator = GPIO_NUM_NC;
|
||||
node_config.bit_timing.bitrate = 1000000;
|
||||
node_config.tx_queue_depth = TEST_TWAI_QUEUE_DEPTH;
|
||||
node_config.flags.enable_self_test = true;
|
||||
@@ -436,6 +446,8 @@ TEST_CASE("twai driver cache safe (loopback)", "[twai]")
|
||||
twai_onchip_node_config_t node_config = {};
|
||||
node_config.io_cfg.tx = TEST_TX_GPIO;
|
||||
node_config.io_cfg.rx = TEST_TX_GPIO; // Using same pin for test without transceiver
|
||||
node_config.io_cfg.quanta_clk_out = GPIO_NUM_NC;
|
||||
node_config.io_cfg.bus_off_indicator = GPIO_NUM_NC;
|
||||
node_config.bit_timing.bitrate = 50000; //slow bitrate to ensure cache disabled before tx_queue finish
|
||||
node_config.tx_queue_depth = TEST_FRAME_NUM;
|
||||
node_config.flags.enable_loopback = true;
|
||||
@@ -487,6 +499,8 @@ TEST_CASE("twai bus off recovery (loopback)", "[twai]")
|
||||
twai_onchip_node_config_t node_config = {};
|
||||
node_config.io_cfg.tx = TEST_TX_GPIO;
|
||||
node_config.io_cfg.rx = TEST_TX_GPIO; // Using same pin for test without transceiver
|
||||
node_config.io_cfg.quanta_clk_out = GPIO_NUM_NC;
|
||||
node_config.io_cfg.bus_off_indicator = GPIO_NUM_NC;
|
||||
node_config.bit_timing.bitrate = 50000; //slow bitrate to ensure soft error trigger
|
||||
node_config.tx_queue_depth = 1;
|
||||
node_config.flags.enable_self_test = true;
|
||||
@@ -558,6 +572,8 @@ TEST_CASE("twai tx_wait_all_done thread safe", "[twai]")
|
||||
twai_onchip_node_config_t node_config = {};
|
||||
node_config.io_cfg.tx = TEST_TX_GPIO;
|
||||
node_config.io_cfg.rx = TEST_TX_GPIO; //Using same pin for test without transceiver
|
||||
node_config.io_cfg.quanta_clk_out = GPIO_NUM_NC;
|
||||
node_config.io_cfg.bus_off_indicator = GPIO_NUM_NC;
|
||||
node_config.bit_timing.bitrate = 100000; //slow bitrate to ensure transmite finish during wait_all_done
|
||||
node_config.tx_queue_depth = TEST_FRAME_NUM;
|
||||
node_config.flags.enable_self_test = true;
|
||||
|
@@ -66,6 +66,8 @@ TEST_CASE("twai range filter (loopback)", "[twai]")
|
||||
twai_onchip_node_config_t node_config = {};
|
||||
node_config.io_cfg.tx = TEST_TX_GPIO;
|
||||
node_config.io_cfg.rx = TEST_TX_GPIO; // Using same pin for test without transceiver
|
||||
node_config.io_cfg.quanta_clk_out = GPIO_NUM_NC;
|
||||
node_config.io_cfg.bus_off_indicator = GPIO_NUM_NC;
|
||||
node_config.bit_timing.bitrate = 1000000;
|
||||
node_config.tx_queue_depth = TEST_TWAI_QUEUE_DEPTH;
|
||||
node_config.flags.enable_self_test = true;
|
||||
@@ -139,6 +141,8 @@ TEST_CASE("twai fd transmit time (loopback)", "[twai]")
|
||||
twai_onchip_node_config_t node_config = {};
|
||||
node_config.io_cfg.tx = TEST_TX_GPIO;
|
||||
node_config.io_cfg.rx = TEST_TX_GPIO; // Using same pin for test without transceiver
|
||||
node_config.io_cfg.quanta_clk_out = GPIO_NUM_NC;
|
||||
node_config.io_cfg.bus_off_indicator = GPIO_NUM_NC;
|
||||
node_config.bit_timing.bitrate = 1000000;
|
||||
node_config.data_timing.bitrate = 4000000;
|
||||
node_config.data_timing.ssp_permill = 700; // ssp 70.0%
|
||||
|
@@ -31,6 +31,8 @@ TEST_CASE("twai_listen_only", "[twai_net]")
|
||||
twai_onchip_node_config_t node_config = {};
|
||||
node_config.io_cfg.tx = TEST_TX_GPIO;
|
||||
node_config.io_cfg.rx = TEST_RX_GPIO;
|
||||
node_config.io_cfg.quanta_clk_out = GPIO_NUM_NC;
|
||||
node_config.io_cfg.bus_off_indicator = GPIO_NUM_NC;
|
||||
node_config.bit_timing.bitrate = 250000;
|
||||
node_config.tx_queue_depth = 3;
|
||||
node_config.flags.enable_listen_only = true;
|
||||
@@ -71,6 +73,8 @@ TEST_CASE("twai_remote_request", "[twai_net]")
|
||||
twai_onchip_node_config_t node_config = {};
|
||||
node_config.io_cfg.tx = TEST_TX_GPIO;
|
||||
node_config.io_cfg.rx = TEST_RX_GPIO;
|
||||
node_config.io_cfg.quanta_clk_out = GPIO_NUM_NC;
|
||||
node_config.io_cfg.bus_off_indicator = GPIO_NUM_NC;
|
||||
node_config.bit_timing.bitrate = 250000;
|
||||
node_config.tx_queue_depth = 3;
|
||||
node_config.fail_retry_cnt = -1; // retry forever if send remote frame failed
|
||||
|
@@ -7,16 +7,16 @@
|
||||
#include "soc/twai_periph.h"
|
||||
#include "soc/gpio_sig_map.h"
|
||||
|
||||
const twai_signal_conn_t twai_periph_signals[SOC_TWAI_CONTROLLER_NUM] = {
|
||||
const twai_signal_conn_t twai_periph_signals[2] = {
|
||||
[0] = {
|
||||
.module_name = "TWAI0",
|
||||
.irq_id = ETS_TWAI0_INTR_SOURCE,
|
||||
.timer_irq_id = ETS_TWAI0_TIMER_INTR_SOURCE,
|
||||
.tx_sig = TWAI0_TX_IDX,
|
||||
.rx_sig = TWAI0_RX_IDX,
|
||||
.bus_off_sig = TWAI0_BUS_OFF_ON_IDX,
|
||||
.clk_out_sig = TWAI0_CLKOUT_IDX,
|
||||
.stand_by_sig = TWAI0_STANDBY_IDX,
|
||||
.bus_off_sig = -1,
|
||||
.clk_out_sig = -1,
|
||||
.stand_by_sig = -1,
|
||||
},
|
||||
[1] = {
|
||||
.module_name = "TWAI1",
|
||||
@@ -24,8 +24,8 @@ const twai_signal_conn_t twai_periph_signals[SOC_TWAI_CONTROLLER_NUM] = {
|
||||
.timer_irq_id = ETS_TWAI1_TIMER_INTR_SOURCE,
|
||||
.tx_sig = TWAI1_TX_IDX,
|
||||
.rx_sig = TWAI1_RX_IDX,
|
||||
.bus_off_sig = TWAI1_BUS_OFF_ON_IDX,
|
||||
.clk_out_sig = TWAI1_CLKOUT_IDX,
|
||||
.stand_by_sig = TWAI1_STANDBY_IDX,
|
||||
.bus_off_sig = -1,
|
||||
.clk_out_sig = -1,
|
||||
.stand_by_sig = -1,
|
||||
},
|
||||
};
|
||||
|
@@ -49,8 +49,12 @@ void app_main(void)
|
||||
{
|
||||
twai_node_handle_t node_hdl;
|
||||
twai_onchip_node_config_t node_config = {
|
||||
.io_cfg.tx = TX_GPIO_NUM,
|
||||
.io_cfg.rx = RX_GPIO_NUM,
|
||||
.io_cfg = {
|
||||
.tx = TX_GPIO_NUM,
|
||||
.rx = RX_GPIO_NUM,
|
||||
.quanta_clk_out = GPIO_NUM_NC,
|
||||
.bus_off_indicator = GPIO_NUM_NC,
|
||||
},
|
||||
.bit_timing.bitrate = TWAI_BITRATE,
|
||||
.tx_queue_depth = 1,
|
||||
.flags.enable_self_test = true,
|
||||
|
@@ -94,8 +94,8 @@ void app_main(void)
|
||||
.io_cfg = {
|
||||
.tx = TWAI_LISTENER_TX_GPIO,
|
||||
.rx = TWAI_LISTENER_RX_GPIO,
|
||||
.quanta_clk_out = -1,
|
||||
.bus_off_indicator = -1,
|
||||
.quanta_clk_out = GPIO_NUM_NC,
|
||||
.bus_off_indicator = GPIO_NUM_NC,
|
||||
},
|
||||
.bit_timing.bitrate = TWAI_BITRATE,
|
||||
.flags.enable_listen_only = true,
|
||||
|
@@ -57,8 +57,8 @@ void app_main(void)
|
||||
.io_cfg = {
|
||||
.tx = TWAI_SENDER_TX_GPIO,
|
||||
.rx = TWAI_SENDER_RX_GPIO,
|
||||
.quanta_clk_out = -1,
|
||||
.bus_off_indicator = -1,
|
||||
.quanta_clk_out = GPIO_NUM_NC,
|
||||
.bus_off_indicator = GPIO_NUM_NC,
|
||||
},
|
||||
.bit_timing = {
|
||||
.bitrate = TWAI_BITRATE,
|
||||
|
Reference in New Issue
Block a user