61
61
_ICM20649_DEVICE_ID = 0xE1 # Correct content of WHO_AM_I register
62
62
_ICM20948_DEVICE_ID = 0xEA # Correct content of WHO_AM_I register
63
63
64
- # Functions using these bank-specific registers are responsible for ensuring that the correct bank is set
65
- # perhaps refactor to have the bank be part of the definition
64
+ # Functions using these bank-specific registers are responsible for ensuring
65
+ # that the correct bank is set
66
66
# Bank 0
67
67
_ICM20X_WHO_AM_I = 0x00 # device_id register
68
68
_ICM20X_REG_BANK_SEL = 0x7F # register bank selection register
@@ -159,8 +159,6 @@ class ICM20X: # pylint:disable=too-many-instance-attributes
159
159
_raw_accel_data = Struct (_ICM20X_ACCEL_XOUT_H , ">hhh" )
160
160
_raw_gyro_data = Struct (_ICM20X_GYRO_XOUT_H , ">hhh" )
161
161
162
- # _i2c_master_duty_cycle_en = RWBit(_ICM20X_LP_CONFIG, 6)
163
-
164
162
# Bank 2
165
163
_gyro_range = RWBits (2 , _ICM20X_GYRO_CONFIG_1 , 1 )
166
164
_accel_config = Struct (_ICM20X_ACCEL_CONFIG_1 , ">B" )
@@ -197,8 +195,7 @@ def initialize(self):
197
195
sleep (0.005 )
198
196
self ._sleep = False
199
197
sleep (0.005 )
200
- # TODO: method-ify
201
- # self._i2c_master_duty_cycle_en = True #WHY?
198
+
202
199
sleep (0.005 )
203
200
204
201
self .accelerometer_range = AccelRange .RANGE_8G # pylint: disable=no-member
@@ -412,7 +409,7 @@ def __init__(self, i2c_bus, address=_ICM20649_DEFAULT_ADDRESS):
412
409
super ().__init__ (i2c_bus , address )
413
410
414
411
415
- class ICM20948 (ICM20X ):
412
+ class ICM20948 (ICM20X ): # pylint:disable=too-many-instance-attributes
416
413
"""Library for the ST ICM-20948 Wide-Range 6-DoF Accelerometer and Gyro.
417
414
418
415
:param ~busio.I2C i2c_bus: The I2C bus the ICM20948 is connected to.
@@ -424,7 +421,6 @@ class ICM20948(ICM20X):
424
421
_raw_mag_data = Struct (_ICM20948_EXT_SLV_SENS_DATA_00 , "<hhhh" )
425
422
426
423
_bypass_i2c_master = RWBit (_ICM20X_REG_INT_PIN_CFG , 1 )
427
- _i2c_master_duty_cycle_en = RWBit (_ICM20X_LP_CONFIG , 6 )
428
424
_i2c_master_control = UnaryStruct (_ICM20X_I2C_MST_CTRL , ">B" )
429
425
_i2c_master_enable = RWBit (_ICM20X_USER_CTRL , 5 ) # TODO: use this in sw reset
430
426
_i2c_master_reset = RWBit (_ICM20X_USER_CTRL , 1 )
@@ -437,7 +433,6 @@ class ICM20948(ICM20X):
437
433
_slave4_addr = UnaryStruct (_ICM20X_I2C_SLV4_ADDR , ">B" )
438
434
_slave4_reg = UnaryStruct (_ICM20X_I2C_SLV4_REG , ">B" )
439
435
_slave4_ctrl = UnaryStruct (_ICM20X_I2C_SLV4_CTRL , ">B" )
440
- _slave4_ctrl = UnaryStruct (_ICM20X_I2C_SLV4_CTRL , ">B" )
441
436
_slave4_do = UnaryStruct (_ICM20X_I2C_SLV4_DO , ">B" )
442
437
_slave4_di = UnaryStruct (_ICM20X_I2C_SLV4_DI , ">B" )
443
438
@@ -463,14 +458,14 @@ def __init__(self, i2c_bus, address=_ICM20948_DEFAULT_ADDRESS):
463
458
464
459
@property
465
460
def _mag_configured (self ):
466
- for tries in range (5 ):
467
- id_tup = self ._mag_id ()
468
- # success
469
- if id_tup is not None :
461
+ success = False
462
+ for _i in range (5 ):
463
+ success = self ._mag_id () is not None
464
+
465
+ if success :
470
466
return True
467
+ self ._reset_i2c_master ()
471
468
# i2c master stuck, try resetting
472
- else :
473
- self ._reset_i2c_master ()
474
469
return False
475
470
476
471
def _reset_i2c_master (self ):
@@ -514,9 +509,8 @@ def _magnetometer_init(self):
514
509
self ._setup_mag_readout ()
515
510
516
511
return True
517
- ################ SAME ABOVE ###########
518
512
519
- # set up slave0 for reading into the bank 0 data registers
513
+ # set up slave0 for reading into the bank 0 data registers
520
514
def _setup_mag_readout (self ):
521
515
self ._bank = 3
522
516
self ._slave0_addr = 0x8C
@@ -527,9 +521,7 @@ def _setup_mag_readout(self):
527
521
sleep (0.005 )
528
522
529
523
def _mag_id (self ):
530
- mag_mfg_id = self ._read_mag_register (0x00 )
531
- mag_chip_id = self ._read_mag_register (0x01 )
532
- return (mag_mfg_id , mag_chip_id )
524
+ return self ._read_mag_register (0x01 )
533
525
534
526
@property
535
527
def magnetic (self ):
@@ -554,18 +546,21 @@ def _read_mag_register(self, register_addr, slave_addr=0x0C):
554
546
sleep (0.005 )
555
547
self ._slave4_reg = register_addr
556
548
sleep (0.005 )
557
- self ._slave4_ctrl = 0x80 # enable, don't raise interrupt, write register value, no delay
549
+ self ._slave4_ctrl = (
550
+ 0x80 # enable, don't raise interrupt, write register value, no delay
551
+ )
558
552
sleep (0.005 )
559
553
self ._bank = 0
560
- # add max cycle count
561
- while not self ._slave_finished :
562
- sleep (0.010 )
563
554
564
- # if i2c_mst_status & (1<<4): # Check I2C_SLV4_NACK bit [4]
565
- # txn_failed = True
555
+ finished = False
556
+ for _i in range (100 ):
557
+ finished = self ._slave_finished
558
+ if finished : # bueno!
559
+ break
560
+ sleep (0.010 )
566
561
567
- # if count > max_cycles :
568
- # txn_failed = True
562
+ if not finished :
563
+ return None
569
564
570
565
self ._bank = 3
571
566
mag_register_data = self ._slave4_di
@@ -581,18 +576,17 @@ def _write_mag_register(self, register_addr, value, slave_addr=0x0C):
581
576
sleep (0.005 )
582
577
self ._slave4_do = value
583
578
sleep (0.005 )
584
- self ._slave4_ctrl = 0x80 # enable, don't raise interrupt, write register value, no delay
579
+ self ._slave4_ctrl = (
580
+ 0x80 # enable, don't raise interrupt, write register value, no delay
581
+ )
585
582
sleep (0.005 )
586
583
self ._bank = 0
587
584
588
- # add max cycle count
589
- # wait for write to mag register to finish")
590
- while not self ._slave_finished :
591
- print ("." , end = "" )
585
+ finished = False
586
+ for _i in range (100 ):
587
+ finished = self ._slave_finished
588
+ if finished : # bueno!
589
+ break
592
590
sleep (0.010 )
593
591
594
- # if i2c_mst_status & (1<<4): # Check I2C_SLV4_NACK bit [4]
595
- # txn_failed = True
596
-
597
- # if count > max_cycles:
598
- # txn_failed = True
592
+ return finished
0 commit comments