From 3abe6bcc96b479405e64fef35b95d25055191d93 Mon Sep 17 00:00:00 2001 From: uestczyh222 Date: Wed, 14 Mar 2018 15:31:06 +0800 Subject: [PATCH] [Bsp][STM32F4xx-HAL]Add I2C driver --- bsp/stm32f4xx-HAL/drivers/SConscript | 5 ++ bsp/stm32f4xx-HAL/drivers/drv_i2c.c | 125 +++++++++++++++++++++++++++ bsp/stm32f4xx-HAL/drivers/drv_i2c.h | 30 +++++++ 3 files changed, 160 insertions(+) create mode 100644 bsp/stm32f4xx-HAL/drivers/drv_i2c.c create mode 100644 bsp/stm32f4xx-HAL/drivers/drv_i2c.h diff --git a/bsp/stm32f4xx-HAL/drivers/SConscript b/bsp/stm32f4xx-HAL/drivers/SConscript index cd204cc0ab..d99bda18b1 100644 --- a/bsp/stm32f4xx-HAL/drivers/SConscript +++ b/bsp/stm32f4xx-HAL/drivers/SConscript @@ -30,8 +30,13 @@ if GetDepend(['RT_USING_USB_DEVICE']): if GetDepend(['RT_USING_RTC']): src += ['drv_rtc.c'] + if GetDepend(['RT_USING_USB_HOST']): src += ['drv_usbh.c'] + +if GetDepend(['RT_USING_I2C']): + src += ['drv_i2c.c'] + CPPPATH = [cwd] group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH) diff --git a/bsp/stm32f4xx-HAL/drivers/drv_i2c.c b/bsp/stm32f4xx-HAL/drivers/drv_i2c.c new file mode 100644 index 0000000000..3dbabdb750 --- /dev/null +++ b/bsp/stm32f4xx-HAL/drivers/drv_i2c.c @@ -0,0 +1,125 @@ +/* + * File : drv_i2c.c + * This file is part of RT-Thread RTOS + * COPYRIGHT (C) 2006 - 2018, RT-Thread Development Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Change Logs: + * Date Author Notes + * 2017-06-05 tanek first implementation. + * 2018-03-08 ZYH Porting for stm32f4xx + */ + +#include +#include +#include + +#include "drv_i2c.h" +#include + +/*user can change this*/ +#define I2C_BUS_NAME "i2c2" + +/*user should change this to adapt specific board*/ +#define I2C_SCL_PIN GPIO_PIN_6 +#define I2C_SCL_PORT GPIOB +#define I2C_SCL_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE +#define I2C_SDA_PIN GPIO_PIN_7 +#define I2C_SDA_PORT GPIOB +#define I2C_SDA_PORT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE + + +static void drv_i2c_gpio_init() +{ + GPIO_InitTypeDef GPIO_Initure; + + I2C_SCL_PORT_CLK_ENABLE(); + I2C_SDA_PORT_CLK_ENABLE(); + + GPIO_Initure.Pin = I2C_SCL_PIN; + GPIO_Initure.Mode = GPIO_MODE_OUTPUT_OD; + GPIO_Initure.Pull = GPIO_PULLUP; + GPIO_Initure.Speed = GPIO_SPEED_HIGH; + HAL_GPIO_Init(I2C_SCL_PORT, &GPIO_Initure); + + GPIO_Initure.Pin = I2C_SDA_PIN; + GPIO_Initure.Mode = GPIO_MODE_OUTPUT_OD; + GPIO_Initure.Pull = GPIO_PULLUP; + GPIO_Initure.Speed = GPIO_SPEED_HIGH; + HAL_GPIO_Init(I2C_SDA_PORT, &GPIO_Initure); + + HAL_GPIO_WritePin(I2C_SCL_PORT, I2C_SCL_PIN, GPIO_PIN_SET); + HAL_GPIO_WritePin(I2C_SDA_PORT, I2C_SDA_PIN, GPIO_PIN_SET); +} + +static void drv_set_sda(void *data, rt_int32_t state) +{ + HAL_GPIO_WritePin(I2C_SDA_PORT, I2C_SDA_PIN, state ? GPIO_PIN_SET : GPIO_PIN_RESET); +} + +static void drv_set_scl(void *data, rt_int32_t state) +{ + HAL_GPIO_WritePin(I2C_SCL_PORT, I2C_SCL_PIN, state ? GPIO_PIN_SET : GPIO_PIN_RESET); +} + +static rt_int32_t drv_get_sda(void *data) +{ + return HAL_GPIO_ReadPin(I2C_SDA_PORT, I2C_SDA_PIN) ? 1 : 0; +} + +static rt_int32_t drv_get_scl(void *data) +{ + return HAL_GPIO_ReadPin(I2C_SCL_PORT, I2C_SCL_PIN) ? 1 : 0; +} + + +static void drv_udelay(rt_uint32_t us) +{ + int i = ( HAL_RCC_GetHCLKFreq() / 4000000 * us); + while(i) + { + i--; + } +} + +static const struct rt_i2c_bit_ops drv_bit_ops = +{ + RT_NULL, + drv_set_sda, + drv_set_scl, + drv_get_sda, + drv_get_scl, + drv_udelay, + 1, + 100 +}; + +int drv_i2c_init(void) +{ + static struct rt_i2c_bus_device i2c2_bus; + + drv_i2c_gpio_init(); + + rt_memset((void *)&i2c2_bus, 0, sizeof(struct rt_i2c_bus_device)); + + i2c2_bus.priv = (void *)&drv_bit_ops; + + rt_i2c_bit_add_bus(&i2c2_bus, I2C_BUS_NAME); + + return RT_EOK; +} +INIT_DEVICE_EXPORT(drv_i2c_init); +/* end of i2c driver */ diff --git a/bsp/stm32f4xx-HAL/drivers/drv_i2c.h b/bsp/stm32f4xx-HAL/drivers/drv_i2c.h new file mode 100644 index 0000000000..0828dba8b7 --- /dev/null +++ b/bsp/stm32f4xx-HAL/drivers/drv_i2c.h @@ -0,0 +1,30 @@ +/* + * File : drv_i2c.c + * This file is part of RT-Thread RTOS + * COPYRIGHT (C) 2006 - 2018, RT-Thread Development Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Change Logs: + * Date Author Notes + * 2017-06-05 tanek first implementation. + */ + +#ifndef __DRV_I2C__ +#define __DRV_I2C__ + +int hw_i2c_init(void); + +#endif