@@ -227,23 +227,41 @@ uint8_t SCCB_Read(uint8_t slv_addr, uint8_t reg)
227227{
228228 i2c_master_dev_handle_t dev_handle = * (get_handle_from_address (slv_addr ));
229229
230- uint8_t tx_buffer [1 ];
231- uint8_t rx_buffer [1 ] = {0 };
230+ uint8_t tx_buffer [1 ] = { reg } ;
231+ uint8_t rx_buffer [1 ] = { 0 };
232232
233- tx_buffer [0 ] = reg ;
233+ esp_err_t ret = i2c_master_transmit_receive (dev_handle , tx_buffer , sizeof (tx_buffer ),
234+ rx_buffer , sizeof (rx_buffer ), TIMEOUT_MS );
235+ if (ret == ESP_OK )
236+ {
237+ return rx_buffer [0 ];
238+ }
234239
235- esp_err_t ret = i2c_master_transmit (dev_handle , tx_buffer , 1 , TIMEOUT_MS );
240+ /*
241+ * Most SCCB sensors expect an 8-bit register read to use a repeated-start
242+ * write/read transaction. Some devices reject that sequence with the new
243+ * IDF I2C master driver, so only fall back to a stop/start read after the
244+ * repeated-start transaction fails.
245+ */
246+ ESP_LOGD (TAG , "SCCB_Read repeated-start failed addr:0x%02x, reg:0x%02x, ret:%d; retrying" ,
247+ slv_addr , reg , ret );
236248
237- if (ret != ESP_OK ) {
238- ESP_LOGE (TAG , "SCCB_Read addr phase failed addr:0x%02x, reg:0x%02x, ret:%d" , slv_addr , reg , ret );
249+ ret = i2c_master_transmit (dev_handle , tx_buffer , sizeof (tx_buffer ), TIMEOUT_MS );
250+ if (ret != ESP_OK )
251+ {
252+ ESP_LOGE (TAG , "SCCB_Read addr phase failed addr:0x%02x, reg:0x%02x, ret:%d" ,
253+ slv_addr , reg , ret );
239254 return 0 ;
240255 }
241256
242- ret = i2c_master_receive (dev_handle , rx_buffer , 1 , TIMEOUT_MS );
243- if (ret != ESP_OK ) {
244- ESP_LOGE (TAG , "SCCB_Read Failed addr:0x%02x, reg:0x%02x, ret:%d" , slv_addr , reg , ret );
257+ ret = i2c_master_receive (dev_handle , rx_buffer , sizeof (rx_buffer ), TIMEOUT_MS );
258+ if (ret != ESP_OK )
259+ {
260+ ESP_LOGE (TAG , "SCCB_Read data phase failed addr:0x%02x, reg:0x%02x, ret:%d" ,
261+ slv_addr , reg , ret );
262+ return 0 ;
245263 }
246- ESP_LOGD ( TAG , "read OK" );
264+
247265 return rx_buffer [0 ];
248266}
249267
0 commit comments