diff --git a/extras/i2c/i2c.c b/extras/i2c/i2c.c index df26ed2..2d31e8e 100644 --- a/extras/i2c/i2c.c +++ b/extras/i2c/i2c.c @@ -49,48 +49,47 @@ void i2c_init(uint8_t scl_pin, uint8_t sda_pin) gpio_set_pullup(g_scl_pin, 1, 1); gpio_set_pullup(g_sda_pin, 1, 1); - // I2C bus idle state. - gpio_enable(g_scl_pin, GPIO_INPUT); - gpio_enable(g_scl_pin, GPIO_INPUT); + gpio_enable(g_scl_pin, GPIO_OUT_OPEN_DRAIN); + gpio_enable(g_sda_pin, GPIO_OUT_OPEN_DRAIN); - // Set the pins to a low output state for when they are configured - // as outputs. - gpio_write(g_scl_pin, 0); - gpio_write(g_sda_pin, 0); + // I2C bus idle state. + gpio_write(g_scl_pin, 1); + gpio_write(g_sda_pin, 1); } -static void i2c_delay(void) +static inline void i2c_delay(void) { sdk_os_delay_us(CLK_HALF_PERIOD_US); } // Set SCL as input, allowing it to float high, and return current // level of line, 0 or 1 -static bool read_scl(void) +static inline bool read_scl(void) { - gpio_enable(g_scl_pin, GPIO_INPUT); + gpio_write(g_scl_pin, 1); return gpio_read(g_scl_pin); // Clock high, valid ACK } -// Set SDA as input and return current level of line, 0 or 1 -static bool read_sda(void) +// Set SDA as input, allowing it to float high, and return current +// level of line, 0 or 1 +static inline bool read_sda(void) { - gpio_enable(g_sda_pin, GPIO_INPUT); + gpio_write(g_sda_pin, 1); // TODO: Without this delay we get arbitration lost in i2c_stop i2c_delay(); return gpio_read(g_sda_pin); // Clock high, valid ACK } // Actively drive SCL signal low -static void clear_scl(void) +static inline void clear_scl(void) { - gpio_enable(g_scl_pin, GPIO_OUT_OPEN_DRAIN); + gpio_write(g_scl_pin, 0); } // Actively drive SDA signal low -static void clear_sda(void) +static inline void clear_sda(void) { - gpio_enable(g_sda_pin, GPIO_OUT_OPEN_DRAIN); + gpio_write(g_sda_pin, 0); } // Output start condition