Skip to content

Commit d01a193

Browse files
committed
Merge branch 'test/twai_bitrate_correctness' into 'master'
test(twai): ensure the bitrate correctness by uart baudrate detector Closes IDF-13020 See merge request espressif/esp-idf!38982
2 parents 196bd43 + 2ea460d commit d01a193

File tree

7 files changed

+62
-26
lines changed

7 files changed

+62
-26
lines changed

components/esp_driver_twai/test_apps/test_twai/main/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@ endif()
1010

1111
idf_component_register(
1212
SRCS ${srcs}
13-
PRIV_REQUIRES esp_driver_twai esp_timer
13+
PRIV_REQUIRES esp_driver_twai esp_timer esp_driver_uart
1414
WHOLE_ARCHIVE
1515
)

components/esp_driver_twai/test_apps/test_twai/main/test_app_main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#include "esp_heap_caps.h"
1111

1212
// lazy install of mutex and pm_lock occupied memorys
13-
#define LEAKS (250)
13+
#define LEAKS (300)
1414

1515
void setUp(void)
1616
{

components/esp_driver_twai/test_apps/test_twai/main/test_twai_common.c

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "freertos/FreeRTOS.h"
1616
#include "esp_twai.h"
1717
#include "esp_twai_onchip.h"
18+
#include "driver/uart.h" // for baudrate detection
1819

1920
#define TEST_TX_GPIO 4
2021
#define TEST_RX_GPIO 5
@@ -100,6 +101,58 @@ TEST_CASE("twai install uninstall (loopback)", "[TWAI]")
100101
}
101102
}
102103

