@@ -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
139140er :
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
179186er :
@@ -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