@@ -56,22 +56,28 @@ def reset_bus(i2c_bus: I2C) -> I2C:
56
56
# Unfortunately the I2C class does not expose those attributes directly.
57
57
interface , scl_pin_number , sda_pin_number = _I2CHelper .extract_i2c_info (i2c_bus )
58
58
59
- scl_pin = Pin (scl_pin_number , Pin .IN ) # Detach pin from I2C
60
- sda_pin = Pin (sda_pin_number , Pin .IN ) # Detach pin from I2C
59
+ # Detach pins from I2C and configure them as GPIO outputs in open-drain mode
60
+ scl_pin = Pin (scl_pin_number , Pin .OUT , Pin .OPEN_DRAIN )
61
+ sda_pin = Pin (sda_pin_number , Pin .OUT , Pin .OPEN_DRAIN )
61
62
62
- scl_pin = Pin (scl_pin_number , Pin .OUT )
63
- sda_pin = Pin (sda_pin_number , Pin .OUT )
63
+ # Set both lines high initially
64
+ scl_pin .value (1 )
65
+ sda_pin .value (1 )
66
+ sleep (0.001 ) # 1 millisecond delay to stabilize bus
67
+
68
+ # Pulse the SCL line 9 times to release any stuck device
69
+ for _ in range (9 ):
70
+ scl_pin .value (0 )
71
+ sleep (0.001 ) # 1 millisecond delay for each pulse
72
+ scl_pin .value (1 )
73
+ sleep (0.001 )
64
74
65
- period = 1 / _I2CHelper . frequency
75
+ # Ensure SDA is high before re-initializing
66
76
sda_pin .value (1 )
67
- for _ in range (0 , 20 ):
68
- scl_pin .value (1 )
69
- sleep (period / 2 ) # Add sleep to match the frequency
70
- scl_pin .value (0 )
71
- sleep (period / 2 ) # Add sleep to match the frequency
77
+ scl_pin .value (1 )
78
+ sleep (0.001 ) # 1 millisecond delay to stabilize bus
72
79
73
80
# Need to re-initialize the bus after resetting it
74
- # otherwise it gets stuck.
75
81
return I2C (interface , freq = _I2CHelper .frequency )
76
82
77
83
@staticmethod
0 commit comments