17
17
18
18
#include "hal/include/hal_gpio.h"
19
19
#include "hal/include/hal_spi_m_sync.h"
20
- #include "hal/include/hpl_spi_m_sync.h"
21
20
22
21
#include "samd/dma.h"
23
22
#include "samd/sercom.h"
24
23
24
+ void setup_pin (const mcu_pin_obj_t * pin , uint32_t pinmux );
25
+
25
26
void common_hal_busio_spi_construct (busio_spi_obj_t * self ,
26
27
const mcu_pin_obj_t * clock , const mcu_pin_obj_t * mosi ,
27
28
const mcu_pin_obj_t * miso , bool half_duplex ) {
@@ -76,6 +77,7 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self,
76
77
if (!samd_peripherals_valid_spi_clock_pad (clock_pad )) {
77
78
continue ;
78
79
}
80
+ // find mosi_pad first, since it corresponds to dopo which takes limited values
79
81
for (int j = 0 ; j < NUM_SERCOMS_PER_PIN ; j ++ ) {
80
82
if (!mosi_none ) {
81
83
if (sercom_index == mosi -> sercom [j ].index ) {
@@ -125,6 +127,8 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self,
125
127
126
128
// Pads must be set after spi_m_sync_init(), which uses default values from
127
129
// the prototypical SERCOM.
130
+
131
+ hri_sercomspi_write_CTRLA_MODE_bf (sercom , 3 );
128
132
hri_sercomspi_write_CTRLA_DOPO_bf (sercom , dopo );
129
133
hri_sercomspi_write_CTRLA_DIPO_bf (sercom , miso_pad );
130
134
@@ -137,30 +141,21 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self,
137
141
mp_raise_OSError (MP_EIO );
138
142
}
139
143
140
- gpio_set_pin_direction (clock -> number , GPIO_DIRECTION_OUT );
141
- gpio_set_pin_pull_mode (clock -> number , GPIO_PULL_OFF );
142
- gpio_set_pin_function (clock -> number , clock_pinmux );
143
- claim_pin (clock );
144
+ setup_pin (clock , clock_pinmux );
144
145
self -> clock_pin = clock -> number ;
145
146
146
147
if (mosi_none ) {
147
148
self -> MOSI_pin = NO_PIN ;
148
149
} else {
149
- gpio_set_pin_direction (mosi -> number , GPIO_DIRECTION_OUT );
150
- gpio_set_pin_pull_mode (mosi -> number , GPIO_PULL_OFF );
151
- gpio_set_pin_function (mosi -> number , mosi_pinmux );
150
+ setup_pin (mosi , mosi_pinmux );
152
151
self -> MOSI_pin = mosi -> number ;
153
- claim_pin (mosi );
154
152
}
155
153
156
154
if (miso_none ) {
157
155
self -> MISO_pin = NO_PIN ;
158
156
} else {
159
- gpio_set_pin_direction (miso -> number , GPIO_DIRECTION_IN );
160
- gpio_set_pin_pull_mode (miso -> number , GPIO_PULL_OFF );
161
- gpio_set_pin_function (miso -> number , miso_pinmux );
157
+ setup_pin (miso , miso_pinmux );
162
158
self -> MISO_pin = miso -> number ;
163
- claim_pin (miso );
164
159
}
165
160
166
161
spi_m_sync_enable (& self -> spi_desc );
@@ -322,3 +317,11 @@ uint8_t common_hal_busio_spi_get_polarity(busio_spi_obj_t *self) {
322
317
void * hw = self -> spi_desc .dev .prvt ;
323
318
return hri_sercomspi_get_CTRLA_CPOL_bit (hw );
324
319
}
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