42
42
#include "samd/sercom.h"
43
43
44
44
void 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 ) {
47
46
Sercom * sercom = NULL ;
48
47
uint8_t sercom_index ;
49
48
uint32_t clock_pinmux = 0 ;
50
49
bool mosi_none = mosi == NULL ;
51
50
bool miso_none = miso == NULL ;
52
51
uint32_t mosi_pinmux = 0 ;
53
52
uint32_t miso_pinmux = 0 ;
54
- uint32_t ss_pinmux = 0 ;
55
53
uint8_t clock_pad = 0 ;
56
54
uint8_t mosi_pad = 0 ;
57
55
uint8_t miso_pad = 0 ;
@@ -96,87 +94,36 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self,
96
94
if (!samd_peripherals_valid_spi_clock_pad (clock_pad )) {
97
95
continue ;
98
96
}
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
124
106
}
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 ;
142
110
}
143
- }
144
- if (sercom != NULL ) {
145
- break ;
111
+ } else {
112
+ continue ;
146
113
}
147
114
}
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 ;
175
122
}
176
123
}
177
- if ( sercom != NULL ) {
178
- break ;
179
- }
124
+ }
125
+ if ( sercom != NULL ) {
126
+ break ;
180
127
}
181
128
}
182
129
if (sercom != NULL ) {
@@ -198,11 +145,9 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self,
198
145
// Pads must be set after spi_m_sync_init(), which uses default values from
199
146
// the prototypical SERCOM.
200
147
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 );
203
149
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 );
206
151
207
152
// Always start at 250khz which is what SD cards need. They are sensitive to
208
153
// 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,
213
158
mp_raise_OSError (MP_EIO );
214
159
}
215
160
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 );
217
162
gpio_set_pin_pull_mode (clock -> number , GPIO_PULL_OFF );
218
163
gpio_set_pin_function (clock -> number , clock_pinmux );
219
164
claim_pin (clock );
@@ -222,7 +167,7 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self,
222
167
if (mosi_none ) {
223
168
self -> MOSI_pin = NO_PIN ;
224
169
} 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 );
226
171
gpio_set_pin_pull_mode (mosi -> number , GPIO_PULL_OFF );
227
172
gpio_set_pin_function (mosi -> number , mosi_pinmux );
228
173
self -> MOSI_pin = mosi -> number ;
@@ -232,21 +177,13 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self,
232
177
if (miso_none ) {
233
178
self -> MISO_pin = NO_PIN ;
234
179
} 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 );
236
181
gpio_set_pin_pull_mode (miso -> number , GPIO_PULL_OFF );
237
182
gpio_set_pin_function (miso -> number , miso_pinmux );
238
183
self -> MISO_pin = miso -> number ;
239
184
claim_pin (miso );
240
185
}
241
186
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
-
250
187
self -> running_dma .failure = 1 ; // not started
251
188
252
189
spi_m_sync_enable (& self -> spi_desc );
0 commit comments