mirror of
				https://github.com/espressif/esp-idf.git
				synced 2025-10-31 13:09:38 +00:00 
			
		
		
		
	fix(i2c_master): Fix an I2C issue that slave streth happen but master timeout set seems doesn't work
Closes https://github.com/espressif/esp-idf/issues/14129 Closes https://github.com/espressif/esp-idf/issues/14401
This commit is contained in:
		| @@ -613,7 +613,7 @@ static inline void i2c_ll_get_stop_timing(i2c_dev_t *hw, int *setup_time, int *h | ||||
|  * | ||||
|  * @param  hw Beginning address of the peripheral registers | ||||
|  * @param  ptr Pointer to data buffer | ||||
|  * @param  len Amount of data needs to be writen | ||||
|  * @param  len Amount of data needs to be written | ||||
|  * | ||||
|  * @return None. | ||||
|  */ | ||||
| @@ -648,7 +648,7 @@ static inline void i2c_ll_read_rxfifo(i2c_dev_t *hw, uint8_t *ptr, uint8_t len) | ||||
|  * @param  hw Beginning address of the peripheral registers | ||||
|  * @param  ram_offset Offset value of I2C RAM. | ||||
|  * @param  ptr Pointer to data buffer | ||||
|  * @param  len Amount of data needs to be writen | ||||
|  * @param  len Amount of data needs to be written | ||||
|  */ | ||||
| static inline void i2c_ll_write_by_nonfifo(i2c_dev_t *hw, uint8_t ram_offset, const uint8_t *ptr, uint8_t len) | ||||
| { | ||||
| @@ -720,7 +720,7 @@ static inline void i2c_ll_master_get_filter(i2c_dev_t *hw, uint8_t *filter_conf) | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * @brief Reste I2C master FSM. When the master FSM is stuck, call this function to reset the FSM | ||||
|  * @brief reset I2C master FSM. When the master FSM is stuck, call this function to reset the FSM | ||||
|  * | ||||
|  * @param  hw Beginning address of the peripheral registers | ||||
|  * | ||||
| @@ -748,7 +748,7 @@ static inline void i2c_ll_master_clr_bus(i2c_dev_t *hw, uint32_t slave_pulses) | ||||
|     hw->scl_sp_conf.scl_rst_slv_num = slave_pulses; | ||||
|     hw->scl_sp_conf.scl_rst_slv_en = 1; | ||||
|     hw->ctr.conf_upgate = 1; | ||||
|     // hardward will clear scl_rst_slv_en after sending SCL pulses, | ||||
|     // hardware will clear scl_rst_slv_en after sending SCL pulses, | ||||
|     // and we should set conf_upgate bit to synchronize register value. | ||||
|     while (hw->scl_sp_conf.scl_rst_slv_en); | ||||
|     hw->ctr.conf_upgate = 1; | ||||
| @@ -879,7 +879,8 @@ static inline bool i2c_ll_master_is_cmd_done(i2c_dev_t *hw, int cmd_idx) | ||||
| static inline uint32_t i2c_ll_calculate_timeout_us_to_reg_val(uint32_t src_clk_hz, uint32_t timeout_us) | ||||
| { | ||||
|     uint32_t clk_cycle_num_per_us = src_clk_hz / (1 * 1000 * 1000); | ||||
|     return 31 - __builtin_clz(clk_cycle_num_per_us * timeout_us); | ||||
|     // round up to an integer | ||||
|     return 32 - __builtin_clz(clk_cycle_num_per_us * timeout_us); | ||||
| } | ||||
|  | ||||
| //////////////////////////////////////////Deprecated Functions////////////////////////////////////////////////////////// | ||||
| @@ -918,7 +919,7 @@ typedef enum { | ||||
|  * @brief  Configure I2C SCL timing | ||||
|  * | ||||
|  * @param  hw Beginning address of the peripheral registers | ||||
|  * @param  high_period The I2C SCL hight period (in core clock cycle, hight_period > 2) | ||||
|  * @param  high_period The I2C SCL height period (in core clock cycle, hight_period > 2) | ||||
|  * @param  low_period The I2C SCL low period (in core clock cycle, low_period > 1) | ||||
|  * @param  wait_high_period The I2C SCL wait rising edge period. | ||||
|  * | ||||
| @@ -1106,7 +1107,7 @@ static inline void i2c_ll_slave_disable_rx_it(i2c_dev_t *hw) | ||||
|  * @brief  Configure I2C SCL timing | ||||
|  * | ||||
|  * @param  hw Beginning address of the peripheral registers | ||||
|  * @param  hight_period The I2C SCL hight period (in core clock cycle, hight_period > 2) | ||||
|  * @param  hight_period The I2C SCL height period (in core clock cycle, hight_period > 2) | ||||
|  * @param  low_period The I2C SCL low period (in core clock cycle, low_period > 1) | ||||
|  * | ||||
|  * @return None. | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 C.S.M
					C.S.M