kopia lustrzana https://github.com/espressif/esp-idf
can: Fix reset mode entry and exit calls
This commit fixes multiple bugs caused by incorrect calls to can_enter_reset_mode() and can_exit_reset_mode. Example test scripts also updated to match new runners.pull/4251/head
rodzic
bae5062175
commit
434d1d29d1
|
@ -389,7 +389,8 @@ static void can_intr_handler_err_warn(can_status_reg_t *status, int *alert_req)
|
||||||
can_alert_handler(CAN_ALERT_ABOVE_ERR_WARN, alert_req);
|
can_alert_handler(CAN_ALERT_ABOVE_ERR_WARN, alert_req);
|
||||||
} else if (p_can_obj->control_flags & CTRL_FLAG_RECOVERING) {
|
} else if (p_can_obj->control_flags & CTRL_FLAG_RECOVERING) {
|
||||||
//Bus recovery complete.
|
//Bus recovery complete.
|
||||||
can_enter_reset_mode();
|
esp_err_t err = can_enter_reset_mode();
|
||||||
|
assert(err == ESP_OK);
|
||||||
//Reset and set flags to the equivalent of the stopped state
|
//Reset and set flags to the equivalent of the stopped state
|
||||||
CAN_RESET_FLAG(p_can_obj->control_flags, CTRL_FLAG_RECOVERING | CTRL_FLAG_ERR_WARN |
|
CAN_RESET_FLAG(p_can_obj->control_flags, CTRL_FLAG_RECOVERING | CTRL_FLAG_ERR_WARN |
|
||||||
CTRL_FLAG_ERR_PASSIVE | CTRL_FLAG_BUS_OFF |
|
CTRL_FLAG_ERR_PASSIVE | CTRL_FLAG_BUS_OFF |
|
||||||
|
@ -703,7 +704,7 @@ esp_err_t can_driver_install(const can_general_config_t *g_config, const can_tim
|
||||||
}
|
}
|
||||||
periph_module_reset(PERIPH_CAN_MODULE);
|
periph_module_reset(PERIPH_CAN_MODULE);
|
||||||
periph_module_enable(PERIPH_CAN_MODULE); //Enable APB CLK to CAN peripheral
|
periph_module_enable(PERIPH_CAN_MODULE); //Enable APB CLK to CAN peripheral
|
||||||
esp_err_t err = can_exit_reset_mode(); //Must enter reset mode to write to config registers
|
esp_err_t err = can_enter_reset_mode(); //Must enter reset mode to write to config registers
|
||||||
assert(err == ESP_OK);
|
assert(err == ESP_OK);
|
||||||
can_config_pelican(); //Use PeliCAN addresses
|
can_config_pelican(); //Use PeliCAN addresses
|
||||||
/* Note: REC is allowed to increase even in reset mode. Listen only mode
|
/* Note: REC is allowed to increase even in reset mode. Listen only mode
|
||||||
|
@ -765,7 +766,7 @@ esp_err_t can_driver_uninstall(void)
|
||||||
//Check state
|
//Check state
|
||||||
CAN_CHECK_FROM_CRIT(p_can_obj != NULL, ESP_ERR_INVALID_STATE);
|
CAN_CHECK_FROM_CRIT(p_can_obj != NULL, ESP_ERR_INVALID_STATE);
|
||||||
CAN_CHECK_FROM_CRIT(p_can_obj->control_flags & (CTRL_FLAG_STOPPED | CTRL_FLAG_BUS_OFF), ESP_ERR_INVALID_STATE);
|
CAN_CHECK_FROM_CRIT(p_can_obj->control_flags & (CTRL_FLAG_STOPPED | CTRL_FLAG_BUS_OFF), ESP_ERR_INVALID_STATE);
|
||||||
esp_err_t err = can_exit_reset_mode(); //Enter reset mode to stop any CAN bus activity
|
esp_err_t err = can_enter_reset_mode(); //Enter reset mode to stop any CAN bus activity
|
||||||
assert(err == ESP_OK);
|
assert(err == ESP_OK);
|
||||||
//Clear registers by reading
|
//Clear registers by reading
|
||||||
(void) can_get_interrupt_reason();
|
(void) can_get_interrupt_reason();
|
||||||
|
@ -804,7 +805,7 @@ esp_err_t can_start(void)
|
||||||
//Reset RX queue, and RX message count
|
//Reset RX queue, and RX message count
|
||||||
xQueueReset(p_can_obj->rx_queue);
|
xQueueReset(p_can_obj->rx_queue);
|
||||||
p_can_obj->rx_msg_count = 0;
|
p_can_obj->rx_msg_count = 0;
|
||||||
esp_err_t err = can_exit_reset_mode(); //Should already be in bus-off mode, set again to make sure
|
esp_err_t err = can_enter_reset_mode(); //Should already be in bus-off mode, set again to make sure
|
||||||
assert(err == ESP_OK);
|
assert(err == ESP_OK);
|
||||||
|
|
||||||
//Currently in listen only mode, need to set to mode specified by configuration
|
//Currently in listen only mode, need to set to mode specified by configuration
|
||||||
|
@ -834,7 +835,7 @@ esp_err_t can_stop(void)
|
||||||
CAN_CHECK_FROM_CRIT(!(p_can_obj->control_flags & (CTRL_FLAG_STOPPED | CTRL_FLAG_BUS_OFF)), ESP_ERR_INVALID_STATE);
|
CAN_CHECK_FROM_CRIT(!(p_can_obj->control_flags & (CTRL_FLAG_STOPPED | CTRL_FLAG_BUS_OFF)), ESP_ERR_INVALID_STATE);
|
||||||
|
|
||||||
//Clear interrupts and reset flags
|
//Clear interrupts and reset flags
|
||||||
esp_err_t err = can_exit_reset_mode();
|
esp_err_t err = can_enter_reset_mode();
|
||||||
assert(err == ESP_OK);
|
assert(err == ESP_OK);
|
||||||
(void) can_get_interrupt_reason(); //Read interrupt register to clear interrupts
|
(void) can_get_interrupt_reason(); //Read interrupt register to clear interrupts
|
||||||
can_config_mode(CAN_MODE_LISTEN_ONLY); //Set to listen only mode to freeze REC
|
can_config_mode(CAN_MODE_LISTEN_ONLY); //Set to listen only mode to freeze REC
|
||||||
|
|
|
@ -19,10 +19,10 @@ STR_EXPECT = ("CAN Alert and Recovery: Driver installed", "CAN Alert and Recover
|
||||||
EXPECT_TIMEOUT = 20
|
EXPECT_TIMEOUT = 20
|
||||||
|
|
||||||
|
|
||||||
@IDF.idf_example_test(env_tag='Example_CAN')
|
@IDF.idf_example_test(env_tag='Example_CAN1')
|
||||||
def test_can_alert_and_recovery_example(env, extra_data):
|
def test_can_alert_and_recovery_example(env, extra_data):
|
||||||
# Get device under test, flash and start example. "dut4" must be defined in EnvConfig
|
# Get device under test, flash and start example. "dut4" must be defined in EnvConfig
|
||||||
dut = env.get_dut('dut4', 'examples/peripherals/can/can_alert_and_recovery')
|
dut = env.get_dut('dut1', 'examples/peripherals/can/can_alert_and_recovery')
|
||||||
dut.start_app()
|
dut.start_app()
|
||||||
|
|
||||||
for string in STR_EXPECT:
|
for string in STR_EXPECT:
|
||||||
|
|
|
@ -17,7 +17,7 @@ except ImportError:
|
||||||
# Define tuple of strings to expect for each DUT.
|
# Define tuple of strings to expect for each DUT.
|
||||||
master_expect = ("CAN Master: Driver installed", "CAN Master: Driver uninstalled")
|
master_expect = ("CAN Master: Driver installed", "CAN Master: Driver uninstalled")
|
||||||
slave_expect = ("CAN Slave: Driver installed", "CAN Slave: Driver uninstalled")
|
slave_expect = ("CAN Slave: Driver installed", "CAN Slave: Driver uninstalled")
|
||||||
listen_only_expect = ("CAN Listen Only: Driver installed", "Listen Only: Driver uninstalled")
|
listen_only_expect = ("CAN Listen Only: Driver installed", "CAN Listen Only: Driver uninstalled")
|
||||||
|
|
||||||
|
|
||||||
def dut_thread_callback(**kwargs):
|
def dut_thread_callback(**kwargs):
|
||||||
|
@ -36,7 +36,7 @@ def dut_thread_callback(**kwargs):
|
||||||
result[0] = True
|
result[0] = True
|
||||||
|
|
||||||
|
|
||||||
@IDF.idf_example_test(env_tag='Example_CAN')
|
@IDF.idf_example_test(env_tag='Example_CAN2')
|
||||||
def test_can_network_example(env, extra_data):
|
def test_can_network_example(env, extra_data):
|
||||||
|
|
||||||
# Get device under test. "dut1", "dut2", and "dut3" must be properly defined in EnvConfig
|
# Get device under test. "dut1", "dut2", and "dut3" must be properly defined in EnvConfig
|
||||||
|
|
|
@ -19,10 +19,10 @@ STR_EXPECT = ("CAN Self Test: Driver installed", "CAN Self Test: Driver uninstal
|
||||||
EXPECT_TIMEOUT = 20
|
EXPECT_TIMEOUT = 20
|
||||||
|
|
||||||
|
|
||||||
@IDF.idf_example_test(env_tag='Example_CAN')
|
@IDF.idf_example_test(env_tag='Example_CAN1')
|
||||||
def test_can_self_test_example(env, extra_data):
|
def test_can_self_test_example(env, extra_data):
|
||||||
# Get device under test, flash and start example. "dut4" must be defined in EnvConfig
|
# Get device under test, flash and start example. "dut4" must be defined in EnvConfig
|
||||||
dut = env.get_dut('dut4', 'examples/peripherals/can/can_self_test')
|
dut = env.get_dut('dut1', 'examples/peripherals/can/can_self_test')
|
||||||
dut.start_app()
|
dut.start_app()
|
||||||
|
|
||||||
for string in STR_EXPECT:
|
for string in STR_EXPECT:
|
||||||
|
|
Ładowanie…
Reference in New Issue