diff options
| -rw-r--r-- | ports/atmel-samd/common-hal/busio/I2C.c | 44 | ||||
| -rw-r--r-- | ports/atmel-samd/common-hal/busio/I2C.h | 3 |
2 files changed, 26 insertions, 21 deletions
diff --git a/ports/atmel-samd/common-hal/busio/I2C.c b/ports/atmel-samd/common-hal/busio/I2C.c index 8bfa8ddd2..c0643865d 100644 --- a/ports/atmel-samd/common-hal/busio/I2C.c +++ b/ports/atmel-samd/common-hal/busio/I2C.c @@ -39,39 +39,41 @@ // Number of times to try to send packet if failed. #define ATTEMPTS 2 -void common_hal_busio_i2c_construct(busio_i2c_obj_t *self, - const mcu_pin_obj_t* scl, const mcu_pin_obj_t* sda, uint32_t frequency, uint32_t timeout) { - #ifdef PIRKEY_M0 - mp_raise_NotImplementedError(translate("Not enough pins available")); - return; - #endif - Sercom* sercom = NULL; - uint8_t sercom_index; - uint32_t sda_pinmux = 0; - uint32_t scl_pinmux = 0; +Sercom *samd_i2c_get_sercom(const mcu_pin_obj_t* scl, const mcu_pin_obj_t* sda, + uint8_t *sercom_index, uint32_t *sda_pinmux, uint32_t *scl_pinmux) { + *sda_pinmux = 0; + *scl_pinmux = 0; for (int i = 0; i < NUM_SERCOMS_PER_PIN; i++) { - sercom_index = sda->sercom[i].index; - if (sercom_index >= SERCOM_INST_NUM) { + *sercom_index = sda->sercom[i].index; + if (*sercom_index >= SERCOM_INST_NUM) { continue; } - Sercom* potential_sercom = sercom_insts[sercom_index]; + Sercom* potential_sercom = sercom_insts[*sercom_index]; if (potential_sercom->I2CM.CTRLA.bit.ENABLE != 0 || sda->sercom[i].pad != 0) { continue; } - sda_pinmux = PINMUX(sda->number, (i == 0) ? MUX_C : MUX_D); + *sda_pinmux = PINMUX(sda->number, (i == 0) ? MUX_C : MUX_D); for (int j = 0; j < NUM_SERCOMS_PER_PIN; j++) { - if (sercom_index == scl->sercom[j].index && + if (*sercom_index == scl->sercom[j].index && scl->sercom[j].pad == 1) { - scl_pinmux = PINMUX(scl->number, (j == 0) ? MUX_C : MUX_D); - sercom = potential_sercom; - break; + *scl_pinmux = PINMUX(scl->number, (j == 0) ? MUX_C : MUX_D); + return potential_sercom; } } - if (sercom != NULL) { - break; - } } + return NULL; +} + +void common_hal_busio_i2c_construct(busio_i2c_obj_t *self, + const mcu_pin_obj_t* scl, const mcu_pin_obj_t* sda, uint32_t frequency, uint32_t timeout) { + #ifdef PIRKEY_M0 + mp_raise_NotImplementedError(translate("Not enough pins available")); + return; + #endif + uint8_t sercom_index; + uint32_t sda_pinmux, scl_pinmux; + Sercom* sercom = samd_i2c_get_sercom(scl, sda, &sercom_index, &sda_pinmux, &scl_pinmux); if (sercom == NULL) { mp_raise_ValueError(translate("Invalid pins")); } diff --git a/ports/atmel-samd/common-hal/busio/I2C.h b/ports/atmel-samd/common-hal/busio/I2C.h index 2401d9247..366c6c469 100644 --- a/ports/atmel-samd/common-hal/busio/I2C.h +++ b/ports/atmel-samd/common-hal/busio/I2C.h @@ -41,4 +41,7 @@ typedef struct { uint8_t sda_pin; } busio_i2c_obj_t; +extern Sercom *samd_i2c_get_sercom(const mcu_pin_obj_t* scl, const mcu_pin_obj_t* sda, + uint8_t *sercom_index, uint32_t *sda_pinmux, uint32_t *scl_pinmux); + #endif // MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_BUSIO_I2C_H |
