diff options
| author | Hierophect <hierophect@gmail.com> | 2020-01-08 12:32:43 -0500 |
|---|---|---|
| committer | Hierophect <hierophect@gmail.com> | 2020-01-08 12:32:43 -0500 |
| commit | b0f08ba465f2585d03e445b920a86ceda1a20ea5 (patch) | |
| tree | 5aa6336a2d68446196125fa4f63c81dbc69ac770 | |
| parent | 776c9b011c26f9833f392fcf8270d20a4bbc8031 (diff) | |
Close algorithm edge case to match SPI
| -rw-r--r-- | ports/stm32f4/common-hal/busio/I2C.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/ports/stm32f4/common-hal/busio/I2C.c b/ports/stm32f4/common-hal/busio/I2C.c index d2292845e..dc82c19a0 100644 --- a/ports/stm32f4/common-hal/busio/I2C.c +++ b/ports/stm32f4/common-hal/busio/I2C.c @@ -66,20 +66,26 @@ void common_hal_busio_i2c_never_reset(busio_i2c_obj_t *self) { } } - 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) { //match pins to I2C objects I2C_TypeDef * I2Cx; - uint8_t sda_len = sizeof(mcu_i2c_sda_list)/sizeof(*mcu_i2c_sda_list); uint8_t scl_len = sizeof(mcu_i2c_scl_list)/sizeof(*mcu_i2c_scl_list); + bool i2c_taken = false; + for(uint i=0; i<sda_len;i++) { if (mcu_i2c_sda_list[i].pin == sda) { for(uint j=0; j<scl_len;j++) { if ((mcu_i2c_scl_list[j].pin == scl) && (mcu_i2c_scl_list[j].i2c_index == mcu_i2c_sda_list[i].i2c_index)) { + //keep looking if the I2C is taken, could be another SCL that works + if(reserved_i2c[mcu_i2c_scl_list[i].i2c_index-1]) { + i2c_taken = true; + continue; + } + self->scl = &mcu_i2c_scl_list[j]; self->sda = &mcu_i2c_sda_list[i]; break; @@ -92,11 +98,11 @@ void common_hal_busio_i2c_construct(busio_i2c_obj_t *self, if(self->sda!=NULL && self->scl!=NULL ) { I2Cx = mcu_i2c_banks[self->sda->i2c_index-1]; } else { - mp_raise_RuntimeError(translate("Invalid I2C pin selection")); - } - - if(reserved_i2c[self->sda->i2c_index-1]) { - mp_raise_RuntimeError(translate("Hardware busy, try alternative pins")); + if (i2c_taken) { + mp_raise_ValueError(translate("Hardware busy, try alternative pins")); + } else { + mp_raise_ValueError(translate("Invalid I2C pin selection")); + } } //Start GPIO for each pin |
