Unverified Commit 3fffef85 authored by Birte Kristina Friesel's avatar Birte Kristina Friesel
Browse files

stm32f446re: Add I²C driver

parent ae68513e
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -54,7 +54,7 @@ features; the remainder of this README covers details.
| MSP430FR5969 | 16 MHz | 48 (64) KiB FRAM | 2 KiB SRAM | I²C, SPI, UART, DMX, ADC |
| MSP430FR5994 | 16 MHz | 48 (256) KiB FRAM | 4 (8) KiB SRAM | I²C, SPI, UART, DMX, ADC |
| RM46L852 (Cortex-R4F) | 160 MHz | 1.25 MiB Flash | 192 KiB SRAM | |
| STM32F446RE (Cortex-M4) | 168 MHz | 512 KiB Flash | 128 KiB SRAM | |
| STM32F446RE (Cortex-M4) | 168 MHz | 512 KiB Flash | 128 KiB SRAM | I²C |
| STM32F746ZG (Cortex-M7) | 216 MHz | 1 MiB Flash | 320 KiB SRAM | |
| POSIX | – | – | – | I²C |

@@ -131,6 +131,7 @@ Peripheral communication:
Peripheral communication:

* UART output on USART2
* I²C on I2C1 muxed to PB8 / PB9

### STM32F746ZG (NUCLEO-F746ZG)

+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
+13 −1
Original line number Diff line number Diff line
# Copyright 2020 Birte Kristina Friesel
# Copyright 2024 Birte Kristina Friesel
#
# SPDX-License-Identifier: CC0-1.0
config arch_stm32f446re_nucleo_driver_counter
bool "Cycle Counter"
select meta_driver_counter

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

config arch_stm32f446re_nucleo_driver_i2c_fast_mode
bool "Fast Mode (400 kHz)"
depends on arch_stm32f446re_nucleo_driver_i2c

#config arch_stm32f446re_nucleo_driver_timer
#bool "Timer with Interrupts"
#select meta_driver_timer
+4 −0
Original line number Diff line number Diff line
@@ -55,6 +55,10 @@ ifdef CONFIG_arch_stm32f446re_nucleo_driver_counter
	CXX_TARGETS += src/arch/stm32f446re-nucleo/driver/counter.cc
endif

ifdef CONFIG_arch_stm32f446re_nucleo_driver_i2c
	CXX_TARGETS += src/arch/stm32f446re-nucleo/driver/i2c.cc
endif

#ifdef CONFIG_arch_stm32f446re_nucleo_driver_timer
#	CXX_TARGETS += src/arch/stm32f446re-nucleo/driver/timer.cc
#endif
+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_stm32f446re_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_set_standard_mode(I2C1);
	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;