From a0c848b0e764b467e6b9efc54155ec17863fe8d7 Mon Sep 17 00:00:00 2001 From: xuzhuoyi Date: Wed, 3 Oct 2018 00:00:47 +0800 Subject: [PATCH] [bsp][stm32f429-disco] Add i2c support --- bsp/stm32f429-disco/drivers/drv_i2c.c | 120 ++++++++++++++++++++++++++ bsp/stm32f429-disco/drivers/drv_i2c.h | 24 ++++++ 2 files changed, 144 insertions(+) create mode 100644 bsp/stm32f429-disco/drivers/drv_i2c.c create mode 100644 bsp/stm32f429-disco/drivers/drv_i2c.h diff --git a/bsp/stm32f429-disco/drivers/drv_i2c.c b/bsp/stm32f429-disco/drivers/drv_i2c.c new file mode 100644 index 0000000000..7d8e7a27b2 --- /dev/null +++ b/bsp/stm32f429-disco/drivers/drv_i2c.c @@ -0,0 +1,120 @@ +/* + * File : drv_i2c.c + * This file is part of RT-Thread RTOS + * COPYRIGHT (C) 2017 RT-Thread Develop Team + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rt-thread.org/license/LICENSE + * + * Change Logs: + * Date Author Notes + * 2017-06-05 tanek first implementation. + */ + +#include "drv_i2c.h" + +#include +#include +#include +#include + +#define DEBUG + +#ifdef DEBUG +#define DEBUG_PRINTF(...) rt_kprintf(__VA_ARGS__) +#else +#define DEBUG_PRINTF(...) +#endif + +static void stm32f4_i2c_gpio_init() +{ + GPIO_InitTypeDef GPIO_Initure; + + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOC_CLK_ENABLE(); + + GPIO_Initure.Pin = GPIO_PIN_8; + GPIO_Initure.Mode = GPIO_MODE_OUTPUT_OD; + GPIO_Initure.Pull = GPIO_PULLUP; + GPIO_Initure.Speed = GPIO_SPEED_FAST; + HAL_GPIO_Init(GPIOA, &GPIO_Initure); + + GPIO_Initure.Pin = GPIO_PIN_9; + GPIO_Initure.Mode = GPIO_MODE_OUTPUT_OD; + GPIO_Initure.Pull = GPIO_PULLUP; + GPIO_Initure.Speed = GPIO_SPEED_FAST; + HAL_GPIO_Init(GPIOC, &GPIO_Initure); + + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET); + HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_SET); +} + +static void stm32f4_set_sda(void *data, rt_int32_t state) +{ + HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, (GPIO_PinState)state); +} + +static void stm32f4_set_scl(void *data, rt_int32_t state) +{ + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, (GPIO_PinState)state); +} + +static rt_int32_t stm32f4_get_sda(void *data) +{ + return (rt_int32_t)HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_9); +} + +static rt_int32_t stm32f4_get_scl(void *data) +{ + return (rt_int32_t)HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8); +} + +static void stm32f4_udelay(rt_uint32_t us) +{ + rt_int32_t i; + for (; us > 0; us--) + { + i = 50; + while (i > 0) + { + i--; + } + } +} + +static const struct rt_i2c_bit_ops bit_ops = { + RT_NULL, + stm32f4_set_sda, + stm32f4_set_scl, + stm32f4_get_sda, + stm32f4_get_scl, + + stm32f4_udelay, + + 5, + 100 +}; + +int stm32f4_i2c_init(void) +{ + struct rt_i2c_bus_device *bus; + + bus = rt_malloc(sizeof(struct rt_i2c_bus_device)); + if (bus == RT_NULL) + { + rt_kprintf("rt_malloc failed\n"); + return -RT_ENOMEM; + } + + rt_memset((void *)bus, 0, sizeof(struct rt_i2c_bus_device)); + + bus->priv = (void *)&bit_ops; + + stm32f4_i2c_gpio_init(); + + rt_i2c_bit_add_bus(bus, "i2c3"); + + return RT_EOK; +} +INIT_DEVICE_EXPORT(stm32f4_i2c_init); diff --git a/bsp/stm32f429-disco/drivers/drv_i2c.h b/bsp/stm32f429-disco/drivers/drv_i2c.h new file mode 100644 index 0000000000..8e91be0e0e --- /dev/null +++ b/bsp/stm32f429-disco/drivers/drv_i2c.h @@ -0,0 +1,24 @@ +/* +* File : drv_i2c.h +* This file is part of RT-Thread RTOS +* COPYRIGHT (C) 2017 RT-Thread Develop Team +* +* The license and distribution terms for this file may be +* found in the file LICENSE in this distribution or at +* http://www.rt-thread.org/license/LICENSE +* +* Change Logs: +* Date Author Notes +* 2017-06-05 tanek first implementation. +*/ + +#ifndef STM32F4XX_IIC_INCLUDED +#define STM32F4XX_IIC_INCLUDED + +#include +#include + +#include "stm32f4xx_hal.h" + + +#endif // STM32F20X_40X_SPI_H_INCLUDED