@@ -53,7 +53,8 @@ void common_hal_busio_i2c_construct(busio_i2c_obj_t *self,
53
53
uint32_t sda_pinmux , scl_pinmux ;
54
54
55
55
// Ensure the object starts in its deinit state.
56
- self -> sda_pin = NO_PIN ;
56
+ common_hal_busio_i2c_mark_deinit (self );
57
+
57
58
Sercom * sercom = samd_i2c_get_sercom (scl , sda , & sercom_index , & sda_pinmux , & scl_pinmux );
58
59
if (sercom == NULL ) {
59
60
raise_ValueError_invalid_pins ();
@@ -108,21 +109,28 @@ void common_hal_busio_i2c_construct(busio_i2c_obj_t *self,
108
109
mp_arg_error_invalid (MP_QSTR_frequency );
109
110
}
110
111
112
+ if (i2c_m_sync_enable (& self -> i2c_desc ) != ERR_NONE ) {
113
+ common_hal_busio_i2c_deinit (self );
114
+ mp_raise_OSError (MP_EIO );
115
+ }
116
+
111
117
self -> sda_pin = sda -> number ;
112
118
self -> scl_pin = scl -> number ;
113
119
claim_pin (sda );
114
120
claim_pin (scl );
115
121
116
- if (i2c_m_sync_enable (& self -> i2c_desc ) != ERR_NONE ) {
117
- common_hal_busio_i2c_deinit (self );
118
- mp_raise_OSError (MP_EIO );
119
- }
122
+ // Prevent bulk sercom reset from resetting us. The finalizer will instead.
123
+ never_reset_sercom (self -> i2c_desc .device .hw );
120
124
}
121
125
122
126
bool common_hal_busio_i2c_deinited (busio_i2c_obj_t * self ) {
123
127
return self -> sda_pin == NO_PIN ;
124
128
}
125
129
130
+ void common_hal_busio_i2c_mark_deinit (busio_i2c_obj_t * self ) {
131
+ self -> sda_pin = NO_PIN ;
132
+ }
133
+
126
134
void common_hal_busio_i2c_deinit (busio_i2c_obj_t * self ) {
127
135
if (common_hal_busio_i2c_deinited (self )) {
128
136
return ;
@@ -133,8 +141,7 @@ void common_hal_busio_i2c_deinit(busio_i2c_obj_t *self) {
133
141
134
142
reset_pin_number (self -> sda_pin );
135
143
reset_pin_number (self -> scl_pin );
136
- self -> sda_pin = NO_PIN ;
137
- self -> scl_pin = NO_PIN ;
144
+ common_hal_busio_i2c_mark_deinit (self );
138
145
}
139
146
140
147
bool common_hal_busio_i2c_probe (busio_i2c_obj_t * self , uint8_t addr ) {
@@ -236,8 +243,6 @@ uint8_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint16_t addr,
236
243
}
237
244
238
245
void common_hal_busio_i2c_never_reset (busio_i2c_obj_t * self ) {
239
- never_reset_sercom (self -> i2c_desc .device .hw );
240
-
241
246
never_reset_pin_number (self -> scl_pin );
242
247
never_reset_pin_number (self -> sda_pin );
243
248
}
0 commit comments