Skip to content

Commit b71556a

Browse files
committed
fix(i2c): Fix i2c slave auto selection issue,
Closes #15644
1 parent 1f54af8 commit b71556a

File tree

3 files changed

+57
-10
lines changed

3 files changed

+57
-10
lines changed

components/esp_driver_i2c/i2c_slave.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -202,6 +202,7 @@ esp_err_t i2c_new_slave_device(const i2c_slave_config_t *slave_config, i2c_slave
202202
ESP_RETURN_ON_FALSE(i2c_slave, ESP_ERR_NO_MEM, TAG, "no memory for i2c slave bus");
203203

204204
ESP_GOTO_ON_ERROR(i2c_acquire_bus_handle(i2c_port_num, &i2c_slave->base, I2C_BUS_MODE_SLAVE), err, TAG, "I2C bus acquire failed");
205+
i2c_port_num = i2c_slave->base->port_num;
205206

206207
i2c_hal_context_t *hal = &i2c_slave->base->hal;
207208
i2c_slave->base->scl_num = slave_config->scl_io_num;
@@ -293,8 +294,10 @@ esp_err_t i2c_new_slave_device(const i2c_slave_config_t *slave_config, i2c_slave
293294
static esp_err_t i2c_slave_bus_destroy(i2c_slave_dev_handle_t i2c_slave)
294295
{
295296
if (i2c_slave) {
296-
i2c_ll_disable_intr_mask(i2c_slave->base->hal.dev, I2C_LL_SLAVE_EVENT_INTR);
297-
i2c_common_deinit_pins(i2c_slave->base);
297+
if (i2c_slave->base) {
298+
i2c_ll_disable_intr_mask(i2c_slave->base->hal.dev, I2C_LL_SLAVE_EVENT_INTR);
299+
i2c_common_deinit_pins(i2c_slave->base);
300+
}
298301
if (i2c_slave->slv_rx_mux) {
299302
vSemaphoreDeleteWithCaps(i2c_slave->slv_rx_mux);
300303
i2c_slave->slv_rx_mux = NULL;

components/esp_driver_i2c/i2c_slave_v2.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -207,7 +207,12 @@ IRAM_ATTR static void i2c_slave_isr_handler(void *arg)
207207

208208
static esp_err_t i2c_slave_device_destroy(i2c_slave_dev_handle_t i2c_slave)
209209
{
210-
i2c_ll_disable_intr_mask(i2c_slave->base->hal.dev, I2C_LL_SLAVE_EVENT_INTR);
210+
esp_err_t ret = ESP_OK;
211+
if (i2c_slave->base) {
212+
i2c_ll_disable_intr_mask(i2c_slave->base->hal.dev, I2C_LL_SLAVE_EVENT_INTR);
213+
i2c_common_deinit_pins(i2c_slave->base);
214+
ret = i2c_release_bus_handle(i2c_slave->base);
215+
}
211216
if (i2c_slave->rx_ring_buf) {
212217
vRingbufferDeleteWithCaps(i2c_slave->rx_ring_buf);
213218
i2c_slave->rx_ring_buf = NULL;
@@ -223,7 +228,6 @@ static esp_err_t i2c_slave_device_destroy(i2c_slave_dev_handle_t i2c_slave)
223228
if (i2c_slave->receive_desc.buffer) {
224229
free(i2c_slave->receive_desc.buffer);
225230
}
226-
esp_err_t ret = i2c_release_bus_handle(i2c_slave->base);
227231

228232
free(i2c_slave);
229233
return ret;
@@ -256,7 +260,7 @@ esp_err_t i2c_new_slave_device(const i2c_slave_config_t *slave_config, i2c_slave
256260
i2c_slave->base->sda_num = slave_config->sda_io_num;
257261
i2c_slave->base->pull_up_enable = slave_config->flags.enable_internal_pullup;
258262
i2c_slave->rx_data_count = 0;
259-
int i2c_port_num = slave_config->i2c_port;
263+
i2c_port_num_t i2c_port_num = i2c_slave->base->port_num;
260264
ESP_GOTO_ON_ERROR(i2c_common_set_pins(i2c_slave->base), err, TAG, "i2c slave set pins failed");
261265

262266
i2c_slave->rx_ring_buf = xRingbufferCreateWithCaps(slave_config->receive_buf_depth, RINGBUF_TYPE_BYTEBUF, I2C_MEM_ALLOC_CAPS);

components/esp_driver_i2c/test_apps/i2c_test_apps/main/test_i2c_slave_v2.c

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Unlicense OR CC0-1.0
55
*/
@@ -19,6 +19,47 @@
1919

2020
#if SOC_I2C_SLAVE_CAN_GET_STRETCH_CAUSE
2121

22+
TEST_CASE("I2C peripheral allocate slave all", "[i2c]")
23+
{
24+
i2c_slave_dev_handle_t dev_handle[SOC_HP_I2C_NUM];
25+
for (int i = 0; i < SOC_HP_I2C_NUM; i++) {
26+
i2c_slave_config_t i2c_slv_config_1 = {
27+
.clk_source = I2C_CLK_SRC_DEFAULT,
28+
.i2c_port = -1,
29+
.scl_io_num = I2C_SLAVE_SCL_IO,
30+
.sda_io_num = I2C_SLAVE_SDA_IO,
31+
.slave_addr = ESP_SLAVE_ADDR,
32+
.send_buf_depth = DATA_LENGTH,
33+
.receive_buf_depth = DATA_LENGTH,
34+
.flags.enable_internal_pullup = true,
35+
};
36+
37+
TEST_ESP_OK(i2c_new_slave_device(&i2c_slv_config_1, &dev_handle[i]));
38+
}
39+
i2c_slave_config_t i2c_slv_config_1 = {
40+
.clk_source = I2C_CLK_SRC_DEFAULT,
41+
.i2c_port = -1,
42+
.scl_io_num = I2C_SLAVE_SCL_IO,
43+
.sda_io_num = I2C_SLAVE_SDA_IO,
44+
.slave_addr = ESP_SLAVE_ADDR,
45+
.send_buf_depth = DATA_LENGTH,
46+
.receive_buf_depth = DATA_LENGTH,
47+
.flags.enable_internal_pullup = true,
48+
};
49+
i2c_slave_dev_handle_t dev_handle_2;
50+
51+
TEST_ESP_ERR(ESP_ERR_NOT_FOUND, i2c_new_slave_device(&i2c_slv_config_1, &dev_handle_2));
52+
53+
for (int i = 0; i < SOC_HP_I2C_NUM; i++) {
54+
TEST_ESP_OK(i2c_del_slave_device(dev_handle[i]));
55+
}
56+
57+
// Get another one
58+
59+
TEST_ESP_OK(i2c_new_slave_device(&i2c_slv_config_1, &dev_handle_2));
60+
TEST_ESP_OK(i2c_del_slave_device(dev_handle_2));
61+
}
62+
2263
static QueueHandle_t event_queue;
2364
static uint8_t *temp_data;
2465
static size_t temp_len = 0;
@@ -92,7 +133,7 @@ static void i2c_slave_read_test_v2(void)
92133
unity_wait_for_signal("master write");
93134

94135
i2c_slave_event_t evt;
95-
if (xQueueReceive(event_queue, &evt, 1) == pdTRUE) {
136+
if (xQueueReceive(event_queue, &evt, portMAX_DELAY) == pdTRUE) {
96137
if (evt == I2C_SLAVE_EVT_RX) {
97138
disp_buf(temp_data, temp_len);
98139
printf("length is %x\n", temp_len);
@@ -296,7 +337,6 @@ static void i2c_master_write_test_with_customize_api(void)
296337

297338
TEST_ESP_OK(i2c_del_master_bus(bus_handle));
298339
}
299-
300340
TEST_CASE_MULTIPLE_DEVICES("I2C master write slave with customize api", "[i2c][test_env=generic_multi_device][timeout=150]", i2c_master_write_test_with_customize_api, i2c_slave_read_test_v2);
301341

302342
#endif // SOC_I2C_SLAVE_CAN_GET_STRETCH_CAUSE

0 commit comments

Comments
 (0)