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