@@ -57,6 +57,7 @@ typedef struct {
5757
5858static const board_i2c_pin_t i2c_pin [CIRCUITPY_BOARD_I2C ] = CIRCUITPY_BOARD_I2C_PIN ;
5959static busio_i2c_obj_t i2c_obj [CIRCUITPY_BOARD_I2C ];
60+ static bool i2c_obj_created [CIRCUITPY_BOARD_I2C ];
6061
6162bool common_hal_board_is_i2c (mp_obj_t obj ) {
6263 for (uint8_t instance = 0 ; instance < CIRCUITPY_BOARD_I2C ; instance ++ ) {
@@ -68,7 +69,7 @@ bool common_hal_board_is_i2c(mp_obj_t obj) {
6869}
6970
7071mp_obj_t common_hal_board_get_i2c (const mp_int_t instance ) {
71- return & i2c_obj [instance ];
72+ return i2c_obj_created [ instance ] ? & i2c_obj [instance ] : NULL ;
7273}
7374
7475mp_obj_t common_hal_board_create_i2c (const mp_int_t instance ) {
@@ -85,6 +86,7 @@ mp_obj_t common_hal_board_create_i2c(const mp_int_t instance) {
8586
8687 common_hal_busio_i2c_construct (self , i2c_pin [instance ].scl , i2c_pin [instance ].sda , 100000 , 255 );
8788
89+ i2c_obj_created [instance ] = true;
8890 return & i2c_obj [instance ];
8991}
9092#endif
@@ -101,6 +103,7 @@ typedef struct {
101103
102104static const board_spi_pin_t spi_pin [CIRCUITPY_BOARD_SPI ] = CIRCUITPY_BOARD_SPI_PIN ;
103105static busio_spi_obj_t spi_obj [CIRCUITPY_BOARD_SPI ];
106+ static bool spi_obj_created [CIRCUITPY_BOARD_SPI ];
104107
105108bool common_hal_board_is_spi (mp_obj_t obj ) {
106109 for (uint8_t instance = 0 ; instance < CIRCUITPY_BOARD_SPI ; instance ++ ) {
@@ -112,7 +115,7 @@ bool common_hal_board_is_spi(mp_obj_t obj) {
112115}
113116
114117mp_obj_t common_hal_board_get_spi (const mp_int_t instance ) {
115- return & spi_obj [instance ];
118+ return spi_obj_created [ instance ] ? & spi_obj [instance ] : NULL ;
116119}
117120
118121mp_obj_t common_hal_board_create_spi (const mp_int_t instance ) {
@@ -130,6 +133,7 @@ mp_obj_t common_hal_board_create_spi(const mp_int_t instance) {
130133
131134 common_hal_busio_spi_construct (self , spi_pin [instance ].clock , spi_pin [instance ].mosi , spi_pin [instance ].miso );
132135
136+ spi_obj_created [instance ] = true;
133137 return & spi_obj [instance ];
134138}
135139#endif
@@ -143,6 +147,7 @@ typedef struct {
143147
144148static const board_uart_pin_t uart_pin [CIRCUITPY_BOARD_UART ] = CIRCUITPY_BOARD_UART_PIN ;
145149static busio_uart_obj_t uart_obj [CIRCUITPY_BOARD_UART ];
150+ static bool uart_obj_created [CIRCUITPY_BOARD_UART ];
146151
147152bool common_hal_board_is_uart (mp_obj_t obj ) {
148153 for (uint8_t instance = 0 ; instance < CIRCUITPY_BOARD_UART ; instance ++ ) {
@@ -154,7 +159,7 @@ bool common_hal_board_is_uart(mp_obj_t obj) {
154159}
155160
156161mp_obj_t common_hal_board_get_uart (const mp_int_t instance ) {
157- return & uart_obj [instance ];
162+ return uart_obj_created [ instance ] ? & uart_obj [instance ] : NULL ;
158163}
159164
160165mp_obj_t common_hal_board_create_uart (const mp_int_t instance ) {
@@ -174,6 +179,7 @@ mp_obj_t common_hal_board_create_uart(const mp_int_t instance) {
174179 common_hal_busio_uart_construct (self , uart_pin [instance ].tx , uart_pin [instance ].rx ,
175180 NULL , NULL , NULL , false, 9600 , 8 , BUSIO_UART_PARITY_NONE , 1 , 1.0f , 64 , NULL , false);
176181
182+ uart_obj_created [instance ] = true;
177183 return & uart_obj [instance ];
178184}
179185#endif
@@ -190,11 +196,12 @@ void reset_board_buses(void) {
190196 }
191197 }
192198 #endif
193- if (! common_hal_busio_i2c_deinited ( & i2c_obj [instance ]) ) {
199+ if (i2c_obj_created [instance ]) {
194200 // make sure I2C lock is not held over a soft reset
195201 common_hal_busio_i2c_unlock (& i2c_obj [instance ]);
196202 if (!display_using_i2c ) {
197203 common_hal_busio_i2c_deinit (& i2c_obj [instance ]);
204+ i2c_obj_created [instance ] = false;
198205 }
199206 }
200207 }
@@ -217,18 +224,22 @@ void reset_board_buses(void) {
217224 #endif
218225 }
219226 #endif
220- if (! common_hal_busio_spi_deinited ( & spi_obj [instance ]) ) {
227+ if (spi_obj_created [instance ]) {
221228 // make sure SPI lock is not held over a soft reset
222229 common_hal_busio_spi_unlock (& spi_obj [instance ]);
223230 if (!display_using_spi ) {
224231 common_hal_busio_spi_deinit (& spi_obj [instance ]);
232+ spi_obj_created [instance ] = false;
225233 }
226234 }
227235 }
228236 #endif
229237 #if CIRCUITPY_BOARD_UART
230238 for (uint8_t instance = 0 ; instance < CIRCUITPY_BOARD_UART ; instance ++ ) {
231- common_hal_busio_uart_deinit (& uart_obj [instance ]);
239+ if (uart_obj_created [instance ]) {
240+ common_hal_busio_uart_deinit (& uart_obj [instance ]);
241+ uart_obj_created [instance ] = false;
242+ }
232243 }
233244 #endif
234245}
0 commit comments