4242#include "samd/sercom.h"
4343
4444void common_hal_busio_spi_construct (busio_spi_obj_t * self ,
45- const mcu_pin_obj_t * clock , const mcu_pin_obj_t * mosi ,
46- const mcu_pin_obj_t * miso , const mcu_pin_obj_t * ss , bool half_duplex , bool slave_mode ) {
45+ const mcu_pin_obj_t * clock , const mcu_pin_obj_t * mosi , const mcu_pin_obj_t * miso , bool half_duplex ) {
4746 Sercom * sercom = NULL ;
4847 uint8_t sercom_index ;
4948 uint32_t clock_pinmux = 0 ;
5049 bool mosi_none = mosi == NULL ;
5150 bool miso_none = miso == NULL ;
5251 uint32_t mosi_pinmux = 0 ;
5352 uint32_t miso_pinmux = 0 ;
54- uint32_t ss_pinmux = 0 ;
5553 uint8_t clock_pad = 0 ;
5654 uint8_t mosi_pad = 0 ;
5755 uint8_t miso_pad = 0 ;
@@ -96,87 +94,36 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self,
9694 if (!samd_peripherals_valid_spi_clock_pad (clock_pad )) {
9795 continue ;
9896 }
99- if (slave_mode ) {
100- // find miso_pad first, since it corresponds to dopo which takes limited values
101- for (int j = 0 ; j < NUM_SERCOMS_PER_PIN ; j ++ ) {
102- if (!miso_none ) {
103- if (sercom_index == miso -> sercom [j ].index ) {
104- miso_pinmux = PINMUX (miso -> number , (j == 0 ) ? MUX_C : MUX_D );
105- miso_pad = miso -> sercom [j ].pad ;
106- dopo = samd_peripherals_get_spi_dopo (clock_pad , miso_pad );
107- if (dopo > 0x3 ) {
108- continue ; // pad combination not possible
109- }
110- if (mosi_none ) {
111- for (int m = 0 ; m < NUM_SERCOMS_PER_PIN ; m ++ ) {
112- if (sercom_index == ss -> sercom [m ].index ) {
113- ss_pinmux = PINMUX (ss -> number , (m == 0 ) ? MUX_C : MUX_D );
114- sercom = potential_sercom ;
115- break ;
116- }
117- }
118- if (sercom != NULL ) {
119- break ;
120- }
121- }
122- } else {
123- continue ;
97+ // find mosi_pad first, since it corresponds to dopo which takes limited values
98+ for (int j = 0 ; j < NUM_SERCOMS_PER_PIN ; j ++ ) {
99+ if (!mosi_none ) {
100+ if (sercom_index == mosi -> sercom [j ].index ) {
101+ mosi_pinmux = PINMUX (mosi -> number , (j == 0 ) ? MUX_C : MUX_D );
102+ mosi_pad = mosi -> sercom [j ].pad ;
103+ dopo = samd_peripherals_get_spi_dopo (clock_pad , mosi_pad );
104+ if (dopo > 0x3 ) {
105+ continue ; // pad combination not possible
124106 }
125- }
126- if (!mosi_none ) {
127- for (int k = 0 ; k < NUM_SERCOMS_PER_PIN ; k ++ ) {
128- if (sercom_index == mosi -> sercom [k ].index ) {
129- mosi_pinmux = PINMUX (mosi -> number , (k == 0 ) ? MUX_C : MUX_D );
130- mosi_pad = mosi -> sercom [k ].pad ;
131- for (int m = 0 ; m < NUM_SERCOMS_PER_PIN ; m ++ ) {
132- if (sercom_index == ss -> sercom [m ].index ) {
133- ss_pinmux = PINMUX (ss -> number , (m == 0 ) ? MUX_C : MUX_D );
134- sercom = potential_sercom ;
135- break ;
136- }
137- }
138- if (sercom != NULL ) {
139- break ;
140- }
141- }
107+ if (miso_none ) {
108+ sercom = potential_sercom ;
109+ break ;
142110 }
143- }
144- if (sercom != NULL ) {
145- break ;
111+ } else {
112+ continue ;
146113 }
147114 }
148- } else {
149- // find mosi_pad first, since it corresponds to dopo which takes limited values
150- for (int j = 0 ; j < NUM_SERCOMS_PER_PIN ; j ++ ) {
151- if (!mosi_none ) {
152- if (sercom_index == mosi -> sercom [j ].index ) {
153- mosi_pinmux = PINMUX (mosi -> number , (j == 0 ) ? MUX_C : MUX_D );
154- mosi_pad = mosi -> sercom [j ].pad ;
155- dopo = samd_peripherals_get_spi_dopo (clock_pad , mosi_pad );
156- if (dopo > 0x3 ) {
157- continue ; // pad combination not possible
158- }
159- if (miso_none ) {
160- sercom = potential_sercom ;
161- break ;
162- }
163- } else {
164- continue ;
165- }
166- }
167- if (!miso_none ) {
168- for (int k = 0 ; k < NUM_SERCOMS_PER_PIN ; k ++ ) {
169- if (sercom_index == miso -> sercom [k ].index ) {
170- miso_pinmux = PINMUX (miso -> number , (k == 0 ) ? MUX_C : MUX_D );
171- miso_pad = miso -> sercom [k ].pad ;
172- sercom = potential_sercom ;
173- break ;
174- }
115+ if (!miso_none ) {
116+ for (int k = 0 ; k < NUM_SERCOMS_PER_PIN ; k ++ ) {
117+ if (sercom_index == miso -> sercom [k ].index ) {
118+ miso_pinmux = PINMUX (miso -> number , (k == 0 ) ? MUX_C : MUX_D );
119+ miso_pad = miso -> sercom [k ].pad ;
120+ sercom = potential_sercom ;
121+ break ;
175122 }
176123 }
177- if ( sercom != NULL ) {
178- break ;
179- }
124+ }
125+ if ( sercom != NULL ) {
126+ break ;
180127 }
181128 }
182129 if (sercom != NULL ) {
@@ -198,11 +145,9 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self,
198145 // Pads must be set after spi_m_sync_init(), which uses default values from
199146 // the prototypical SERCOM.
200147
201- hri_sercomspi_write_CTRLA_MODE_bf (sercom , slave_mode ? 2 : 3 );
202- self -> slave_mode = slave_mode ;
148+ hri_sercomspi_write_CTRLA_MODE_bf (sercom , 3 );
203149 hri_sercomspi_write_CTRLA_DOPO_bf (sercom , dopo );
204- hri_sercomspi_write_CTRLA_DIPO_bf (sercom , slave_mode ? mosi_pad : miso_pad );
205- hri_sercomspi_write_CTRLB_PLOADEN_bit (sercom , slave_mode );
150+ hri_sercomspi_write_CTRLA_DIPO_bf (sercom , miso_pad );
206151
207152 // Always start at 250khz which is what SD cards need. They are sensitive to
208153 // SPI bus noise before they are put into SPI mode.
@@ -213,7 +158,7 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self,
213158 mp_raise_OSError (MP_EIO );
214159 }
215160
216- gpio_set_pin_direction (clock -> number , slave_mode ? GPIO_DIRECTION_IN : GPIO_DIRECTION_OUT );
161+ gpio_set_pin_direction (clock -> number , GPIO_DIRECTION_OUT );
217162 gpio_set_pin_pull_mode (clock -> number , GPIO_PULL_OFF );
218163 gpio_set_pin_function (clock -> number , clock_pinmux );
219164 claim_pin (clock );
@@ -222,7 +167,7 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self,
222167 if (mosi_none ) {
223168 self -> MOSI_pin = NO_PIN ;
224169 } else {
225- gpio_set_pin_direction (mosi -> number , slave_mode ? GPIO_DIRECTION_IN : GPIO_DIRECTION_OUT );
170+ gpio_set_pin_direction (mosi -> number , GPIO_DIRECTION_OUT );
226171 gpio_set_pin_pull_mode (mosi -> number , GPIO_PULL_OFF );
227172 gpio_set_pin_function (mosi -> number , mosi_pinmux );
228173 self -> MOSI_pin = mosi -> number ;
@@ -232,21 +177,13 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self,
232177 if (miso_none ) {
233178 self -> MISO_pin = NO_PIN ;
234179 } else {
235- gpio_set_pin_direction (miso -> number , slave_mode ? GPIO_DIRECTION_OUT : GPIO_DIRECTION_IN );
180+ gpio_set_pin_direction (miso -> number , GPIO_DIRECTION_IN );
236181 gpio_set_pin_pull_mode (miso -> number , GPIO_PULL_OFF );
237182 gpio_set_pin_function (miso -> number , miso_pinmux );
238183 self -> MISO_pin = miso -> number ;
239184 claim_pin (miso );
240185 }
241186
242- if (slave_mode ) {
243- gpio_set_pin_direction (ss -> number , slave_mode ? GPIO_DIRECTION_OUT : GPIO_DIRECTION_IN );
244- gpio_set_pin_pull_mode (ss -> number , GPIO_PULL_OFF );
245- gpio_set_pin_function (ss -> number , ss_pinmux );
246- self -> SS_pin = ss -> number ;
247- claim_pin (ss );
248- }
249-
250187 self -> running_dma .failure = 1 ; // not started
251188
252189 spi_m_sync_enable (& self -> spi_desc );
0 commit comments