mirror of
				https://github.com/espressif/esp-idf.git
				synced 2025-10-28 04:05:39 +00:00 
			
		
		
		
	Merge branch 'bugfix/i2c_timeout_issue_v4.3' into 'release/v4.3'
I2C: patch for solving watchdog timeout issue(backport v4.3) See merge request espressif/esp-idf!18132
This commit is contained in:
		| @@ -468,6 +468,14 @@ static void IRAM_ATTR i2c_isr_handler_default(void *arg) | ||||
| { | ||||
|     i2c_obj_t *p_i2c = (i2c_obj_t *) arg; | ||||
|     int i2c_num = p_i2c->i2c_num; | ||||
|     // Interrupt protection. | ||||
|     // On C3 and S3 targets, the I2C may trigger a spurious interrupt, | ||||
|     // in order to detect these false positive, check the I2C's hardware interrupt mask | ||||
|     uint32_t int_mask; | ||||
|     i2c_hal_get_intsts_mask(&(i2c_context[i2c_num].hal), &int_mask); | ||||
|     if (int_mask == 0) { | ||||
|         return; | ||||
|     } | ||||
|     i2c_intr_event_t evt_type = I2C_INTR_EVENT_ERR; | ||||
|     portBASE_TYPE HPTaskAwoken = pdFALSE; | ||||
|     if (p_i2c->mode == I2C_MODE_MASTER) { | ||||
| @@ -491,6 +499,9 @@ static void IRAM_ATTR i2c_isr_handler_default(void *arg) | ||||
|             if (p_i2c->status != I2C_STATUS_ACK_ERROR && p_i2c->status != I2C_STATUS_IDLE) { | ||||
|                 i2c_master_cmd_begin_static(i2c_num); | ||||
|             } | ||||
|         } else { | ||||
|             // Do nothing if there is no proper event. | ||||
|             return; | ||||
|         } | ||||
|         i2c_cmd_evt_t evt = { | ||||
|             .type = I2C_CMD_EVT_ALIVE | ||||
| @@ -587,6 +598,8 @@ static esp_err_t i2c_master_clear_bus(i2c_port_t i2c_num) | ||||
|  **/ | ||||
| static esp_err_t i2c_hw_fsm_reset(i2c_port_t i2c_num) | ||||
| { | ||||
| // A workaround for avoiding cause timeout issue when using | ||||
| // hardware reset. | ||||
| #if !SOC_I2C_SUPPORT_HW_FSM_RST | ||||
|     int scl_low_period, scl_high_period; | ||||
|     int scl_start_hold, scl_rstart_setup; | ||||
|   | ||||
| @@ -95,7 +95,7 @@ | ||||
|  | ||||
| #define SOC_I2C_FIFO_LEN            (32) /*!< I2C hardware FIFO depth */ | ||||
|  | ||||
| #define SOC_I2C_SUPPORT_HW_FSM_RST  (1) | ||||
| // FSM_RST only resets the FSM, not using it. So SOC_I2C_SUPPORT_HW_FSM_RST not defined. | ||||
| #define SOC_I2C_SUPPORT_HW_CLR_BUS  (1) | ||||
|  | ||||
| #define SOC_I2C_SUPPORT_XTAL        (1) | ||||
|   | ||||
| @@ -122,8 +122,7 @@ | ||||
|  | ||||
| #define SOC_I2C_FIFO_LEN       (32) /*!< I2C hardware FIFO depth */ | ||||
|  | ||||
| //ESP32-S2 support hardware FSM reset | ||||
| #define SOC_I2C_SUPPORT_HW_FSM_RST  (1) | ||||
| // FSM_RST only resets the FSM, not using it. So SOC_I2C_SUPPORT_HW_FSM_RST not defined. | ||||
| //ESP32-S2 support hardware clear bus | ||||
| #define SOC_I2C_SUPPORT_HW_CLR_BUS  (1) | ||||
|  | ||||
|   | ||||
| @@ -23,8 +23,7 @@ extern "C" { | ||||
|  | ||||
| #define SOC_I2C_FIFO_LEN       (32) /*!< I2C hardware FIFO depth */ | ||||
|  | ||||
| //ESP32-S3 support hardware FSM reset | ||||
| #define SOC_I2C_SUPPORT_HW_FSM_RST  (1) | ||||
| // FSM_RST only resets the FSM, not using it. So SOC_I2C_SUPPORT_HW_FSM_RST not defined. | ||||
| //ESP32-S3 support hardware clear bus | ||||
| #define SOC_I2C_SUPPORT_HW_CLR_BUS  (1) | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Jiang Jiang Jian
					Jiang Jiang Jian