Skip to content

Commit 0a68f43

Browse files
remove busio.SPI
1 parent 1875e70 commit 0a68f43

File tree

3 files changed

+33
-111
lines changed

3 files changed

+33
-111
lines changed

ports/atmel-samd/common-hal/busio/SPI.c

Lines changed: 30 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -42,16 +42,14 @@
4242
#include "samd/sercom.h"
4343

4444
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) {
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);

ports/atmel-samd/common-hal/busio/SPI.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,6 @@ typedef struct {
4040
uint8_t clock_pin;
4141
uint8_t MOSI_pin;
4242
uint8_t MISO_pin;
43-
uint8_t SS_pin;
44-
bool slave_mode;
4543
dma_descr_t running_dma;
4644
} busio_spi_obj_t;
4745

shared-bindings/busio/SPI.c

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,7 @@
7373
//| clock: microcontroller.Pin,
7474
//| MOSI: Optional[microcontroller.Pin] = None,
7575
//| MISO: Optional[microcontroller.Pin] = None,
76-
//| SS: Optional[microcontroller.Pin] = None,
77-
//| half_duplex: bool = False,
78-
//| slave_mode: bool = False,
76+
//| half_duplex: bool = False
7977
//| ) -> None:
8078
//| """Construct an SPI object on the given pins.
8179
//|
@@ -98,10 +96,8 @@
9896
//| :param ~microcontroller.Pin MOSI: the Main Out Selected In pin.
9997
//| :param ~microcontroller.Pin MISO: the Main In Selected Out pin.
10098
//| :param bool half_duplex: True when MOSI is used for bidirectional data. False when SPI is full-duplex or simplex.
101-
//| :param-bool slave_mode: True when the chip is operating as a slave. False when the chip is operating as a master.
10299
//|
103100
//| **Limitations:** ``half_duplex`` is available only on STM; other chips do not have the hardware support.
104-
//| **Limitations:** ``slave_mode`` is available only on SAMD51; other chips do not have the firmware support.
105101
//| """
106102
//| ...
107103

@@ -110,34 +106,25 @@
110106
STATIC mp_obj_t busio_spi_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) {
111107
#if CIRCUITPY_BUSIO_SPI
112108
busio_spi_obj_t *self = mp_obj_malloc(busio_spi_obj_t, &busio_spi_type);
113-
enum { ARG_clock, ARG_MOSI, ARG_MISO, ARG_SS, ARG_half_duplex, ARG_slave_mode };
109+
enum { ARG_clock, ARG_MOSI, ARG_MISO, ARG_half_duplex };
114110
static const mp_arg_t allowed_args[] = {
115111
{ MP_QSTR_clock, MP_ARG_REQUIRED | MP_ARG_OBJ },
116112
{ MP_QSTR_MOSI, MP_ARG_OBJ, {.u_obj = mp_const_none} },
117113
{ MP_QSTR_MISO, MP_ARG_OBJ, {.u_obj = mp_const_none} },
118-
{ MP_QSTR_SS, MP_ARG_OBJ, {.u_obj = mp_const_none} },
119114
{ MP_QSTR_half_duplex, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = false} },
120-
{ MP_QSTR_slave_mode, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = false} },
121115
};
122116
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
123117
mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
124118

125119
const mcu_pin_obj_t *clock = validate_obj_is_free_pin(args[ARG_clock].u_obj, MP_QSTR_clock);
126120
const mcu_pin_obj_t *mosi = validate_obj_is_free_pin_or_none(args[ARG_MOSI].u_obj, MP_QSTR_mosi);
127121
const mcu_pin_obj_t *miso = validate_obj_is_free_pin_or_none(args[ARG_MISO].u_obj, MP_QSTR_miso);
128-
const mcu_pin_obj_t *ss = validate_obj_is_free_pin_or_none(args[ARG_SS].u_obj, MP_QSTR_ss);
129122

130123
if (!miso && !mosi) {
131124
mp_raise_ValueError(MP_ERROR_TEXT("Must provide MISO or MOSI pin"));
132125
}
133-
if (args[ARG_slave_mode].u_bool && !ss) {
134-
mp_raise_ValueError(MP_ERROR_TEXT("Must provide SS pin to operate in slave mode"));
135-
}
136-
if (!args[ARG_slave_mode].u_bool && ss) {
137-
mp_raise_ValueError(MP_ERROR_TEXT("Hardware SS pin only supported for slave mode"));
138-
}
139126

140-
common_hal_busio_spi_construct(self, clock, mosi, miso, ss, args[ARG_half_duplex].u_bool, args[ARG_slave_mode].u_bool);
127+
common_hal_busio_spi_construct(self, clock, mosi, miso, args[ARG_half_duplex].u_bool);
141128
return MP_OBJ_FROM_PTR(self);
142129
#else
143130
raise_ValueError_invalid_pins();

0 commit comments

Comments
 (0)