Unverified Commit 190fef22 authored by Birte Kristina Friesel's avatar Birte Kristina Friesel
Browse files

stm32f7: Add I²C driver. With fast mode!

parent 5db1ecd3
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
/*
 * Copyright 2024 Birte Kristina Friesel
 *
 * SPDX-License-Identifier: BSD-2-Clause
 */
#ifndef I2C_H
#define I2C_H

class I2C {
	private:
		I2C(const I2C &copy);

	public:
		I2C () {}
		signed char setup();
		signed char xmit(unsigned char address,
				unsigned char tx_len, unsigned char *tx_buf,
				unsigned char rx_len, unsigned char *rx_buf);
};

extern I2C i2c;

#endif
+12 −0
Original line number Diff line number Diff line
@@ -8,3 +8,15 @@ select meta_driver_counter
config arch_stm32f746zg_nucleo_driver_uptime
bool "Uptime Counter"
select meta_driver_uptime

config arch_stm32f746zg_nucleo_driver_i2c
bool "I²C on PB[89]"
help
  SDA: PB9 (CN7 D14)
  SCL: PB8 (CN7 D15)
select meta_driver_hardware_i2c
select meta_driver_i2c

config arch_stm32f746zg_nucleo_driver_i2c_fast_mode
bool "Fast Mode (400 kHz)"
depends on arch_stm32f746zg_nucleo_driver_i2c
+3 −3
Original line number Diff line number Diff line
@@ -51,9 +51,9 @@ ifdef CONFIG_arch_stm32f746zg_nucleo_driver_counter
	CXX_TARGETS += src/arch/stm32f746zg-nucleo/driver/counter.cc
endif

#ifdef CONFIG_arch_stm32f746zg_nucleo_driver_i2c
#	CXX_TARGETS += src/arch/stm32f746zg-nucleo/driver/i2c.cc
#endif
ifdef CONFIG_arch_stm32f746zg_nucleo_driver_i2c
	CXX_TARGETS += src/arch/stm32f746zg-nucleo/driver/i2c.cc
endif

#ifdef CONFIG_arch_stm32f746zg_nucleo_driver_timer
#	CXX_TARGETS += src/arch/stm32f746zg-nucleo/driver/timer.cc
+38 −0
Original line number Diff line number Diff line
/*
 * Copyright 2024 Birte Kristina Friesel
 *
 * SPDX-License-Identifier: BSD-2-Clause
 */
#include "driver/i2c.h"
#include "arch.h"
#include <libopencm3/stm32/rcc.h>
#include <libopencm3/stm32/gpio.h>
#include <libopencm3/stm32/i2c.h>

signed char I2C::setup()
{

	rcc_periph_clock_enable(RCC_I2C1);
	gpio_set_af(GPIOB, GPIO_AF4, GPIO8 | GPIO9);
	gpio_set_output_options(GPIOB, GPIO_OTYPE_OD, GPIO_OSPEED_2MHZ, GPIO8|GPIO9);
	gpio_mode_setup(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO8 | GPIO9);
	i2c_peripheral_disable(I2C1);
#ifdef CONFIG_arch_stm32f746zg_nucleo_driver_i2c_fast_mode
	i2c_set_speed(I2C1, i2c_speed_fm_400k, rcc_apb1_frequency / 1000000);
#else
	i2c_set_speed(I2C1, i2c_speed_sm_100k, rcc_apb1_frequency / 1000000);
#endif
	i2c_peripheral_enable(I2C1);

	return 0;
}

signed char I2C::xmit(unsigned char address,
		unsigned char tx_len, unsigned char *tx_buf,
		unsigned char rx_len, unsigned char *rx_buf)
{
	i2c_transfer7(I2C1, address, tx_buf, tx_len, rx_buf, rx_len);
	return 0;
}

I2C i2c;