Content-Length: 483820 | pFad | http://github.com/micropython/micropython/commit/62ed69b016d98167db01c5283758bfde95c6aec9

FF samd/machine_spi: Support default instance and SCK/MOSI/MISO pin values. · micropython/micropython@62ed69b · GitHub
Skip to content

Commit 62ed69b

Browse files
robert-hhdpgeorge
authored andcommitted
samd/machine_spi: Support default instance and SCK/MOSI/MISO pin values.
If a board configures a default SPI instance and/or SCK/MOSI/MISO pins, then the user can create a default SPI object using `machine.SPI()`. Also, if MISO is not going to be used, then MISO can be set to `None` with `miso=None`. Signed-off-by: robert-hh <robert@hammelrath.com>
1 parent 213f1c1 commit 62ed69b

File tree

1 file changed

+33
-10
lines changed

1 file changed

+33
-10
lines changed

ports/samd/machine_spi.c

+33-10
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include "extmod/modmachine.h"
3434
#include "samd_soc.h"
3535
#include "pin_af.h"
36+
#include "genhdr/pins.h"
3637
#include "clock_config.h"
3738

3839
#define DEFAULT_SPI_BAUDRATE (1000000)
@@ -82,8 +83,15 @@ void common_spi_irq_handler(int spi_id) {
8283

8384
static void machine_spi_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
8485
machine_spi_obj_t *self = MP_OBJ_TO_PTR(self_in);
85-
mp_printf(print, "SPI(%u, baudrate=%u, firstbit=%u, polarity=%u, phase=%u, bits=8)",
86-
self->id, self->baudrate, self->firstbit, self->polarity, self->phase);
86+
mp_printf(print, "SPI(%u, baudrate=%u, firstbit=%u, polarity=%u, phase=%u, bits=8,"
87+
" sck=\"%q\", mosi=\"%q\", miso=",
88+
self->id, self->baudrate, self->firstbit, self->polarity, self->phase,
89+
pin_find_by_id(self->sck)->name, pin_find_by_id(self->mosi)->name);
90+
if (self->miso == 0xff) {
91+
mp_printf(print, "None)");
92+
} else {
93+
mp_printf(print, "\"%q\")", pin_find_by_id(self->miso)->name);
94+
}
8795
}
8896

8997
static void machine_spi_init(mp_obj_base_t *self_in, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
@@ -96,7 +104,7 @@ static void machine_spi_init(mp_obj_base_t *self_in, size_t n_args, const mp_obj
96104
{ MP_QSTR_firstbit, MP_ARG_INT, {.u_int = -1} },
97105
{ MP_QSTR_sck, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} },
98106
{ MP_QSTR_mosi, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} },
99-
{ MP_QSTR_miso, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} },
107+
{ MP_QSTR_miso, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_INT(-1)} },
100108
};
101109

102110
machine_spi_obj_t *self = MP_OBJ_TO_PTR(self_in);
@@ -132,14 +140,16 @@ static void machine_spi_init(mp_obj_base_t *self_in, size_t n_args, const mp_obj
132140
if (args[ARG_mosi].u_obj != mp_const_none) {
133141
self->mosi = mp_hal_get_pin_obj(args[ARG_mosi].u_obj);
134142
}
135-
if (args[ARG_miso].u_obj != mp_const_none) {
136-
self->miso = mp_hal_get_pin_obj(args[ARG_miso].u_obj);
143+
if (args[ARG_miso].u_obj != MP_ROM_INT(-1)) {
144+
self->miso = args[ARG_miso].u_obj == mp_const_none ? 0xff : mp_hal_get_pin_obj(args[ARG_miso].u_obj);
137145
}
138-
139146
// Initialise the SPI peripheral if any arguments given, or it was not initialised previously.
140147
if (n_args > 0 || kw_args->used > 0 || self->new) {
141148
self->new = false;
142149

150+
if (self->sck == 0xff || self->mosi == 0xff) {
151+
mp_raise_ValueError(MP_ERROR_TEXT("missing sck/mosi"));
152+
}
143153
// Get the pad and alt-fct numbers.
144154
self->sck_pad_config = get_sercom_config(self->sck, self->id);
145155
self->mosi_pad_config = get_sercom_config(self->mosi, self->id);
@@ -155,7 +165,7 @@ static void machine_spi_init(mp_obj_base_t *self_in, size_t n_args, const mp_obj
155165
} else if (self->mosi_pad_config.pad_nr == 0 && self->sck_pad_config.pad_nr == 3) {
156166
dopo = 3;
157167
} else {
158-
mp_raise_ValueError(MP_ERROR_TEXT("invalid pin for sck or mosi"));
168+
mp_raise_ValueError(MP_ERROR_TEXT("invalid sck/mosi pin"));
159169
}
160170
#elif defined(MCU_SAMD51)
161171
if (self->mosi_pad_config.pad_nr == 0 && self->sck_pad_config.pad_nr == 1) {
@@ -232,10 +242,16 @@ static void machine_spi_init(mp_obj_base_t *self_in, size_t n_args, const mp_obj
232242
}
233243

234244
static mp_obj_t machine_spi_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
235-
mp_arg_check_num(n_args, n_kw, 1, MP_OBJ_FUN_ARGS_MAX, true);
245+
mp_arg_check_num(n_args, n_kw, MICROPY_HW_DEFAULT_SPI_ID < 0 ? 1 : 0, MP_OBJ_FUN_ARGS_MAX, true);
236246

237247
// Get SPI bus.
238-
int spi_id = mp_obj_get_int(args[0]);
248+
int spi_id = MICROPY_HW_DEFAULT_SPI_ID;
249+
250+
if (n_args > 0) {
251+
spi_id = mp_obj_get_int(args[0]);
252+
n_args--;
253+
args++;
254+
}
239255
if (spi_id < 0 || spi_id > SERCOM_INST_NUM) {
240256
mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("SPI(%d) doesn't exist"), spi_id);
241257
}
@@ -247,16 +263,23 @@ static mp_obj_t machine_spi_make_new(const mp_obj_type_t *type, size_t n_args, s
247263
self->polarity = DEFAULT_SPI_POLARITY;
248264
self->phase = DEFAULT_SPI_PHASE;
249265
self->firstbit = DEFAULT_SPI_FIRSTBIT;
266+
#if defined(pin_SCK) && defined(pin_MOSI) && defined(pin_MISO)
267+
// Initialize with the default pins
268+
self->sck = mp_hal_get_pin_obj((mp_obj_t)pin_SCK);
269+
self->mosi = mp_hal_get_pin_obj((mp_obj_t)pin_MOSI);
270+
self->miso = mp_hal_get_pin_obj((mp_obj_t)pin_MISO);
271+
#else
250272
self->mosi = 0xff; // 0xff: pin not defined (yet)
251273
self->miso = 0xff;
252274
self->sck = 0xff;
275+
#endif
253276

254277
self->new = true;
255278
MP_STATE_PORT(sercom_table[spi_id]) = self;
256279

257280
mp_map_t kw_args;
258281
mp_map_init_fixed_table(&kw_args, n_kw, args + n_args);
259-
machine_spi_init((mp_obj_base_t *)self, n_args - 1, args + 1, &kw_args);
282+
machine_spi_init((mp_obj_base_t *)self, n_args, args, &kw_args);
260283
return self;
261284
}
262285

0 commit comments

Comments
 (0)








ApplySandwichStrip

pFad - (p)hone/(F)rame/(a)nonymizer/(d)eclutterfier!      Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

Fetched URL: http://github.com/micropython/micropython/commit/62ed69b016d98167db01c5283758bfde95c6aec9

Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy