2626
2727#include "mpconfigport.h"
2828
29+ #include "py/nlr.h"
2930#include "py/obj.h"
3031
3132#include "common-hal/microcontroller/types.h"
@@ -40,18 +41,29 @@ extern void shared_module_bitbangio_spi_construct(bitbangio_spi_obj_t *self,
4041 const mcu_pin_obj_t * miso , uint32_t baudrate ) {
4142 digitalinout_result_t result = common_hal_nativeio_digitalinout_construct (& self -> clock , clock );
4243 if (result != DIGITALINOUT_OK ) {
43- return ;
44+ nlr_raise (mp_obj_new_exception_msg (& mp_type_ValueError ,
45+ "Clock pin init failed." ));
4446 }
45- result = common_hal_nativeio_digitalinout_construct (& self -> mosi , mosi );
46- if (result != DIGITALINOUT_OK ) {
47- common_hal_nativeio_digitalinout_deinit (& self -> clock );
48- return ;
47+ if (mosi != mp_const_none ) {
48+ result = common_hal_nativeio_digitalinout_construct (& self -> mosi , mosi );
49+ if (result != DIGITALINOUT_OK ) {
50+ common_hal_nativeio_digitalinout_deinit (& self -> clock );
51+ nlr_raise (mp_obj_new_exception_msg (& mp_type_ValueError ,
52+ "MOSI pin init failed." ));
53+ }
54+ self -> has_mosi = true;
4955 }
50- result = common_hal_nativeio_digitalinout_construct (& self -> miso , miso );
51- if (result != DIGITALINOUT_OK ) {
52- common_hal_nativeio_digitalinout_deinit (& self -> clock );
53- common_hal_nativeio_digitalinout_deinit (& self -> mosi );
54- return ;
56+ if (miso != mp_const_none ) {
57+ result = common_hal_nativeio_digitalinout_construct (& self -> miso , miso );
58+ if (result != DIGITALINOUT_OK ) {
59+ common_hal_nativeio_digitalinout_deinit (& self -> clock );
60+ if (mosi != mp_const_none ) {
61+ common_hal_nativeio_digitalinout_deinit (& self -> mosi );
62+ }
63+ nlr_raise (mp_obj_new_exception_msg (& mp_type_ValueError ,
64+ "MISO pin init failed." ));
65+ }
66+ self -> has_miso = true;
5567 }
5668
5769 self -> delay_half = 500000 / baudrate ;
@@ -66,13 +78,25 @@ extern void shared_module_bitbangio_spi_construct(bitbangio_spi_obj_t *self,
6678
6779extern void shared_module_bitbangio_spi_deinit (bitbangio_spi_obj_t * self ) {
6880 common_hal_nativeio_digitalinout_deinit (& self -> clock );
69- common_hal_nativeio_digitalinout_deinit (& self -> mosi );
70- common_hal_nativeio_digitalinout_deinit (& self -> miso );
81+ if (self -> has_mosi ) {
82+ common_hal_nativeio_digitalinout_deinit (& self -> mosi );
83+ }
84+ if (self -> has_miso ) {
85+ common_hal_nativeio_digitalinout_deinit (& self -> miso );
86+ }
7187}
7288
7389bool shared_module_bitbangio_spi_transfer (bitbangio_spi_obj_t * self ,
7490 const uint8_t * write_buffer , size_t write_buffer_len ,
7591 uint8_t * read_buffer , size_t read_buffer_len ) {
92+ if (write_buffer_len > 0 && !self -> has_mosi ) {
93+ nlr_raise (mp_obj_new_exception_msg (& mp_type_ValueError ,
94+ "Cannot write without MOSI pin." ));
95+ }
96+ if (read_buffer_len > 0 && !self -> has_miso ) {
97+ nlr_raise (mp_obj_new_exception_msg (& mp_type_ValueError ,
98+ "Cannot read without MISO pin." ));
99+ }
76100 uint32_t delay_half = self -> delay_half ;
77101
78102 // only MSB transfer is implemented
@@ -95,7 +119,9 @@ bool shared_module_bitbangio_spi_transfer(bitbangio_spi_obj_t *self,
95119 }
96120
97121 // Clock out zeroes while we read.
98- common_hal_nativeio_digitalinout_set_value (& self -> mosi , false);
122+ if (self -> has_mosi ) {
123+ common_hal_nativeio_digitalinout_set_value (& self -> mosi , false);
124+ }
99125 for (size_t i = 0 ; i < read_buffer_len ; ++ i ) {
100126 uint8_t data_in = 0 ;
101127 for (int j = 0 ; j < 8 ; ++ j , data_out <<= 1 ) {
@@ -135,7 +161,9 @@ bool shared_module_bitbangio_spi_transfer(bitbangio_spi_obj_t *self,
135161 MICROPY_EVENT_POLL_HOOK ;
136162 #endif
137163 }
138- common_hal_nativeio_digitalinout_set_value (& self -> mosi , false);
164+ if (self -> has_mosi ) {
165+ common_hal_nativeio_digitalinout_set_value (& self -> mosi , false);
166+ }
139167 for (size_t i = 0 ; i < read_buffer_len ; ++ i ) {
140168 uint8_t data_in = 0 ;
141169 for (int j = 0 ; j < 8 ; ++ j ) {
0 commit comments