Loading include/arch/stm32f746zg-nucleo/driver/i2c.h 0 → 100644 +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 ©); 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 src/arch/stm32f746zg-nucleo/Kconfig +12 −0 Original line number Diff line number Diff line Loading @@ -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 src/arch/stm32f746zg-nucleo/Makefile.inc +3 −3 Original line number Diff line number Diff line Loading @@ -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 Loading src/arch/stm32f746zg-nucleo/driver/i2c.cc 0 → 100644 +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; Loading
include/arch/stm32f746zg-nucleo/driver/i2c.h 0 → 100644 +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 ©); 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
src/arch/stm32f746zg-nucleo/Kconfig +12 −0 Original line number Diff line number Diff line Loading @@ -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
src/arch/stm32f746zg-nucleo/Makefile.inc +3 −3 Original line number Diff line number Diff line Loading @@ -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 Loading
src/arch/stm32f746zg-nucleo/driver/i2c.cc 0 → 100644 +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;