2121#include "samd/dma.h"
2222#include "samd/sercom.h"
2323
24- void setup_pin (const mcu_pin_obj_t * pin , uint32_t pinmux );
24+
25+ static void setup_pin (const mcu_pin_obj_t * pin , uint32_t pinmux , const enum gpio_direction direction ) {
26+ gpio_set_pin_direction (pin -> number , direction );
27+ gpio_set_pin_pull_mode (pin -> number , GPIO_PULL_OFF );
28+ gpio_set_pin_function (pin -> number , pinmux );
29+ if (direction == GPIO_DIRECTION_OUT ) {
30+ // Use strong drive strength for SPI outputs.
31+ hri_port_set_PINCFG_DRVSTR_bit (PORT , (enum gpio_port )GPIO_PORT (pin -> number ), GPIO_PIN (pin -> number ));
32+ }
33+ claim_pin (pin );
34+ }
2535
2636void common_hal_busio_spi_construct (busio_spi_obj_t * self ,
2737 const mcu_pin_obj_t * clock , const mcu_pin_obj_t * mosi ,
@@ -128,6 +138,7 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self,
128138 // Pads must be set after spi_m_sync_init(), which uses default values from
129139 // the prototypical SERCOM.
130140
141+ // Set to SPI host mode and choose pads.
131142 hri_sercomspi_write_CTRLA_MODE_bf (sercom , 3 );
132143 hri_sercomspi_write_CTRLA_DOPO_bf (sercom , dopo );
133144 hri_sercomspi_write_CTRLA_DIPO_bf (sercom , miso_pad );
@@ -141,20 +152,20 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self,
141152 mp_raise_OSError (MP_EIO );
142153 }
143154
144- setup_pin (clock , clock_pinmux );
155+ setup_pin (clock , clock_pinmux , GPIO_DIRECTION_OUT );
145156 self -> clock_pin = clock -> number ;
146157
147158 if (mosi_none ) {
148159 self -> MOSI_pin = NO_PIN ;
149160 } else {
150- setup_pin (mosi , mosi_pinmux );
161+ setup_pin (mosi , mosi_pinmux , GPIO_DIRECTION_OUT );
151162 self -> MOSI_pin = mosi -> number ;
152163 }
153164
154165 if (miso_none ) {
155166 self -> MISO_pin = NO_PIN ;
156167 } else {
157- setup_pin (miso , miso_pinmux );
168+ setup_pin (miso , miso_pinmux , GPIO_DIRECTION_IN );
158169 self -> MISO_pin = miso -> number ;
159170 }
160171
@@ -317,11 +328,3 @@ uint8_t common_hal_busio_spi_get_polarity(busio_spi_obj_t *self) {
317328 void * hw = self -> spi_desc .dev .prvt ;
318329 return hri_sercomspi_get_CTRLA_CPOL_bit (hw );
319330}
320-
321- void setup_pin (const mcu_pin_obj_t * pin , uint32_t pinmux ) {
322- gpio_set_pin_direction (pin -> number , GPIO_DIRECTION_OUT );
323- gpio_set_pin_pull_mode (pin -> number , GPIO_PULL_OFF );
324- gpio_set_pin_function (pin -> number , pinmux );
325- claim_pin (pin );
326- hri_port_set_PINCFG_DRVSTR_bit (PORT , (enum gpio_port )GPIO_PORT (pin -> number ), GPIO_PIN (pin -> number ));
327- }
0 commit comments