Skip to content

Commit 2f203e2

Browse files
committed
I2C Timeout "Fix" for Espressif devices.
- Similar code has been tested in ESP-IDF - May not be applicable to all use cases or hardware configurations, but is working under my own use cases on Adafruit "Huzzah32" Feather, Sparkfun Thing Plus C, and Unexpected Maker FeatherS3 boards
1 parent cc5451e commit 2f203e2

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
lines changed

ports/espressif/peripherals/i2c.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,16 @@ esp_err_t peripherals_i2c_init(i2c_port_t num, const i2c_config_t *i2c_conf) {
5858
rx_buf_len = 256;
5959
tx_buf_len = 256;
6060
}
61-
return i2c_driver_install(num, i2c_conf->mode, rx_buf_len, tx_buf_len, 0);
61+
err = i2c_driver_install(num, i2c_conf->mode, rx_buf_len, tx_buf_len, 0);
62+
if (err != ESP_OK) {
63+
return err;
64+
}
65+
#if ESPRESSIF_I2C_SET_TIMEOUT_PERCENT_OF_MAX
66+
int max_timeout = (ESP32_I2C_TIMEOUT_MAX + 1) * ESPRESSIF_I2C_SET_TIMEOUT_PERCENT_OF_MAX / 100;
67+
err = i2c_set_timeout(num, max_timeout);
68+
#endif
69+
70+
return err;
6271
}
6372

6473
void peripherals_i2c_deinit(i2c_port_t num) {

ports/espressif/peripherals/i2c.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,22 @@
2929

3030
#include "driver/i2c.h"
3131

32+
#ifndef ESPRESSIF_I2C_SET_TIMEOUT_PERCENT_OF_MAX
33+
#define ESPRESSIF_I2C_SET_TIMEOUT_PERCENT_OF_MAX 66
34+
#endif
35+
36+
#if ESPRESSIF_I2C_SET_TIMEOUT_PERCENT_OF_MAX
37+
#include "soc/i2c_reg.h"
38+
// Determine size of memory location used to store timeout.
39+
#if defined(I2C_TIME_OUT_REG_M) // Standard on ESP32
40+
#define ESP32_I2C_TIMEOUT_MAX I2C_TIME_OUT_REG_M
41+
#elif defined(I2C_TIME_OUT_VALUE_M) // ESP32 S3, possibly others.
42+
#define ESP32_I2C_TIMEOUT_MAX I2C_TIME_OUT_VALUE_M
43+
#else
44+
#define ESP32_I2C_TIMEOUT_MAX 1048576; // Assume same values as basic ESP32.
45+
#endif // defined(I2C_TIME_OUT_REG_M)
46+
#endif // ESPRESSIF_I2C_SET_TIMEOUT_PERCENT_OF_MAX
47+
3248
extern void i2c_reset(void);
3349
extern void never_reset_i2c(i2c_port_t num);
3450
extern esp_err_t peripherals_i2c_init(i2c_port_t num, const i2c_config_t *i2c_conf);

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy