Closed hellvesper closed 1 year ago
I tried only example code with same result
I am facing the same issue on ESP8266 platform while running the very basic example for PCA9685: https://github.com/UncleRus/esp-idf-lib/tree/master/examples/pca9685/default
I have master
branch of esp-idf-lib
and most recent ESP8266_RTOS_SDK
.
The test app is a very basic loop executing pca9685_set_pwm_value()
which calls i2c_dev_write_reg()
and this one is calling i2c_setup_port()
in i2cdev.c
from esp-idf-lib
.
I believe the issue is related line 194 in \components\i2cdev\i2cdev.c
static esp_err_t i2c_setup_port(const i2c_dev_t *dev)
{
if (dev->port >= I2C_NUM_MAX) return ESP_ERR_INVALID_ARG;
esp_err_t res;
>> if (!cfg_equal(&dev->cfg, &states[dev->port].config) || !states[dev->port].installed)
{
...
Checking if the i2c driver is already installed fails every time and forces i2c to reconfigure port (and i2c pins) over and over.
I turned on DEBUG
log level and the output confirms this finding:
I followed up on this one and I added simple debug output:
static esp_err_t i2c_setup_port(const i2c_dev_t *dev)
{
ESP_LOGD(TAG, "dev.port:[%d]| dev.cfg: %d %d %d %d %d| states.config: %d %d %d %d %d| states.installed: %d",
dev->port,
dev->cfg.scl_io_num, dev->cfg.sda_io_num, dev->cfg.clk_stretch_tick, dev->cfg.scl_pullup_en, dev->cfg.sda_pullup_en,
states[dev->port].config.scl_io_num, states[dev->port].config.sda_io_num, states[dev->port].config.clk_stretch_tick, states[dev->port].config.scl_pullup_en, states[dev->port].config.sda_pullup_en,
states[dev->port].installed
);
Apparently states[dev->port].config.clk_stretch_tick
changes somewhere from 0
to -1
:
So the problem is here: https://github.com/UncleRus/esp-idf-lib/blame/1a2424f28b313a6a50271b0120830379a25a7e28/components/i2cdev/i2cdev.c#L223
#if HELPER_TARGET_IS_ESP8266
// Clock Stretch time, depending on CPU frequency
temp.clk_stretch_tick = dev->timeout_ticks ? dev->timeout_ticks : I2CDEV_MAX_STRETCH_TIME;
if ((res = i2c_driver_install(dev->port, temp.mode)) != ESP_OK)
return res;
if ((res = i2c_param_config(dev->port, &temp)) != ESP_OK)
return res;
#endif
For ESP8266 platform effectively dev->cfg.clk_stretch_tick
value is ignored and states
copy of configuration has relevant value based on dev->timeout_ticks
(in case of zero it becomes I2CDEV_MAX_STRETCH_TIME == 0xffffffff
). It's never later on synced with dev
value. So it gets unsync from the very beginining.
i2c_setup_port()
function gets dev
as const *
so I am guessing the intention was no to change dev
struct values.
The only other solution then is to fix cfg_equal()
but this one does not has access to dev
, only to its config
.
The issue
I think because of software implemented i2c in esp8266 it affect this issue. Serial monitor flooded with gpio info messagess:
And I think interrupts from printing in console prevent normal work of i2c bus. IDF implementation of i2c driver somehow supress this outputs, but there is some kind of own implementation of bus or wrapper? Log level changes in menuconfig doesn't help.
Which SDK are you using?
ESP8266 RTOS SDK
Which version of SDK are you using?
master
Which build target have you used?
Component causing the issue
ads111x
Anything in the logs that might be useful for us?
Additional information or context
I'm using example from ads111x, 1 ads1115. I used another ads1115 driver without thas issue, which uses standard idf (rtos-sdk) i2c driver.
Includes:
Confirmation