@@ -71,6 +71,7 @@ bool i2cIsInit(uint8_t i2c_num) {
71
71
}
72
72
73
73
esp_err_t i2cInit (uint8_t i2c_num , int8_t sda , int8_t scl , uint32_t frequency ) {
74
+ esp_err_t ret = ESP_OK ;
74
75
if (i2c_num >= SOC_I2C_NUM ) {
75
76
return ESP_ERR_INVALID_ARG ;
76
77
}
@@ -90,7 +91,8 @@ esp_err_t i2cInit(uint8_t i2c_num, int8_t sda, int8_t scl, uint32_t frequency) {
90
91
#endif
91
92
if (bus [i2c_num ].initialized ) {
92
93
log_e ("bus is already initialized" );
93
- return ESP_FAIL ;
94
+ ret = ESP_FAIL ;
95
+ goto init_fail ;
94
96
}
95
97
96
98
if (!frequency ) {
@@ -103,7 +105,8 @@ esp_err_t i2cInit(uint8_t i2c_num, int8_t sda, int8_t scl, uint32_t frequency) {
103
105
perimanSetBusDeinit (ESP32_BUS_TYPE_I2C_MASTER_SCL , i2cDetachBus );
104
106
105
107
if (!perimanClearPinBus (sda ) || !perimanClearPinBus (scl )) {
106
- return false;
108
+ ret = ESP_FAIL ;
109
+ goto init_fail ;
107
110
}
108
111
109
112
log_i ("Initializing I2C Master: sda=%d scl=%d freq=%d" , sda , scl , frequency );
@@ -117,7 +120,7 @@ esp_err_t i2cInit(uint8_t i2c_num, int8_t sda, int8_t scl, uint32_t frequency) {
117
120
conf .master .clk_speed = frequency ;
118
121
conf .clk_flags = I2C_SCLK_SRC_FLAG_FOR_NOMAL ; //Any one clock source that is available for the specified frequency may be chosen
119
122
120
- esp_err_t ret = i2c_param_config ((i2c_port_t )i2c_num , & conf );
123
+ ret = i2c_param_config ((i2c_port_t )i2c_num , & conf );
121
124
if (ret != ESP_OK ) {
122
125
log_e ("i2c_param_config failed" );
123
126
} else {
@@ -133,11 +136,16 @@ esp_err_t i2cInit(uint8_t i2c_num, int8_t sda, int8_t scl, uint32_t frequency) {
133
136
i2c_set_timeout ((i2c_port_t )i2c_num , I2C_LL_MAX_TIMEOUT );
134
137
if (!perimanSetPinBus (sda , ESP32_BUS_TYPE_I2C_MASTER_SDA , (void * )(i2c_num + 1 ), i2c_num , -1 )
135
138
|| !perimanSetPinBus (scl , ESP32_BUS_TYPE_I2C_MASTER_SCL , (void * )(i2c_num + 1 ), i2c_num , -1 )) {
139
+ #if !CONFIG_DISABLE_HAL_LOCKS
140
+ //release lock so that i2cDetachBus can execute i2cDeinit
141
+ xSemaphoreGive (bus [i2c_num ].lock );
142
+ #endif
136
143
i2cDetachBus ((void * )(i2c_num + 1 ));
137
- return false ;
144
+ return ESP_FAIL ;
138
145
}
139
146
}
140
147
}
148
+ init_fail :
141
149
#if !CONFIG_DISABLE_HAL_LOCKS
142
150
//release lock
143
151
xSemaphoreGive (bus [i2c_num ].lock );
0 commit comments