From 6440f9d5d71bd1392900c2c0c78e47dff5b46496 Mon Sep 17 00:00:00 2001 From: wanckl Date: Wed, 2 Jul 2025 20:13:01 +0800 Subject: [PATCH] feat(driver_twai): remove self test example since it's meanless --- examples/peripherals/.build-test-rules.yml | 9 -- .../twai/twai_self_test/CMakeLists.txt | 8 - .../peripherals/twai/twai_self_test/README.md | 86 ---------- .../twai/twai_self_test/main/CMakeLists.txt | 3 - .../twai_self_test/main/Kconfig.projbuild | 23 --- .../main/twai_self_test_example_main.c | 151 ------------------ .../pytest_twai_self_test_example.py | 12 -- 7 files changed, 292 deletions(-) delete mode 100644 examples/peripherals/twai/twai_self_test/CMakeLists.txt delete mode 100644 examples/peripherals/twai/twai_self_test/README.md delete mode 100644 examples/peripherals/twai/twai_self_test/main/CMakeLists.txt delete mode 100644 examples/peripherals/twai/twai_self_test/main/Kconfig.projbuild delete mode 100644 examples/peripherals/twai/twai_self_test/main/twai_self_test_example_main.c delete mode 100644 examples/peripherals/twai/twai_self_test/pytest_twai_self_test_example.py diff --git a/examples/peripherals/.build-test-rules.yml b/examples/peripherals/.build-test-rules.yml index 9f401658b1..d389b826d2 100644 --- a/examples/peripherals/.build-test-rules.yml +++ b/examples/peripherals/.build-test-rules.yml @@ -521,15 +521,6 @@ examples/peripherals/twai/twai_network: temporary: true reason: Test is flakey, TODO IDF-2939 -examples/peripherals/twai/twai_self_test: - disable: - - if: SOC_TWAI_SUPPORTED != 1 or SOC_TWAI_SUPPORT_FD == 1 - reason: This example not support FD - disable_test: - - if: IDF_TARGET not in ["esp32"] - temporary: true - reason: lack of runners - examples/peripherals/twai/twai_utils: disable: - if: SOC_TWAI_SUPPORTED != 1 diff --git a/examples/peripherals/twai/twai_self_test/CMakeLists.txt b/examples/peripherals/twai/twai_self_test/CMakeLists.txt deleted file mode 100644 index 1eb3683c9c..0000000000 --- a/examples/peripherals/twai/twai_self_test/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ -# The following lines of boilerplate have to be in your project's CMakeLists -# in this exact order for cmake to work correctly -cmake_minimum_required(VERSION 3.16) - -include($ENV{IDF_PATH}/tools/cmake/project.cmake) -# "Trim" the build. Include the minimal set of components, main, and anything it depends on. -idf_build_set_property(MINIMAL_BUILD ON) -project(twai_self_test_example) diff --git a/examples/peripherals/twai/twai_self_test/README.md b/examples/peripherals/twai/twai_self_test/README.md deleted file mode 100644 index f321f6aea1..0000000000 --- a/examples/peripherals/twai/twai_self_test/README.md +++ /dev/null @@ -1,86 +0,0 @@ -| Supported Targets | ESP32 | ESP32-C3 | ESP32-C6 | ESP32-H2 | ESP32-H21 | ESP32-P4 | ESP32-S2 | ESP32-S3 | -| ----------------- | ----- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | - -# TWAI Self Test Example - -(See the README.md file in the upper level 'examples' directory for more information about examples.) - -The TWAI Self Test Example demonstrates how a node can transmit TWAI messages to itself using the TWAI driver's "No Acknowledgement" mode and Self Reception Requests. The Self Test Example can be run as a simple test to determine whether a target (ESP32, ESP32-S2, ESP32-S3 or ESP32-C3) is properly connected to a working external transceiver. - -## How to use example - -### Hardware Required - -This example requires only a single target (e.g., an ESP32 or ESP32-S2). The target must be connected to an external transceiver (e.g., a SN65HVD23X transceiver). This connection usually consists of a TX and an RX signal. - -Note: If you don't have an external transceiver, this example can still be run by simply connecting the TX GPIO and RX GPIO with a jumper. - -### Configure the project - -* Set the target of the build (where `{IDF_TARGET}` stands for the target chip such as `esp32` or `esp32s2`). -* Then run `menuconfig` to configure the example. - -```sh -idf.py set-target {IDF_TARGET} -idf.py menuconfig -``` - -* Under `Example Configuration`, configure the pin assignments using the options `TX GPIO Number` and `RX GPIO Number` according to how the target was connected to the transceiver. By default, `TX GPIO Number` and `RX GPIO Number` are set to the following values: - * On the ESP32, `TX GPIO Number` and `RX GPIO Number` default to `21` and `22` respectively - * On other chips, `TX GPIO Number` and `RX GPIO Number` default to `0` and `2` respectively - -### Build and Flash - -Build the project and flash it to the board, then run monitor tool to view serial output: - -```sh -idf.py -p PORT flash monitor -``` - -(Replace PORT with the name of the serial port to use.) - -(To exit the serial monitor, type ``Ctrl-]``.) - -See the Getting Started Guide for full steps to configure and use ESP-IDF to build projects. - -## Example Output - -```text -I (345) TWAI Self Test: Driver installed -I (345) TWAI Self Test: Driver started -I (355) TWAI Self Test: Msg received - Data = 0 -... -I (1335) TWAI Self Test: Msg received - Data = 99 -I (1335) TWAI Self Test: Driver stopped -I (1435) TWAI Self Test: Driver started -I (1435) TWAI Self Test: Msg received - Data = 0 -... -I (2425) TWAI Self Test: Msg received - Data = 99 -I (2425) TWAI Self Test: Driver stopped -I (2525) TWAI Self Test: Driver started -I (2525) TWAI Self Test: Msg received - Data = 0 -... -I (3515) TWAI Self Test: Msg received - Data = 99 -I (3515) TWAI Self Test: Driver stopped -I (3615) TWAI Self Test: Driver uninstalled -``` - -## Troubleshooting - -```text -I (345) TWAI Self Test: Driver installed -I (345) TWAI Self Test: Driver started -``` - -If the TWAI driver is installed and started but no messages are received, check that the target is correctly connected to the external transceiver, and that the external transceiver is operating properly (i.e., properly powered and not in sleep mode). - -## Example Breakdown - -The TWAI Self Test Example will do multiple iterations of the following steps: - -1. Install the TWAI driver -2. Start the TWAI driver -3. Simultaneously transmit and receive multiple messages using the self reception request. -4. Stop the TWAI driver -5. Repeat steps 2 to 4 for multiple iterations -6. Uninstall the TWAI driver diff --git a/examples/peripherals/twai/twai_self_test/main/CMakeLists.txt b/examples/peripherals/twai/twai_self_test/main/CMakeLists.txt deleted file mode 100644 index a1d798b3b4..0000000000 --- a/examples/peripherals/twai/twai_self_test/main/CMakeLists.txt +++ /dev/null @@ -1,3 +0,0 @@ -idf_component_register(SRCS "twai_self_test_example_main.c" - REQUIRES driver - INCLUDE_DIRS ".") diff --git a/examples/peripherals/twai/twai_self_test/main/Kconfig.projbuild b/examples/peripherals/twai/twai_self_test/main/Kconfig.projbuild deleted file mode 100644 index 1688672cec..0000000000 --- a/examples/peripherals/twai/twai_self_test/main/Kconfig.projbuild +++ /dev/null @@ -1,23 +0,0 @@ -menu "Example Configuration" - - orsource "$IDF_PATH/examples/common_components/env_caps/$IDF_TARGET/Kconfig.env_caps" - - config EXAMPLE_TX_GPIO_NUM - int "TX GPIO number" - range ENV_GPIO_RANGE_MIN ENV_GPIO_OUT_RANGE_MAX - default 21 if IDF_TARGET_ESP32 - default 0 - help - This option selects the GPIO pin used for the TX signal. Connect the - TX signal to your transceiver. - - config EXAMPLE_RX_GPIO_NUM - int "RX GPIO number" - range ENV_GPIO_RANGE_MIN ENV_GPIO_IN_RANGE_MAX - default 22 if IDF_TARGET_ESP32 - default 2 - help - This option selects the GPIO pin used for the RX signal. Connect the - RX signal to your transceiver. - -endmenu diff --git a/examples/peripherals/twai/twai_self_test/main/twai_self_test_example_main.c b/examples/peripherals/twai/twai_self_test/main/twai_self_test_example_main.c deleted file mode 100644 index 7cf7c6975e..0000000000 --- a/examples/peripherals/twai/twai_self_test/main/twai_self_test_example_main.c +++ /dev/null @@ -1,151 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2010-2024 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: CC0-1.0 - */ - -/* - * The following example demonstrates the self testing capabilities of the TWAI - * peripheral by utilizing the No Acknowledgment Mode and Self Reception Request - * capabilities. This example can be used to verify that the TWAI peripheral and - * its connections to the external transceiver operates without issue. The example - * will execute multiple iterations, each iteration will do the following: - * 1) Start the TWAI driver - * 2) Transmit and receive 100 messages using self reception request - * 3) Stop the TWAI driver - */ - -#include -#include -#include "freertos/FreeRTOS.h" -#include "freertos/task.h" -#include "freertos/semphr.h" -#include "esp_err.h" -#include "esp_log.h" -#include "driver/twai.h" - -/* --------------------- Definitions and static variables ------------------ */ - -//Example Configurations -#define NO_OF_MSGS 100 -#define NO_OF_ITERS 3 -#define TX_GPIO_NUM CONFIG_EXAMPLE_TX_GPIO_NUM -#define RX_GPIO_NUM CONFIG_EXAMPLE_RX_GPIO_NUM -#define TX_TASK_PRIO 8 //Sending task priority -#define RX_TASK_PRIO 9 //Receiving task priority -#define CTRL_TSK_PRIO 10 //Control task priority -#define MSG_ID 0x555 //11 bit standard format ID -#define EXAMPLE_TAG "TWAI Self Test" - -static const twai_timing_config_t t_config = TWAI_TIMING_CONFIG_25KBITS(); -//Filter all other IDs except MSG_ID -static const twai_filter_config_t f_config = {.acceptance_code = (MSG_ID << 21), - .acceptance_mask = ~(TWAI_STD_ID_MASK << 21), - .single_filter = true - }; -//Set to NO_ACK mode due to self testing with single module -static const twai_general_config_t g_config = TWAI_GENERAL_CONFIG_DEFAULT(TX_GPIO_NUM, RX_GPIO_NUM, TWAI_MODE_NO_ACK); - -static SemaphoreHandle_t tx_sem; -static SemaphoreHandle_t rx_sem; -static SemaphoreHandle_t ctrl_sem; -static SemaphoreHandle_t done_sem; - -/* --------------------------- Tasks and Functions -------------------------- */ - -static void twai_transmit_task(void *arg) -{ - twai_message_t tx_msg = { - // Message type and format settings - .extd = 0, // Standard Format message (11-bit ID) - .rtr = 0, // Send a data frame - .ss = 0, // Not single shot - .self = 1, // Message is a self reception request (loopback) - .dlc_non_comp = 0, // DLC is less than 8 - // Message ID and payload - .identifier = MSG_ID, - .data_length_code = 1, - .data = {0}, - }; - - for (int iter = 0; iter < NO_OF_ITERS; iter++) { - xSemaphoreTake(tx_sem, portMAX_DELAY); - for (int i = 0; i < NO_OF_MSGS; i++) { - //Transmit messages using self reception request - tx_msg.data[0] = i; - ESP_ERROR_CHECK(twai_transmit(&tx_msg, portMAX_DELAY)); - vTaskDelay(pdMS_TO_TICKS(10)); - } - } - vTaskDelete(NULL); -} - -static void twai_receive_task(void *arg) -{ - twai_message_t rx_message; - - for (int iter = 0; iter < NO_OF_ITERS; iter++) { - xSemaphoreTake(rx_sem, portMAX_DELAY); - for (int i = 0; i < NO_OF_MSGS; i++) { - //Receive message and print message data - ESP_ERROR_CHECK(twai_receive(&rx_message, portMAX_DELAY)); - ESP_LOGI(EXAMPLE_TAG, "Msg received\tID 0x%lx\tData = %d", rx_message.identifier, rx_message.data[0]); - } - //Indicate to control task all messages received for this iteration - xSemaphoreGive(ctrl_sem); - } - vTaskDelete(NULL); -} - -static void twai_control_task(void *arg) -{ - xSemaphoreTake(ctrl_sem, portMAX_DELAY); - for (int iter = 0; iter < NO_OF_ITERS; iter++) { - //Start TWAI Driver for this iteration - ESP_ERROR_CHECK(twai_start()); - ESP_LOGI(EXAMPLE_TAG, "Driver started"); - - //Trigger TX and RX tasks to start transmitting/receiving - xSemaphoreGive(rx_sem); - xSemaphoreGive(tx_sem); - xSemaphoreTake(ctrl_sem, portMAX_DELAY); //Wait for TX and RX tasks to finish iteration - - ESP_ERROR_CHECK(twai_stop()); //Stop the TWAI Driver - ESP_LOGI(EXAMPLE_TAG, "Driver stopped"); - vTaskDelay(pdMS_TO_TICKS(100)); //Delay then start next iteration - } - xSemaphoreGive(done_sem); - vTaskDelete(NULL); -} - -void app_main(void) -{ - //Create tasks and synchronization primitives - tx_sem = xSemaphoreCreateBinary(); - rx_sem = xSemaphoreCreateBinary(); - ctrl_sem = xSemaphoreCreateBinary(); - done_sem = xSemaphoreCreateBinary(); - - xTaskCreatePinnedToCore(twai_control_task, "TWAI_ctrl", 4096, NULL, CTRL_TSK_PRIO, NULL, tskNO_AFFINITY); - xTaskCreatePinnedToCore(twai_receive_task, "TWAI_rx", 4096, NULL, RX_TASK_PRIO, NULL, tskNO_AFFINITY); - xTaskCreatePinnedToCore(twai_transmit_task, "TWAI_tx", 4096, NULL, TX_TASK_PRIO, NULL, tskNO_AFFINITY); - - //Install TWAI driver - ESP_ERROR_CHECK(twai_driver_install(&g_config, &t_config, &f_config)); - ESP_LOGI(EXAMPLE_TAG, "Driver installed"); - - //Start control task - xSemaphoreGive(ctrl_sem); - //Wait for all iterations and tasks to complete running - xSemaphoreTake(done_sem, portMAX_DELAY); - - //Uninstall TWAI driver - ESP_ERROR_CHECK(twai_driver_uninstall()); - ESP_LOGI(EXAMPLE_TAG, "Driver uninstalled"); - - //Cleanup - vSemaphoreDelete(tx_sem); - vSemaphoreDelete(rx_sem); - vSemaphoreDelete(ctrl_sem); - vQueueDelete(done_sem); -} diff --git a/examples/peripherals/twai/twai_self_test/pytest_twai_self_test_example.py b/examples/peripherals/twai/twai_self_test/pytest_twai_self_test_example.py deleted file mode 100644 index 39a0243050..0000000000 --- a/examples/peripherals/twai/twai_self_test/pytest_twai_self_test_example.py +++ /dev/null @@ -1,12 +0,0 @@ -# SPDX-FileCopyrightText: 2021-2025 Espressif Systems (Shanghai) CO LTD -# SPDX-License-Identifier: CC0-1.0 -import pytest -from pytest_embedded import Dut -from pytest_embedded_idf.utils import idf_parametrize - - -@pytest.mark.twai_transceiver -@idf_parametrize('target', ['esp32'], indirect=['target']) -def test_twai_self_test_example(dut: Dut) -> None: - dut.expect_exact('TWAI Self Test: Driver installed') - dut.expect_exact('TWAI Self Test: Driver uninstalled')