Skip to content

Commit 202df95

Browse files
authored
Preserve repeated-start SCCB reads with fallback (#847)
* Revert "fix: fix addr8v8 read err in sccb_ng (#828)" This reverts commit fafc200. * fix: preserve repeated-start SCCB reads with fallback
1 parent 2ac69a6 commit 202df95

1 file changed

Lines changed: 28 additions & 10 deletions

File tree

driver/sccb-ng.c

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)