@@ -58,7 +58,7 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self,
5858 uint8_t dopo = 255 ;
5959
6060 if (half_duplex ) {
61- mp_raise_NotImplementedError (MP_ERROR_TEXT ("Half duplex SPI is not implemented" ));
61+ mp_raise_NotImplementedError (MP_ERROR_TEXT ("Half duplex SPI is not implemented but true " ));
6262 }
6363
6464 // Ensure the object starts in its deinit state.
@@ -145,10 +145,12 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self,
145145
146146 // Pads must be set after spi_m_sync_init(), which uses default values from
147147 // the prototypical SERCOM.
148- uint32_t SPI_CONFIG_OFFSETS [] = {0x40003000 , 0x40003400 , 0x43000000 , 0x43000400 , 0x43000800 , 0x43000C00 };
149- if (slave_mode ) {
150- * ((uint32_t * ) SPI_CONFIG_OFFSETS [sercom_index ]) &= ~(1 <<2 );
151- }
148+
149+ // hri_sercomspi_write_CTRLA_MODE_bf(sercom, slave_mode ? 2 : 3); // this line makes circuitpython crash on a call to "mySpi.write()"
150+ // uint32_t SPI_CONFIG_OFFSETS[] = {0x40003000, 0x40003400, 0x43000000, 0x43000400, 0x43000800, 0x43000C00};
151+ // if (slave_mode) {
152+ // *((uint32_t*) SPI_CONFIG_OFFSETS[sercom_index]) &= ~(1<<2);
153+ // }
152154 hri_sercomspi_write_CTRLA_DOPO_bf (sercom , dopo );
153155 hri_sercomspi_write_CTRLA_DIPO_bf (sercom , miso_pad );
154156
@@ -161,7 +163,7 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self,
161163 mp_raise_OSError (MP_EIO );
162164 }
163165
164- gpio_set_pin_direction (clock -> number , GPIO_DIRECTION_OUT );
166+ gpio_set_pin_direction (clock -> number , slave_mode ? GPIO_DIRECTION_IN : GPIO_DIRECTION_OUT );
165167 gpio_set_pin_pull_mode (clock -> number , GPIO_PULL_OFF );
166168 gpio_set_pin_function (clock -> number , clock_pinmux );
167169 claim_pin (clock );
@@ -170,7 +172,7 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self,
170172 if (mosi_none ) {
171173 self -> MOSI_pin = NO_PIN ;
172174 } else {
173- gpio_set_pin_direction (mosi -> number , GPIO_DIRECTION_OUT );
175+ gpio_set_pin_direction (mosi -> number , slave_mode ? GPIO_DIRECTION_IN : GPIO_DIRECTION_OUT );
174176 gpio_set_pin_pull_mode (mosi -> number , GPIO_PULL_OFF );
175177 gpio_set_pin_function (mosi -> number , mosi_pinmux );
176178 self -> MOSI_pin = mosi -> number ;
@@ -180,7 +182,7 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self,
180182 if (miso_none ) {
181183 self -> MISO_pin = NO_PIN ;
182184 } else {
183- gpio_set_pin_direction (miso -> number , GPIO_DIRECTION_IN );
185+ gpio_set_pin_direction (miso -> number , slave_mode ? GPIO_DIRECTION_OUT : GPIO_DIRECTION_IN );
184186 gpio_set_pin_pull_mode (miso -> number , GPIO_PULL_OFF );
185187 gpio_set_pin_function (miso -> number , miso_pinmux );
186188 self -> MISO_pin = miso -> number ;
0 commit comments