void i2c_config_gpios(const i2c_dev *dev) { gpio_set_modef(sda_port(dev), dev->sda_pin, GPIO_MODE_AF, GPIO_MODEF_TYPE_OD); gpio_set_modef(scl_port(dev), dev->scl_pin, GPIO_MODE_AF, GPIO_MODEF_TYPE_OD); gpio_set_af(sda_port(dev), dev->sda_pin, GPIO_AF_4); gpio_set_af(scl_port(dev), dev->scl_pin, GPIO_AF_4); }
/** * @brief Reset an I2C bus. * * Reset is accomplished by clocking out pulses until any hung slaves * release SDA and SCL, then generating a START condition, then a STOP * condition. * * @param dev I2C device */ void i2c_bus_reset(const i2c_dev *dev) { /* Release both lines */ i2c_master_release_bus(dev); /* * Make sure the bus is free by clocking it until any slaves release the * bus. */ while (!gpio_read_bit(sda_port(dev), dev->sda_pin)) { /* Wait for any clock stretching to finish */ while (!gpio_read_bit(scl_port(dev), dev->scl_pin)) ; delay_us(10); /* Pull low */ gpio_write_bit(scl_port(dev), dev->scl_pin, 0); delay_us(10); /* Release high again */ gpio_write_bit(scl_port(dev), dev->scl_pin, 1); delay_us(10); } /* Generate start then stop condition */ gpio_write_bit(sda_port(dev), dev->sda_pin, 0); delay_us(10); gpio_write_bit(scl_port(dev), dev->scl_pin, 0); delay_us(10); gpio_write_bit(scl_port(dev), dev->scl_pin, 1); delay_us(10); gpio_write_bit(sda_port(dev), dev->sda_pin, 1); }
void i2c_config_gpios(const i2c_dev *dev) { /* Untested... */ gpio_set_modef(sda_port(dev), dev->sda_pin, GPIO_MODE_AF, I2C_MODEF_FLAGS); gpio_set_modef(scl_port(dev), dev->scl_pin, GPIO_MODE_AF, I2C_MODEF_FLAGS); gpio_set_af(sda_port(dev), dev->sda_pin, GPIO_AF_I2C); gpio_set_af(scl_port(dev), dev->scl_pin, GPIO_AF_I2C); }
void i2c_master_release_bus(const i2c_dev *dev) { /* Untested... */ unsigned flags = (GPIO_MODEF_TYPE_OD | GPIO_MODEF_SPEED_HIGH | GPIO_MODEF_PUPD_PU); gpio_write_bit(scl_port(dev), dev->scl_pin, 1); gpio_write_bit(sda_port(dev), dev->sda_pin, 1); gpio_set_modef(scl_port(dev), dev->scl_pin, GPIO_MODE_OUTPUT, I2C_MODEF_FLAGS); gpio_set_modef(sda_port(dev), dev->sda_pin, GPIO_MODE_OUTPUT, I2C_MODEF_FLAGS); }
void i2c_master_release_bus(const i2c_dev *dev) { gpio_write_bit(scl_port(dev), dev->scl_pin, 1); /* TODO check this */ gpio_write_bit(sda_port(dev), dev->sda_pin, 1); i2c_config_gpios(dev); }