104+
static void test_twai_baudrate_correctness(twai_clock_source_t clk_src, uint32_t test_bitrate)
105+
{
106+
twai_node_handle_t twai_node = NULL;
107+
twai_onchip_node_config_t node_config = {
108+
.clk_src = clk_src,
109+
.io_cfg.tx = TEST_TX_GPIO,
110+
.io_cfg.rx = TEST_TX_GPIO,
111+
.bit_timing.bitrate = test_bitrate,
112+
.tx_queue_depth = 1,
113+
.flags.enable_loopback = true,
114+
.flags.enable_self_test = true,
115+
};
116+
TEST_ESP_OK(twai_new_node_onchip(&node_config, &twai_node));
117+
TEST_ESP_OK(twai_node_enable(twai_node));
118+
119+
// We use the UART baudrate detection submodule to measure the TWAI baudrate
120+
uart_bitrate_detect_config_t detect_config = {
121+
.rx_io_num = TEST_TX_GPIO,
122+
};
123+
TEST_ESP_OK(uart_detect_bitrate_start(UART_NUM_1, &detect_config));
124+
125+
twai_frame_t tx_frame = {
126+
.buffer = (uint8_t []){0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55},
127+
.buffer_len = 8,
128+
.header = {
129+
.id = 0x55555,
130+
.ide = true,
131+
.dlc = 8,
132+
}
133+
};
134+
TEST_ESP_OK(twai_node_transmit(twai_node, &tx_frame, 500));
135+
vTaskDelay(100);
136+
137+
// analyze the measurement result
138+
uart_bitrate_res_t measure_result;
139+
TEST_ESP_OK(uart_detect_bitrate_stop(UART_NUM_1, true, &measure_result));
140+
uint32_t bitrate_measured = measure_result.clk_freq_hz * 4 / (measure_result.pos_period + measure_result.neg_period);
141+
printf("TWAI bitrate measured: %"PRIu32"\r\n", bitrate_measured);
142+
TEST_ASSERT_INT_WITHIN(1000, test_bitrate, bitrate_measured); // 1k tolerance
143+
144+
TEST_ESP_OK(twai_node_disable(twai_node));
145+
TEST_ESP_OK(twai_node_delete(twai_node));
146+
}
147+
148+
TEST_CASE("twai baudrate measurement", "[TWAI]")
149+
{
150+
twai_clock_source_t twai_available_clk_srcs[] = SOC_TWAI_CLKS;
151+
for (size_t i = 0; i < sizeof(twai_available_clk_srcs) / sizeof(twai_available_clk_srcs[0]); i++) {
152+
test_twai_baudrate_correctness(twai_available_clk_srcs[i], 200000);
153+
}
154+
}
155+
103156
static IRAM_ATTR bool test_enable_disable_rx_cb(twai_node_handle_t handle, const twai_rx_done_event_data_t *edata, void *user_ctx)
104157
{
105158
twai_frame_t *rx_frame = user_ctx;

components/hal/esp32c5/include/hal/twaifd_ll.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -154,15 +154,17 @@ static inline void twaifd_ll_enable_hw(twaifd_dev_t *hw, bool enable)
154154
* @brief Set operating mode of TWAI controller
155155
*
156156
* @param hw Start address of the TWAI registers
157-
* @param modes Operating mode
157+
* @param listen_only Listen only mode (a.k.a. bus monitoring mode)
158+
* @param self_test Self test mode
159+
* @param loopback Loopback mode
158160
*/
159-
static inline void twaifd_ll_set_mode(twaifd_dev_t *hw, bool listen_only, bool no_ack, bool loopback)
161+
static inline void twaifd_ll_set_mode(twaifd_dev_t *hw, bool listen_only, bool self_test, bool loopback)
160162
{
161163
//mode should be changed under disabled
162164
HAL_ASSERT(hw->mode_settings.ena == 0);
163165

164166
twaifd_mode_settings_reg_t opmode = {.val = hw->mode_settings.val};
165-
opmode.stm = no_ack;
167+
opmode.stm = self_test;
166168
opmode.bmm = listen_only;
167169
opmode.ilbp = loopback;
168170

components/soc/esp32c5/register/soc/twaifd_struct.h

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -120,14 +120,7 @@ typedef union {
120120
* 0b1 - TXBBM_ENABLED - TXT Buffer Backup mode enabled\\
121121
*/
122122
uint32_t txbbm:1;
123-
/** sam : R/W; bitpos: [11]; default: 0;
124-
* Self-acknowledge mode.\\
125-
* 0b0 - SAM_DISABLE - Do not send dominant ACK bit when CTU CAN FD sends Acknowledge
126-
* bit.\\
127-
* 0b1 - SAM_ENABLE - Send dominant ACK bit when CTU CAN FD transmits CAN frame.\\
128-
*/
129-
uint32_t sam:1;
130-
uint32_t reserved_12:4;
123+
uint32_t reserved_11:5;
131124
/** rtrle : R/W; bitpos: [16]; default: 0;
132125
* Retransmitt Limit Enable. If enabled, CTU CAN FD only attempts to retransmitt each
133126
* frame up to RTR_TH

components/soc/esp32h4/register/soc/twaifd_reg.h

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -155,16 +155,6 @@ extern "C" {
155155
#define TWAIFD_TXBBM_M (TWAIFD_TXBBM_V << TWAIFD_TXBBM_S)
156156
#define TWAIFD_TXBBM_V 0x00000001U
157157
#define TWAIFD_TXBBM_S 10
158-
/** TWAIFD_SAM : R/W; bitpos: [11]; default: 0;
159-
* Self-acknowledge mode.
160-
* 0b0 - SAM_DISABLE - Do not send dominant ACK bit when CTU CAN FD sends Acknowledge
161-
* bit.
162-
* 0b1 - SAM_ENABLE - Send dominant ACK bit when CTU CAN FD transmits CAN frame.
163-
*/
164-
#define TWAIFD_SAM (BIT(11))
165-
#define TWAIFD_SAM_M (TWAIFD_SAM_V << TWAIFD_SAM_S)
166-
#define TWAIFD_SAM_V 0x00000001U
167-
#define TWAIFD_SAM_S 11
168158
/** TWAIFD_RTRLE : R/W; bitpos: [16]; default: 0;
169159
* Retransmitt Limit Enable. If enabled, CTU CAN FD only attempts to retransmitt each
170160
* frame up to RTR_TH

components/soc/esp32p4/include/soc/clk_tree_defs.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -597,16 +597,14 @@ typedef enum {
597597
/**
598598
* @brief Array initializer for all supported clock sources of TWAI
599599
*/
600-
#define SOC_TWAI_CLKS {SOC_MOD_CLK_XTAL, SOC_MOD_CLK_RC_FAST}
600+
#define SOC_TWAI_CLKS {SOC_MOD_CLK_XTAL}
601601

602602
/**
603603
* @brief TWAI clock source
604604
*/
605605
typedef enum {
606606
TWAI_CLK_SRC_XTAL = SOC_MOD_CLK_XTAL, /*!< Select XTAL as the source clock */
607-
#if SOC_CLK_TREE_SUPPORTED
608607
TWAI_CLK_SRC_RC_FAST = SOC_MOD_CLK_RC_FAST, /*!< Select RC_FAST as the source clock */
609-
#endif
610608
TWAI_CLK_SRC_DEFAULT = SOC_MOD_CLK_XTAL, /*!< Select XTAL as the default clock choice */
611609
} soc_periph_twai_clk_src_t;
612610

0 commit comments

Comments
 (0)