33
33
#include "extmod/modmachine.h"
34
34
#include "samd_soc.h"
35
35
#include "pin_af.h"
36
+ #include "genhdr/pins.h"
36
37
#include "clock_config.h"
37
38
38
39
#define DEFAULT_SPI_BAUDRATE (1000000)
@@ -82,8 +83,15 @@ void common_spi_irq_handler(int spi_id) {
82
83
83
84
static void machine_spi_print (const mp_print_t * print , mp_obj_t self_in , mp_print_kind_t kind ) {
84
85
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
+ }
87
95
}
88
96
89
97
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
96
104
{ MP_QSTR_firstbit , MP_ARG_INT , {.u_int = -1 } },
97
105
{ MP_QSTR_sck , MP_ARG_KW_ONLY | MP_ARG_OBJ , {.u_rom_obj = MP_ROM_NONE } },
98
106
{ 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 ) } },
100
108
};
101
109
102
110
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
132
140
if (args [ARG_mosi ].u_obj != mp_const_none ) {
133
141
self -> mosi = mp_hal_get_pin_obj (args [ARG_mosi ].u_obj );
134
142
}
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 );
137
145
}
138
-
139
146
// Initialise the SPI peripheral if any arguments given, or it was not initialised previously.
140
147
if (n_args > 0 || kw_args -> used > 0 || self -> new ) {
141
148
self -> new = false;
142
149
150
+ if (self -> sck == 0xff || self -> mosi == 0xff ) {
151
+ mp_raise_ValueError (MP_ERROR_TEXT ("missing sck/mosi" ));
152
+ }
143
153
// Get the pad and alt-fct numbers.
144
154
self -> sck_pad_config = get_sercom_config (self -> sck , self -> id );
145
155
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
155
165
} else if (self -> mosi_pad_config .pad_nr == 0 && self -> sck_pad_config .pad_nr == 3 ) {
156
166
dopo = 3 ;
157
167
} 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 " ));
159
169
}
160
170
#elif defined(MCU_SAMD51 )
161
171
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
232
242
}
233
243
234
244
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);
236
246
237
247
// 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
+ }
239
255
if (spi_id < 0 || spi_id > SERCOM_INST_NUM ) {
240
256
mp_raise_msg_varg (& mp_type_ValueError , MP_ERROR_TEXT ("SPI(%d) doesn't exist" ), spi_id );
241
257
}
@@ -247,16 +263,23 @@ static mp_obj_t machine_spi_make_new(const mp_obj_type_t *type, size_t n_args, s
247
263
self -> polarity = DEFAULT_SPI_POLARITY ;
248
264
self -> phase = DEFAULT_SPI_PHASE ;
249
265
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
250
272
self -> mosi = 0xff ; // 0xff: pin not defined (yet)
251
273
self -> miso = 0xff ;
252
274
self -> sck = 0xff ;
275
+ #endif
253
276
254
277
self -> new = true;
255
278
MP_STATE_PORT (sercom_table [spi_id ]) = self ;
256
279
257
280
mp_map_t kw_args ;
258
281
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 );
260
283
return self ;
261
284
}
262
285
0 commit comments