diff --git a/components/driver/rmt.c b/components/driver/rmt.c index 361da15eb..5ed12c49f 100644 --- a/components/driver/rmt.c +++ b/components/driver/rmt.c @@ -387,7 +387,6 @@ esp_err_t rmt_set_tx_thr_intr_en(rmt_channel_t channel, bool en, uint16_t evt_th RMT_CHECK(evt_thresh <= 256, "RMT EVT THRESH ERR", ESP_ERR_INVALID_ARG); RMT_ENTER_CRITICAL(); rmt_ll_set_tx_limit(p_rmt_obj[channel]->hal.regs, channel, evt_thresh); - rmt_ll_enable_tx_pingpong(p_rmt_obj[channel]->hal.regs, true); rmt_ll_enable_tx_thres_interrupt(p_rmt_obj[channel]->hal.regs, channel, true); RMT_EXIT_CRITICAL(); } else { @@ -454,6 +453,7 @@ static esp_err_t rmt_internal_config(rmt_dev_t *dev, const rmt_config_t *rmt_par RMT_ENTER_CRITICAL(); rmt_ll_enable_tx_cyclic(dev, channel, rmt_param->tx_config.loop_en); + rmt_ll_enable_tx_pingpong(dev, true); /*Set idle level */ rmt_ll_enable_tx_idle(dev, channel, rmt_param->tx_config.idle_output_en); rmt_ll_set_tx_idle_level(dev, channel, idle_level); @@ -675,6 +675,9 @@ static void IRAM_ATTR rmt_driver_isr_default(void *arg) status &= ~(1 << channel); rmt_obj_t *p_rmt = p_rmt_obj[channel]; if (p_rmt) { + // Reset the receiver/transmitter's write/read addresses to prevent endless err interrupts. + rmt_ll_reset_tx_pointer(p_rmt_obj[channel]->hal.regs, channel); + rmt_ll_reset_rx_pointer(p_rmt_obj[channel]->hal.regs, channel); ESP_EARLY_LOGD(RMT_TAG, "RMT[%d] ERR", channel); ESP_EARLY_LOGD(RMT_TAG, "status: 0x%08x", rmt_ll_get_channel_status(p_rmt_obj[channel]->hal.regs, channel)); } diff --git a/components/driver/test/test_rmt.c b/components/driver/test/test_rmt.c index b0e08992b..605a24b95 100644 --- a/components/driver/test/test_rmt.c +++ b/components/driver/test/test_rmt.c @@ -311,6 +311,21 @@ static void rx_init(void) rmt_driver_install(rmt_rx.channel, (sizeof(rmt_item32_t) * DATA_ITEM_NUM * (RMT_TX_DATA_NUM + 6)), 0); } +//A sample case to test if sending 63 data will cause crash in error interrupt. +TEST_CASE("RMT tx test", "[rmt][test_env=UT_T1_RMT]") +{ + tx_init(); + rmt_item32_t *items = (rmt_item32_t*)malloc(sizeof(rmt_item32_t) * 63); + for(int i = 0; i < 63; i++) { + items[i] = (rmt_item32_t){{{200, 1, 200, 0}}}; + } + TEST_ESP_OK(rmt_write_items(RMT_TX_CHANNEL, items, + 63, /* Number of items */ + 1 /* wait till done */)); + TEST_ESP_OK(rmt_driver_uninstall(RMT_TX_CHANNEL)); + free(items); +} + TEST_CASE("RMT init config", "[rmt][test_env=UT_T1_RMT]") { // tx settings