Example #1
0
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);
}
Example #2
0
/**
 * @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);
}
Example #3
0
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);
}
Example #4
0
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);
}
Example #5
0
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);
}