58
58
//| :param int frequency: The clock frequency in Hertz
59
59
//| :param int timeout: The maximum clock stretching timeut - (used only for
60
60
//| :class:`bitbangio.I2C`; ignored for :class:`busio.I2C`)
61
- //|
62
- //| .. note:: On the nRF52840, only one I2C object may be created,
63
- //| except on the Circuit Playground Bluefruit, which allows two,
64
- //| one for the onboard accelerometer, and one for offboard use."""
65
61
//| ...
66
62
//|
67
63
STATIC mp_obj_t busio_i2c_make_new (const mp_obj_type_t * type , size_t n_args , size_t n_kw , const mp_obj_t * all_args ) {
@@ -191,23 +187,6 @@ MP_DEFINE_CONST_FUN_OBJ_1(busio_i2c_unlock_obj, busio_i2c_obj_unlock);
191
187
//| :param int end: end of buffer slice; if not specified, use ``len(buffer)``"""
192
188
//| ...
193
189
//|
194
- // Shared arg parsing for readfrom_into and writeto_then_readfrom.
195
- STATIC void readfrom (busio_i2c_obj_t * self , mp_int_t address , mp_obj_t buffer , int32_t start , mp_int_t end ) {
196
- mp_buffer_info_t bufinfo ;
197
- mp_get_buffer_raise (buffer , & bufinfo , MP_BUFFER_WRITE );
198
-
199
- size_t length = bufinfo .len ;
200
- normalize_buffer_bounds (& start , end , & length );
201
- if (length == 0 ) {
202
- mp_raise_ValueError (translate ("Buffer must be at least length 1" ));
203
- }
204
-
205
- uint8_t status = common_hal_busio_i2c_read (self , address , ((uint8_t * )bufinfo .buf ) + start , length );
206
- if (status != 0 ) {
207
- mp_raise_OSError (status );
208
- }
209
- }
210
-
211
190
STATIC mp_obj_t busio_i2c_readfrom_into (size_t n_args , const mp_obj_t * pos_args , mp_map_t * kw_args ) {
212
191
enum { ARG_address , ARG_buffer , ARG_start , ARG_end };
213
192
static const mp_arg_t allowed_args [] = {
@@ -219,11 +198,27 @@ STATIC mp_obj_t busio_i2c_readfrom_into(size_t n_args, const mp_obj_t *pos_args,
219
198
busio_i2c_obj_t * self = MP_OBJ_TO_PTR (pos_args [0 ]);
220
199
check_for_deinit (self );
221
200
check_lock (self );
201
+
222
202
mp_arg_val_t args [MP_ARRAY_SIZE (allowed_args )];
223
203
mp_arg_parse_all (n_args - 1 , pos_args + 1 , kw_args , MP_ARRAY_SIZE (allowed_args ), allowed_args , args );
224
204
225
- readfrom (self , args [ARG_address ].u_int , args [ARG_buffer ].u_obj , args [ARG_start ].u_int ,
226
- args [ARG_end ].u_int );
205
+ mp_buffer_info_t bufinfo ;
206
+ mp_get_buffer_raise (args [ARG_buffer ].u_obj , & bufinfo , MP_BUFFER_WRITE );
207
+
208
+ size_t length = bufinfo .len ;
209
+ int32_t start = args [ARG_start ].u_int ;
210
+ const int32_t end = args [ARG_end ].u_int ;
211
+ normalize_buffer_bounds (& start , end , & length );
212
+ if (length == 0 ) {
213
+ mp_raise_ValueError_varg (translate ("%q length must be >= 1" ), MP_QSTR_buffer );
214
+ }
215
+
216
+ uint8_t status =
217
+ common_hal_busio_i2c_read (self , args [ARG_address ].u_int , ((uint8_t * )bufinfo .buf ) + start , length );
218
+ if (status != 0 ) {
219
+ mp_raise_OSError (status );
220
+ }
221
+
227
222
return mp_const_none ;
228
223
}
229
224
MP_DEFINE_CONST_FUN_OBJ_KW (busio_i2c_readfrom_into_obj , 1 , busio_i2c_readfrom_into );
@@ -247,23 +242,6 @@ MP_DEFINE_CONST_FUN_OBJ_KW(busio_i2c_readfrom_into_obj, 1, busio_i2c_readfrom_in
247
242
//| """
248
243
//| ...
249
244
//|
250
- // Shared arg parsing for writeto and writeto_then_readfrom.
251
- STATIC void writeto (busio_i2c_obj_t * self , mp_int_t address , mp_obj_t buffer , int32_t start , mp_int_t end , bool stop ) {
252
- // get the buffer to write the data from
253
- mp_buffer_info_t bufinfo ;
254
- mp_get_buffer_raise (buffer , & bufinfo , MP_BUFFER_READ );
255
-
256
- size_t length = bufinfo .len ;
257
- normalize_buffer_bounds (& start , end , & length );
258
-
259
- // do the transfer
260
- uint8_t status = common_hal_busio_i2c_write (self , address , ((uint8_t * )bufinfo .buf ) + start ,
261
- length , stop );
262
- if (status != 0 ) {
263
- mp_raise_OSError (status );
264
- }
265
- }
266
-
267
245
STATIC mp_obj_t busio_i2c_writeto (size_t n_args , const mp_obj_t * pos_args , mp_map_t * kw_args ) {
268
246
enum { ARG_address , ARG_buffer , ARG_start , ARG_end };
269
247
static const mp_arg_t allowed_args [] = {
@@ -278,8 +256,23 @@ STATIC mp_obj_t busio_i2c_writeto(size_t n_args, const mp_obj_t *pos_args, mp_ma
278
256
mp_arg_val_t args [MP_ARRAY_SIZE (allowed_args )];
279
257
mp_arg_parse_all (n_args - 1 , pos_args + 1 , kw_args , MP_ARRAY_SIZE (allowed_args ), allowed_args , args );
280
258
281
- writeto (self , args [ARG_address ].u_int , args [ARG_buffer ].u_obj , args [ARG_start ].u_int ,
282
- args [ARG_end ].u_int , true);
259
+ // get the buffer to write the data from
260
+ mp_buffer_info_t bufinfo ;
261
+ mp_get_buffer_raise (args [ARG_buffer ].u_obj , & bufinfo , MP_BUFFER_READ );
262
+
263
+ size_t length = bufinfo .len ;
264
+ int32_t start = args [ARG_start ].u_int ;
265
+ const int32_t end = args [ARG_end ].u_int ;
266
+ normalize_buffer_bounds (& start , end , & length );
267
+
268
+ // do the transfer
269
+ uint8_t status =
270
+ common_hal_busio_i2c_write (self , args [ARG_address ].u_int , ((uint8_t * )bufinfo .buf ) + start , length );
271
+
272
+ if (status != 0 ) {
273
+ mp_raise_OSError (status );
274
+ }
275
+
283
276
return mp_const_none ;
284
277
}
285
278
STATIC MP_DEFINE_CONST_FUN_OBJ_KW (busio_i2c_writeto_obj , 1 , busio_i2c_writeto );
@@ -314,21 +307,41 @@ STATIC mp_obj_t busio_i2c_writeto_then_readfrom(size_t n_args, const mp_obj_t *p
314
307
{ MP_QSTR_address , MP_ARG_REQUIRED | MP_ARG_INT , {.u_int = 0 } },
315
308
{ MP_QSTR_out_buffer , MP_ARG_REQUIRED | MP_ARG_OBJ , {.u_obj = MP_OBJ_NULL } },
316
309
{ MP_QSTR_in_buffer , MP_ARG_REQUIRED | MP_ARG_OBJ , {.u_obj = MP_OBJ_NULL } },
317
- { MP_QSTR_out_start , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = 0 } },
318
- { MP_QSTR_out_end , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = INT_MAX } },
319
- { MP_QSTR_in_start , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = 0 } },
320
- { MP_QSTR_in_end , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = INT_MAX } },
310
+ { MP_QSTR_out_start , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = 0 } },
311
+ { MP_QSTR_out_end , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = INT_MAX } },
312
+ { MP_QSTR_in_start , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = 0 } },
313
+ { MP_QSTR_in_end , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = INT_MAX } },
321
314
};
322
315
busio_i2c_obj_t * self = MP_OBJ_TO_PTR (pos_args [0 ]);
323
316
check_for_deinit (self );
324
317
check_lock (self );
325
318
mp_arg_val_t args [MP_ARRAY_SIZE (allowed_args )];
326
319
mp_arg_parse_all (n_args - 1 , pos_args + 1 , kw_args , MP_ARRAY_SIZE (allowed_args ), allowed_args , args );
327
320
328
- writeto (self , args [ARG_address ].u_int , args [ARG_out_buffer ].u_obj , args [ARG_out_start ].u_int ,
329
- args [ARG_out_end ].u_int , false);
330
- readfrom (self , args [ARG_address ].u_int , args [ARG_in_buffer ].u_obj , args [ARG_in_start ].u_int ,
331
- args [ARG_in_end ].u_int );
321
+ mp_buffer_info_t out_bufinfo ;
322
+ mp_get_buffer_raise (args [ARG_out_buffer ].u_obj , & out_bufinfo , MP_BUFFER_READ );
323
+
324
+ size_t out_length = out_bufinfo .len ;
325
+ int32_t out_start = args [ARG_out_start ].u_int ;
326
+ const int32_t out_end = args [ARG_out_end ].u_int ;
327
+ normalize_buffer_bounds (& out_start , out_end , & out_length );
328
+
329
+ mp_buffer_info_t in_bufinfo ;
330
+ mp_get_buffer_raise (args [ARG_in_buffer ].u_obj , & in_bufinfo , MP_BUFFER_WRITE );
331
+
332
+ size_t in_length = in_bufinfo .len ;
333
+ int32_t in_start = args [ARG_in_start ].u_int ;
334
+ const int32_t in_end = args [ARG_in_end ].u_int ;
335
+ normalize_buffer_bounds (& in_start , in_end , & in_length );
336
+ if (in_length == 0 ) {
337
+ mp_raise_ValueError_varg (translate ("%q length must be >= 1" ), MP_QSTR_out_buffer );
338
+ }
339
+
340
+ uint8_t status = common_hal_busio_i2c_write_read (self , args [ARG_address ].u_int ,
341
+ ((uint8_t * )out_bufinfo .buf ) + out_start , out_length ,((uint8_t * )in_bufinfo .buf ) + in_start , in_length );
342
+ if (status != 0 ) {
343
+ mp_raise_OSError (status );
344
+ }
332
345
333
346
return mp_const_none ;
334
347
}
0 commit comments