34
34
#include "extmod/modmachine.h"
35
35
#include "samd_soc.h"
36
36
#include "pin_af.h"
37
+ #include "genhdr/pins.h"
37
38
#include "clock_config.h"
38
39
39
40
#define DEFAULT_I2C_FREQ (400000)
@@ -119,25 +120,34 @@ void common_i2c_irq_handler(int i2c_id) {
119
120
120
121
static void machine_i2c_print (const mp_print_t * print , mp_obj_t self_in , mp_print_kind_t kind ) {
121
122
machine_i2c_obj_t * self = MP_OBJ_TO_PTR (self_in );
122
- mp_printf (print , "I2C(%u, freq=%u, scl=%u , sda=%u )" ,
123
- self -> id , self -> freq , self -> scl , self -> sda );
123
+ mp_printf (print , "I2C(%u, freq=%u, scl=\"%q\" , sda=\"%q\" )" ,
124
+ self -> id , self -> freq , pin_find_by_id ( self -> scl ) -> name , pin_find_by_id ( self -> sda ) -> name );
124
125
}
125
126
126
127
mp_obj_t machine_i2c_make_new (const mp_obj_type_t * type , size_t n_args , size_t n_kw , const mp_obj_t * all_args ) {
127
128
enum { ARG_id , ARG_freq , ARG_scl , ARG_sda };
128
129
static const mp_arg_t allowed_args [] = {
129
- { MP_QSTR_id , MP_ARG_REQUIRED | MP_ARG_OBJ },
130
+ #if MICROPY_HW_DEFAULT_I2C_ID < 0
131
+ { MP_QSTR_id , MP_ARG_REQUIRED | MP_ARG_INT , {.u_int = -1 } },
132
+
10000
#else
133
+ { MP_QSTR_id , MP_ARG_INT , {.u_int = MICROPY_HW_DEFAULT_I2C_ID } },
134
+ #endif
130
135
{ MP_QSTR_freq , MP_ARG_INT , {.u_int = DEFAULT_I2C_FREQ } },
136
+ #if defined(pin_SCL ) && defined (pin_SDA )
137
+ { MP_QSTR_scl , MP_ARG_KW_ONLY | MP_ARG_OBJ , {.u_rom_obj = pin_SCL } },
138
+ { MP_QSTR_sda , MP_ARG_KW_ONLY | MP_ARG_OBJ , {.u_rom_obj = pin_SDA } },
139
+ #else
131
140
{ MP_QSTR_scl , MP_ARG_REQUIRED | MP_ARG_KW_ONLY | MP_ARG_OBJ , {.u_rom_obj = MP_ROM_NONE } },
132
141
{ MP_QSTR_sda , MP_ARG_REQUIRED | MP_ARG_KW_ONLY | MP_ARG_OBJ , {.u_rom_obj = MP_ROM_NONE } },
142
+ #endif
133
143
};
134
144
135
145
// Parse args.
136
146
mp_arg_val_t args [MP_ARRAY_SIZE (allowed_args )];
137
147
mp_arg_parse_all_kw_array (n_args , n_kw , all_args , MP_ARRAY_SIZE (allowed_args ), allowed_args , args );
138
148
139
149
// Get I2C bus.
140
- int id = mp_obj_get_int ( args [ARG_id ].u_obj ) ;
150
+ int id = args [ARG_id ].u_int ;
141
151
if (id < 0 || id >= SERCOM_INST_NUM ) {
142
152
mp_raise_msg_varg (& mp_type_ValueError , MP_ERROR_TEXT ("I2C(%d) doesn't exist" ), id );
143
153
}
@@ -148,15 +158,13 @@ mp_obj_t machine_i2c_make_new(const mp_obj_type_t *type, size_t n_args, size_t n
148
158
self -> instance = sercom_instance [self -> id ];
149
159
150
160
// Set SCL/SDA pins.
151
- sercom_pad_config_t scl_pad_config ;
152
161
self -> scl = mp_hal_get_pin_obj (args [ARG_scl ].u_obj );
153
- scl_pad_config = get_sercom_config (self -> scl , self -> id );
154
-
155
- sercom_pad_config_t sda_pad_config ;
156
162
self -> sda = mp_hal_get_pin_obj (args [ARG_sda ].u_obj );
157
- sda_pad_config = get_sercom_config (self -> sda , self -> id );
163
+
164
+ sercom_pad_config_t scl_pad_config = get_sercom_config (self -> scl , self -> id );
165
+ sercom_pad_config_t sda_pad_config = get_sercom_config (self -> sda , self -> id );
158
166
if (sda_pad_config .pad_nr != 0 || scl_pad_config .pad_nr != 1 ) {
159
- mp_raise_ValueError (MP_ERROR_TEXT ("invalid pin for sda or scl" ));
167
+ mp_raise_ValueError (MP_ERROR_TEXT ("invalid sda/ scl pin " ));
160
168
}
161
169
MP_STATE_PORT (sercom_table [self -> id ]) = self ;
162
170
self -> freq = args [ARG_freq ].u_int ;
0 commit comments