Skip to content

Commit 9314b2d

Browse files
committed
extmod/machine_i2c: Fix I2C reading by sending ack/nack at end of byte.
1 parent 73bc0c2 commit 9314b2d

1 file changed

Lines changed: 11 additions & 4 deletions

File tree

extmod/machine_i2c.c

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,14 +134,15 @@ STATIC void mp_hal_i2c_write(machine_i2c_obj_t *self, uint8_t addr, uint8_t *dat
134134
goto er;
135135
}
136136
}
137+
mp_hal_i2c_stop(self);
137138
return;
138139

139140
er:
140141
mp_hal_i2c_stop(self);
141142
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "I2C bus error"));
142143
}
143144

144-
STATIC int mp_hal_i2c_read_byte(machine_i2c_obj_t *self, uint8_t *val) {
145+
STATIC int mp_hal_i2c_read_byte(machine_i2c_obj_t *self, uint8_t *val, int nack) {
145146
mp_hal_i2c_delay(self);
146147
mp_hal_i2c_scl_low(self);
147148
mp_hal_i2c_delay(self);
@@ -156,10 +157,15 @@ STATIC int mp_hal_i2c_read_byte(machine_i2c_obj_t *self, uint8_t *val) {
156157
}
157158
*val = data;
158159

160+
// send ack/nack bit
161+
if (!nack) {
162+
mp_hal_i2c_sda_low(self);
163+
}
164+
mp_hal_i2c_delay(self);
159165
mp_hal_i2c_scl_release(self);
160166
mp_hal_i2c_delay(self);
161167
mp_hal_i2c_scl_low(self);
162-
mp_hal_i2c_delay(self);
168+
mp_hal_i2c_sda_release(self);
163169

164170
return 1; // success
165171
}
@@ -170,10 +176,11 @@ STATIC void mp_hal_i2c_read(machine_i2c_obj_t *self, uint8_t addr, uint8_t *data
170176
goto er;
171177
}
172178
while (len--) {
173-
if (!mp_hal_i2c_read_byte(self, data++)) {
179+
if (!mp_hal_i2c_read_byte(self, data++, len == 0)) {
174180
goto er;
175181
}
176182
}
183+
mp_hal_i2c_stop(self);
177184
return;
178185

179186
er:
@@ -254,7 +261,7 @@ STATIC mp_obj_t machine_i2c_readinto(mp_obj_t self_in, mp_obj_t buf_in) {
254261
// do the read
255262
uint8_t *dest = bufinfo.buf;
256263
while (bufinfo.len--) {
257-
if (!mp_hal_i2c_read_byte(self, dest++)) {
264+
if (!mp_hal_i2c_read_byte(self, dest++, bufinfo.len == 0)) {
258265
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "I2C bus error"));
259266
}
260267
}

0 commit comments

Comments
 (0)