From efb0f982d232c4f5f2e355e59757652ff2b5271b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Wed, 4 Oct 2017 01:22:22 +0200 Subject: [PATCH] Only try to recover I2C if SDA is low. --- right/src/init_peripherals.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/right/src/init_peripherals.c b/right/src/init_peripherals.c index af25e52..2fbdeb5 100644 --- a/right/src/init_peripherals.c +++ b/right/src/init_peripherals.c @@ -29,12 +29,19 @@ void delay(void) void recoverI2c(void) { PORT_SetPinMux(I2C_MAIN_BUS_SDA_PORT, I2C_MAIN_BUS_SDA_PIN, kPORT_MuxAsGpio); - GPIO_PinInit(I2C_MAIN_BUS_SDA_GPIO, I2C_MAIN_BUS_SDA_PIN, &(gpio_pin_config_t){kGPIO_DigitalOutput, 1}); PORT_SetPinMux(I2C_MAIN_BUS_SCL_PORT, I2C_MAIN_BUS_SCL_PIN, kPORT_MuxAsGpio); GPIO_PinInit(I2C_MAIN_BUS_SCL_GPIO, I2C_MAIN_BUS_SCL_PIN, &(gpio_pin_config_t){kGPIO_DigitalOutput, 1}); bool isOn = true; for (int i=0; i<20; i++) { + GPIO_PinInit(I2C_MAIN_BUS_SDA_GPIO, I2C_MAIN_BUS_SDA_PIN, &(gpio_pin_config_t){kGPIO_DigitalInput}); + bool isSdaHigh = GPIO_ReadPinInput(I2C_MAIN_BUS_SDA_GPIO, I2C_MAIN_BUS_SDA_PIN); + GPIO_PinInit(I2C_MAIN_BUS_SDA_GPIO, I2C_MAIN_BUS_SDA_PIN, &(gpio_pin_config_t){kGPIO_DigitalOutput, 1}); + + if (isSdaHigh) { + return; + } + GPIO_WritePinOutput(I2C_MAIN_BUS_SCL_GPIO, I2C_MAIN_BUS_SCL_PIN, isOn); delay(); isOn = !isOn;