Skip to content

Commit 03f3746

Browse files
committed
Hopefully fixes I2C read/write problem.
1 parent dd33253 commit 03f3746

File tree

2 files changed

+13
-29
lines changed

2 files changed

+13
-29
lines changed

api_drivers/common_api_drivers/indev/cst816s.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ def _read_reg(self, reg):
157157
self._tx_buf[0] = reg
158158
self._rx_buf[0] = 0x00
159159

160-
self._device.write_readinto(self._tx_mv[:1], self._rx_mv)
160+
self._device.write_readinto(self._tx_mv[:1], self._rx_mv[:1])
161161

162162
def _write_reg(self, reg, value):
163163
self._tx_buf[0] = reg

micropy_updates/esp32/machine_i2c.c

Lines changed: 12 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -40,30 +40,15 @@
4040
#if MICROPY_PY_MACHINE_I2C || MICROPY_PY_MACHINE_SOFTI2C
4141
#include "../../../../micropy_updates/common/mp_i2c_common.h"
4242

43-
#ifndef MICROPY_HW_I2C0_SCL
44-
#define MICROPY_HW_I2C0_SCL (GPIO_NUM_18)
45-
#define MICROPY_HW_I2C0_SDA (GPIO_NUM_19)
46-
#endif
47-
48-
#ifndef MICROPY_HW_I2C1_SCL
49-
#if CONFIG_IDF_TARGET_ESP32
50-
#define MICROPY_HW_I2C1_SCL (GPIO_NUM_25)
51-
#define MICROPY_HW_I2C1_SDA (GPIO_NUM_26)
52-
#else
53-
#define MICROPY_HW_I2C1_SCL (GPIO_NUM_9)
54-
#define MICROPY_HW_I2C1_SDA (GPIO_NUM_8)
55-
#endif
56-
#endif
57-
5843
#if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32S3
59-
#define I2C_SCLK_FREQ XTAL_CLK_FREQ
44+
#define SCLK_I2C_FREQ XTAL_CLK_FREQ
6045
#elif CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2
61-
#define I2C_SCLK_FREQ APB_CLK_FREQ
46+
#define SCLK_I2C_FREQ APB_CLK_FREQ
6247
#else
6348
#error "unsupported I2C for ESP32 SoC variant"
6449
#endif
6550

66-
#define I2C_DEFAULT_TIMEOUT_US (50000) // 50ms
51+
#define DEFAULT_I2C_TIMEOUT_US (50000) // 50ms
6752

6853

6954
static void device_deinit_internal(mp_machine_hw_i2c_device_obj_t *self);
@@ -136,7 +121,7 @@
136121

137122
i2c_param_config(self->port, &conf);
138123

139-
int timeout = I2C_SCLK_FREQ / 1000000 * timeout_us;
124+
int timeout = SCLK_I2C_FREQ / 1000000 * timeout_us;
140125

141126
i2c_set_timeout(self->port, (timeout > I2C_LL_MAX_TIMEOUT) ? I2C_LL_MAX_TIMEOUT : timeout);
142127
i2c_driver_install(self->port, I2C_MODE_MASTER, 0, 0, 0);
@@ -210,7 +195,7 @@
210195
int h, l;
211196
i2c_get_period(self->port, &h, &l);
212197
mp_printf(print, "I2C(%u, scl=%u, sda=%u, freq=%u)",
213-
self->port, self->scl, self->sda, I2C_SCLK_FREQ / (h + l));
198+
self->port, self->scl, self->sda, SCLK_I2C_FREQ / (h + l));
214199
}
215200

216201

@@ -226,7 +211,7 @@
226211
{ MP_QSTR_freq, MP_ARG_INT, { .u_int = 400000} },
227212
{ MP_QSTR_use_locks, MP_ARG_BOOL, { .u_bool = false } },
228213
{ MP_QSTR_pullup, MP_ARG_BOOL, { .u_bool = false } },
229-
{ MP_QSTR_timeout, MP_ARG_INT, { .u_int = I2C_DEFAULT_TIMEOUT_US } },
214+
{ MP_QSTR_timeout, MP_ARG_INT, { .u_int = DEFAULT_I2C_TIMEOUT_US } },
230215
};
231216
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
232217
mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
@@ -423,17 +408,16 @@
423408
mp_buffer_info_t read_bufinfo;
424409
mp_get_buffer_raise(args[ARG_write_buf].u_obj, &read_bufinfo, MP_BUFFER_WRITE);
425410

426-
uint32_t memaddr = 0;
427-
428-
for (int i=(int)(self->reg_bits / 8) - 1;i>-1;i--) {
429-
memaddr |= (uint32_t)(((uint8_t *)write_bufinfo.buf)[i]) << (uint8_t)((~i + (int)(self->reg_bits / 8)) * 8);
411+
int ret = device_writeto(self, self->device_id, (uint8_t *)write_bufinfo.buf, write_bufinfo.len, false);
412+
if (ret < 0) {
413+
mp_raise_OSError(-ret);
430414
}
431415

432-
int ret = device_read(self, self->device_id, memaddr, self->reg_bits, (uint8_t *)read_bufinfo.buf, read_bufinfo.len);
416+
ret = device_readfrom(self, self->device_id, (uint8_t *)read_bufinfo.buf, read_bufinfo.len, true);
433417
if (ret < 0) {
434418
mp_raise_OSError(-ret);
435419
}
436-
420+
437421
return mp_const_none;
438422
}
439423

@@ -656,7 +640,7 @@
656640

657641
static MP_DEFINE_CONST_DICT(i2c_locals_dict, i2c_locals_dict_table);
658642

659-
643+
660644
MP_DEFINE_CONST_OBJ_TYPE(
661645
machine_i2c_type,
662646
MP_QSTR_I2C,

0 commit comments

Comments
 (0)