Skip to content

Commit 263c064

Browse files
committed
Hopefully fixes I2C.
1 parent 7a50adb commit 263c064

File tree

1 file changed

+52
-5
lines changed

1 file changed

+52
-5
lines changed

micropy_updates/esp32/machine_i2c.c

Lines changed: 52 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@
3939

4040
#if MICROPY_PY_MACHINE_I2C || MICROPY_PY_MACHINE_SOFTI2C
4141
#include "../../../../micropy_updates/common/mp_i2c_common.h"
42+
#include "sdkconfig.h"
43+
44+
#define MP_MACHINE_I2C_FLAG_WRITE2 (0x08)
4245

4346
#if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32S3
4447
#define SCLK_I2C_FREQ XTAL_CLK_FREQ
@@ -65,6 +68,11 @@
6568
xSemaphoreGive(self->lock.handle); \
6669
}
6770

71+
#if CONFIG_LCD_ENABLE_DEBUG_LOG
72+
#define I2C_DEBUG_PRINT(...) mp_printf(&mp_plat_print, __VA_ARGS__);
73+
#else
74+
#define I2C_DEBUG_PRINT(...)
75+
#endif
6876

6977
// ********************** machine.I2C.Bus ************************
7078

@@ -150,6 +158,15 @@
150158
++bufs;
151159
}
152160

161+
if (flags & MP_MACHINE_I2C_FLAG_WRITE2) {
162+
i2c_master_start(cmd);
163+
i2c_master_write_byte(cmd, addr << 1, true);
164+
i2c_master_write(cmd, bufs->buf, bufs->len, true);
165+
data_len += bufs->len;
166+
--n;
167+
++bufs;
168+
}
169+
153170
i2c_master_start(cmd);
154171
i2c_master_write_byte(cmd, addr << 1 | (flags & MP_MACHINE_I2C_FLAG_READ), true);
155172

@@ -168,7 +185,6 @@
168185
i2c_master_stop(cmd);
169186
}
170187

171-
// TODO proper timeout
172188
esp_err_t err = i2c_master_cmd_begin(self->port, cmd, 100 * (1 + data_len) / portTICK_PERIOD_MS);
173189
i2c_cmd_link_delete(cmd);
174190

@@ -408,12 +424,43 @@
408424
mp_buffer_info_t read_bufinfo;
409425
mp_get_buffer_raise(args[ARG_write_buf].u_obj, &read_bufinfo, MP_BUFFER_WRITE);
410426

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);
427+
uint8_t * write_buf = (uint8_t *)write_bufinfo.buf;
428+
uint32_t memaddr = 0;
429+
430+
if ((self->reg_bits & 7) != 0 || self->reg_bits > 32) {
431+
mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid mem address size (%u)"), self->reg_bits);
414432
}
415433

416-
ret = device_readfrom(self, self->device_id, (uint8_t *)read_bufinfo.buf, read_bufinfo.len, true);
434+
for (int i=(int)(self->reg_bits / 8);i>-1;i--) {
435+
memaddr |= (uint32_t)(write_buf[i] << ((~i + (int)(self->reg_bits / 8)) * 8));
436+
}
437+
438+
uint8_t memaddr_buf[4];
439+
size_t memaddr_len = get_memaddr_buf(&memaddr_buf[0], memaddr, self->reg_bits);
440+
441+
size_t num_bufs = 2;
442+
443+
unsigned int flags = MP_MACHINE_I2C_FLAG_WRITE1 | MP_MACHINE_I2C_FLAG_READ | MP_MACHINE_I2C_FLAG_STOP;
444+
445+
mp_machine_i2c_buf_t bufs[3] = {
446+
{.len = memaddr_len, .buf = memaddr_buf},
447+
{.len = 0, .buf = NULL},
448+
{.len = 0, .buf = NULL}
449+
};
450+
451+
if ((size_t)(self->reg_bits / 8) < write_bufinfo.len) {
452+
bufs[1].buf = write_buf + (self->reg_bits / 8);
453+
bufs[1].len = write_bufinfo.len - (size_t)(self->reg_bits / 8);
454+
num_bufs += 1;
455+
flags |= MP_MACHINE_I2C_FLAG_WRITE2;
456+
}
457+
458+
bufs[num_bufs - 1].buf = read_bufinfo.buf;
459+
bufs[num_bufs - 1].len = read_bufinfo.len;
460+
461+
if (self->bus == NULL) mp_raise_OSError(1);
462+
463+
int ret = i2c_bus_transfer((mp_obj_base_t *)self->bus, self->device_id, num_bufs, bufs, flags);
417464
if (ret < 0) {
418465
mp_raise_OSError(-ret);
419466
}

0 commit comments

Comments
 (0)