diff --git a/lib/i2c_master.c b/lib/i2c_master.c index 85813f4..15bf30b 100644 --- a/lib/i2c_master.c +++ b/lib/i2c_master.c @@ -236,6 +236,10 @@ bool i2c_master_check_signals(uint32_t i2c) { cm3_assert(I2C1 == i2c || I2C2 == i2c); + // enable GPIOs to read SDA and SCL + rcc_periph_clock_enable(RCC_GPIO_PORT_SDA(i2c)); // enable clock for I²C I/O peripheral + rcc_periph_clock_enable(RCC_GPIO_PORT_SCL(i2c)); // enable clock for I²C I/O peripheral + // pull SDA and SDC low to check if there are pull-up resistors uint32_t sda_crl = GPIO_CRL(GPIO_PORT_SDA(i2c)); // backup port configuration uint32_t sda_crh = GPIO_CRH(GPIO_PORT_SDA(i2c)); // backup port configuration @@ -247,6 +251,7 @@ bool i2c_master_check_signals(uint32_t i2c) gpio_set_mode(GPIO_PORT_SCL(i2c), GPIO_MODE_INPUT, GPIO_CNF_INPUT_PULL_UPDOWN, GPIO_PIN_SCL(i2c)); // configure signal as pull down gpio_clear(GPIO_PORT_SDA(i2c), GPIO_PIN_SDA(i2c)); // pull down gpio_clear(GPIO_PORT_SCL(i2c), GPIO_PIN_SCL(i2c)); // pull down + sleep_us(100); bool to_return = (0 != gpio_get(GPIO_PORT_SCL(i2c), GPIO_PIN_SCL(i2c)) && 0 != gpio_get(GPIO_PORT_SDA(i2c), GPIO_PIN_SDA(i2c))); // check if the signals are still pulled high by external stronger pull-up resistors GPIO_CRL(GPIO_PORT_SDA(i2c)) = sda_crl; // restore port configuration GPIO_CRH(GPIO_PORT_SDA(i2c)) = sda_crh; // restore port configuration