Skip to content

Commit bc4ea69

Browse files
committed
extmod/machine_i2c: Add argument to C funcs to control stop generation.
1 parent b983cfa commit bc4ea69

1 file changed

Lines changed: 14 additions & 13 deletions

File tree

extmod/machine_i2c.c

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ STATIC int mp_hal_i2c_write_addresses(machine_i2c_obj_t *self, uint8_t addr,
183183
}
184184

185185
STATIC void mp_hal_i2c_write_mem(machine_i2c_obj_t *self, uint8_t addr,
186-
uint32_t memaddr, uint8_t addrsize, const uint8_t *src, size_t len) {
186+
uint32_t memaddr, uint8_t addrsize, const uint8_t *src, size_t len, bool stop) {
187187
// start the I2C transaction
188188
if (!mp_hal_i2c_start(self)) {
189189
goto er;
@@ -202,7 +202,7 @@ STATIC void mp_hal_i2c_write_mem(machine_i2c_obj_t *self, uint8_t addr,
202202
}
203203

204204
// finish the I2C transaction
205-
if (!mp_hal_i2c_stop(self)) {
205+
if (stop && !mp_hal_i2c_stop(self)) {
206206
goto er;
207207
}
208208
return;
@@ -213,7 +213,7 @@ STATIC void mp_hal_i2c_write_mem(machine_i2c_obj_t *self, uint8_t addr,
213213
}
214214

215215
STATIC void mp_hal_i2c_read_mem(machine_i2c_obj_t *self, uint8_t addr,
216-
uint32_t memaddr, uint8_t addrsize, uint8_t *dest, size_t len) {
216+
uint32_t memaddr, uint8_t addrsize, uint8_t *dest, size_t len, bool stop) {
217217
// start the I2C transaction
218218
if (!mp_hal_i2c_start(self)) {
219219
goto er;
@@ -239,7 +239,7 @@ STATIC void mp_hal_i2c_read_mem(machine_i2c_obj_t *self, uint8_t addr,
239239
goto er;
240240
}
241241
}
242-
if (!mp_hal_i2c_stop(self)) {
242+
if (stop && !mp_hal_i2c_stop(self)) {
243243
goto er;
244244
}
245245
return;
@@ -249,12 +249,12 @@ STATIC void mp_hal_i2c_read_mem(machine_i2c_obj_t *self, uint8_t addr,
249249
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "I2C bus error"));
250250
}
251251

252-
STATIC void mp_hal_i2c_write(machine_i2c_obj_t *self, uint8_t addr, const uint8_t *src, size_t len) {
253-
mp_hal_i2c_write_mem(self, addr, 0, 0, src, len);
252+
STATIC void mp_hal_i2c_write(machine_i2c_obj_t *self, uint8_t addr, const uint8_t *src, size_t len, bool stop) {
253+
mp_hal_i2c_write_mem(self, addr, 0, 0, src, len, stop);
254254
}
255255

256-
STATIC void mp_hal_i2c_read(machine_i2c_obj_t *self, uint8_t addr, uint8_t *dest, size_t len) {
257-
mp_hal_i2c_read_mem(self, addr, 0, 0, dest, len);
256+
STATIC void mp_hal_i2c_read(machine_i2c_obj_t *self, uint8_t addr, uint8_t *dest, size_t len, bool stop) {
257+
mp_hal_i2c_read_mem(self, addr, 0, 0, dest, len, stop);
258258
}
259259

260260
/******************************************************************************/
@@ -428,8 +428,9 @@ STATIC mp_obj_t machine_i2c_readfrom_mem(size_t n_args, const mp_obj_t *pos_args
428428
vstr_init_len(&vstr, mp_obj_get_int(args[ARG_n].u_obj));
429429

430430
// do the transfer
431+
431432
mp_hal_i2c_read_mem(self, args[ARG_addr].u_int, args[ARG_memaddr].u_int,
432-
args[ARG_addrsize].u_int, (uint8_t*)vstr.buf, vstr.len);
433+
args[ARG_addrsize].u_int, (uint8_t*)vstr.buf, vstr.len, true);
433434
return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr);
434435
}
435436
MP_DEFINE_CONST_FUN_OBJ_KW(machine_i2c_readfrom_mem_obj, 1, machine_i2c_readfrom_mem);
@@ -448,7 +449,7 @@ STATIC mp_obj_t machine_i2c_readfrom_mem_into(size_t n_args, const mp_obj_t *pos
448449

449450
// do the transfer
450451
mp_hal_i2c_read_mem(self, args[ARG_addr].u_int, args[ARG_memaddr].u_int,
451-
args[ARG_addrsize].u_int, bufinfo.buf, bufinfo.len);
452+
args[ARG_addrsize].u_int, bufinfo.buf, bufinfo.len, true);
452453
return mp_const_none;
453454
}
454455
MP_DEFINE_CONST_FUN_OBJ_KW(machine_i2c_readfrom_mem_into_obj, 1, machine_i2c_readfrom_mem_into);
@@ -466,7 +467,7 @@ STATIC mp_obj_t machine_i2c_writeto_mem(size_t n_args, const mp_obj_t *pos_args,
466467

467468
// do the transfer
468469
mp_hal_i2c_write_mem(self, args[ARG_addr].u_int, args[ARG_memaddr].u_int,
469-
args[ARG_addrsize].u_int, bufinfo.buf, bufinfo.len);
470+
args[ARG_addrsize].u_int, bufinfo.buf, bufinfo.len, true);
470471
return mp_const_none;
471472
}
472473
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(machine_i2c_writeto_mem_obj, 1, machine_i2c_writeto_mem);
@@ -532,13 +533,13 @@ int mp_machine_soft_i2c_write(mp_obj_base_t *self_in, const uint8_t *src, size_t
532533

533534
int mp_machine_soft_i2c_readfrom(mp_obj_base_t *self_in, uint16_t addr, uint8_t *dest, size_t len, bool stop) {
534535
machine_i2c_obj_t *self = (machine_i2c_obj_t*)self_in;
535-
mp_hal_i2c_read(self, addr, dest, len);
536+
mp_hal_i2c_read(self, addr, dest, len, stop);
536537
return 0; // success
537538
}
538539

539540
int mp_machine_soft_i2c_writeto(mp_obj_base_t *self_in, uint16_t addr, const uint8_t *src, size_t len, bool stop) {
540541
machine_i2c_obj_t *self = (machine_i2c_obj_t*)self_in;
541-
mp_hal_i2c_write(self, addr, src, len);
542+
mp_hal_i2c_write(self, addr, src, len, stop);
542543
return 0; // success
543544
}
544545

0 commit comments

Comments
 (0)