diff options
author | Damien George <damien.p.george@gmail.com> | 2016-04-12 15:46:13 +0100 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2016-04-12 15:46:13 +0100 |
commit | 9314b2df4f699623b4ded484d17e12bd1043ddbd (patch) | |
tree | 93a13724d3b8b37886f944d6e4a966490a67f124 /extmod | |
parent | 73bc0c24ab6419b3f41cb272286f99700846ab33 (diff) | |
download | micropython-9314b2df4f699623b4ded484d17e12bd1043ddbd.tar.gz micropython-9314b2df4f699623b4ded484d17e12bd1043ddbd.zip |
extmod/machine_i2c: Fix I2C reading by sending ack/nack at end of byte.
Diffstat (limited to 'extmod')
-rw-r--r-- | extmod/machine_i2c.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/extmod/machine_i2c.c b/extmod/machine_i2c.c index 3d3fa5136a..d8ce588900 100644 --- a/extmod/machine_i2c.c +++ b/extmod/machine_i2c.c @@ -134,6 +134,7 @@ STATIC void mp_hal_i2c_write(machine_i2c_obj_t *self, uint8_t addr, uint8_t *dat goto er; } } + mp_hal_i2c_stop(self); return; er: @@ -141,7 +142,7 @@ er: nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "I2C bus error")); } -STATIC int mp_hal_i2c_read_byte(machine_i2c_obj_t *self, uint8_t *val) { +STATIC int mp_hal_i2c_read_byte(machine_i2c_obj_t *self, uint8_t *val, int nack) { mp_hal_i2c_delay(self); mp_hal_i2c_scl_low(self); mp_hal_i2c_delay(self); @@ -156,10 +157,15 @@ STATIC int mp_hal_i2c_read_byte(machine_i2c_obj_t *self, uint8_t *val) { } *val = data; + // send ack/nack bit + if (!nack) { + mp_hal_i2c_sda_low(self); + } + mp_hal_i2c_delay(self); mp_hal_i2c_scl_release(self); mp_hal_i2c_delay(self); mp_hal_i2c_scl_low(self); - mp_hal_i2c_delay(self); + mp_hal_i2c_sda_release(self); return 1; // success } @@ -170,10 +176,11 @@ STATIC void mp_hal_i2c_read(machine_i2c_obj_t *self, uint8_t addr, uint8_t *data goto er; } while (len--) { - if (!mp_hal_i2c_read_byte(self, data++)) { + if (!mp_hal_i2c_read_byte(self, data++, len == 0)) { goto er; } } + mp_hal_i2c_stop(self); return; er: @@ -254,7 +261,7 @@ STATIC mp_obj_t machine_i2c_readinto(mp_obj_t self_in, mp_obj_t buf_in) { // do the read uint8_t *dest = bufinfo.buf; while (bufinfo.len--) { - if (!mp_hal_i2c_read_byte(self, dest++)) { + if (!mp_hal_i2c_read_byte(self, dest++, bufinfo.len == 0)) { nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "I2C bus error")); } } |