示例#1
0
void i2c_master_enable(i2c_dev *dev, uint32 flags) {
	/* Bring the peripheral down for configuration */
	i2c_peripheral_disable(dev);

	/* Reset the bus when requested so */
	if (flags & I2C_BUS_RESET)
		i2c_bus_reset(dev);

	/* Turn on the clock and set GPIO modes */
	i2c_init(dev);
	i2c_config_gpios(dev);
	
	/* Configure analog and digital filters */
	/* TODO ANFOFF, DNF */

	/* Configure the clock and rise time */
	dev->regs->TIMINGR = I2C_TIMING_10_kHz;

	/* Configure NOSTRETCH behaviour */
	/* TODO NOSTRETCH */

	/* Enable all interrupts */ /* FIXME not yet used on F3 */
	//nvic_irq_enable(dev->ev_nvic_line);
	//nvic_irq_enable(dev->er_nvic_line);
	//i2c_enable_irq(dev, 0xFE); /* All interrupts */

	/* Make it go! */
	i2c_peripheral_enable(dev);

	dev->state = I2C_STATE_IDLE;
}
示例#2
0
文件: i2c.c 项目: boltonja/armduino
/**
 * @brief Initialize an I2C device as bus master
 * @param dev Device to enable
 * @param flags Bitwise or of the following I2C options:
 *              I2C_FAST_MODE: 400 khz operation,
 *              I2C_DUTY_16_9: 16/9 Tlow/Thigh duty cycle (only applicable for
 *                             fast mode),
 *              I2C_BUS_RESET: Reset the bus and clock out any hung slaves on
 *                             initialization,
 *              I2C_10BIT_ADDRESSING: Enable 10-bit addressing,
 *              I2C_REMAP: (deprecated, STM32F1 only) Remap I2C1 to SCL/PB8
 *                         SDA/PB9.
 */
void i2c_master_enable(i2c_dev *dev, uint32 flags) {
	/* Reset the bus. Clock out any hung slaves. */
	if (flags & I2C_BUS_RESET) {
		fooprint("i2c_master_enable: calling i2c_bus_reset");
		i2c_bus_reset(dev);
	}
	fooprint("i2c_master_enable: entry");
	/* PE must be disabled to configure the device */
	// ASSERT(!(dev->regs->CR1 & I2C_CR1_PE));

	/* Ugh */
	//_i2c_handle_remap(dev, flags);

	fooprint("i2c_master_enable: calling i2c_init");
	/* Turn on clock and set GPIO modes */
	i2c_init(dev);
	
	fooprint("i2c_master_enable: calling i2c_config_gpios");
	i2c_config_gpios(dev);

	fooprint("i2c_master_enable: calling set_freq_scl");
	/* Configure clock and rise time */
	set_freq_scl(dev, flags);

	fooprint("i2c_master_enable: calling nvic_irq_enable(ev)");
	/* Enable event and buffer interrupts */
	nvic_irq_enable(dev->ev_nvic_line);
	fooprint("i2c_master_enable: calling nvic_irq_enable(er)");
	nvic_irq_enable(dev->er_nvic_line);
	
	//gutted
	
	fooprint("i2c_master_enable: calling i2c_enable_irq");
	i2c_enable_irq(dev, I2C_CFGR_STOIEN_MASK | I2C_CFGR_ACKIEN_MASK | I2C_CFGR_RXIEN_MASK | I2C_CFGR_TXIEN_MASK | I2C_CFGR_STAIEN_MASK | I2C_CFGR_ARBLIEN_MASK);

	/* Make it go! */
	
	fooprint("i2c_master_enable: calling i2c_peripheral_enable");
	//gutted

	i2c_peripheral_enable(dev);




	dev->state = I2C_STATE_IDLE;
	fooprint("i2c_master_enable: exit, dev-state = I2C_STATE_IDLE");
}
示例#3
0
文件: i2c.c 项目: afranceschi/SDR
/**
 * @brief Initialize an I2C device as bus master
 * @param dev Device to enable
 * @param flags Bitwise or of the following I2C options:
 *              I2C_FAST_MODE: 400 khz operation,
 *              I2C_DUTY_16_9: 16/9 Tlow/Thigh duty cycle (only applicable for
 *                             fast mode),
 *              I2C_BUS_RESET: Reset the bus and clock out any hung slaves on
 *                             initialization,
 *              I2C_10BIT_ADDRESSING: Enable 10-bit addressing,
 *              I2C_REMAP: (deprecated, STM32F1 only) Remap I2C1 to SCL/PB8
 *                         SDA/PB9.
 */
void i2c_master_enable(i2c_dev *dev, uint32 flags) {
    /* PE must be disabled to configure the device */
    ASSERT(!(dev->regs->CR1 & I2C_CR1_PE));

    /* Ugh */
    _i2c_handle_remap(dev, flags);

    /* Reset the bus. Clock out any hung slaves. */
    if (flags & I2C_BUS_RESET) {
        i2c_bus_reset(dev);
    }

    /* Turn on clock and set GPIO modes */
    i2c_init(dev);
    i2c_config_gpios(dev);

    /* Configure clock and rise time */
    set_ccr_trise(dev, flags);

    /* Enable event and buffer interrupts */
    nvic_irq_enable(dev->ev_nvic_line);
    nvic_irq_enable(dev->er_nvic_line);
    i2c_enable_irq(dev, I2C_IRQ_EVENT | I2C_IRQ_BUFFER | I2C_IRQ_ERROR);

    /* Configure the slave unit */
    if (flags & I2C_SLAVE_DUAL_ADDRESS) {
        i2c_slave_dual_address_enable(dev);
    }

    if (flags & I2C_SLAVE_GENERAL_CALL) {
        i2c_slave_general_call_enable(dev);
    }

    /* store all of the flags */
    dev->config_flags = flags;

    /* Make it go! */
    i2c_peripheral_enable(dev);
    i2c_enable_ack(dev);

    dev->state = I2C_STATE_IDLE;
}
示例#4
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);
}