当前位置: 首页 > news >正文

通用型I2C接口的应用之综合应用(N32G45XVL-STB)

通用型I2C接口的应用之综合应用(N32G45XVL-STB)

目录

概述

1 软硬件接口

1.1 硬件接口

1.2 开发软硬件信息

1.3 SHT-20模块电路

1.4  0.9寸OLED模块介绍

2 驱动接口实现

2.1 SHT20驱动接口

2.2 OLED驱动接口

3 应用接口实现

3.1 软件框架

3.2 sht2x I2C驱动调用

3.3 OLED I2C驱动调用

4 功能实现

4.1 功能介绍

4.2 代码实现

5 测试

5.1 测试代码实现 

5.2 板卡运行代码 


源代码下载地址:

通用性I2C接口的应用之驱动SHT20(N32G45XVL-STB)资源-CSDN文库

概述

本文主要应用通用型I2C接口的代码库,使用二组不同IO的pin,分别实现I2C功能,同时驱动SHT20X和OLED。在主函数中实时读取SHT20的数据,并将数据实时的显示在OLED屏幕上。温湿度的数据也通过串口log,发送至串口终端上。

1 软硬件接口

1.1 硬件接口

1) SHT20接口

MCU接口SHT20功能
PB6SDAI2C数据端口
PB7SCLI2C时钟接口

2) OLED接口

MCU接口OLED功能
PB12SDAI2C数据端口
PB11SCLI2C时钟接口

1.2 开发软硬件信息

软硬件信息版本信息
N32G45x MCUN32G457VEL7
KeilMDK ARM 5.38
调试工具:CMSIS-DAPNS-LINK

1.3 SHT-20模块电路

1)SHT20硬件接口图

2) sensor模块电路

1.4  0.9寸OLED模块介绍

笔者使用的0.9寸OLED模块, 驱动芯片为SSD1306,该模块采用I2C驱动方式,对外有四个引脚:

1) GND: 电源地

2)VCC: 电源正极 ,工作电压区间为3~5.5V

3)SCL: I2C 时钟引脚

4) SDA: I2C数据引脚

模块的原理图如下:

2 驱动接口实现

2.1 SHT20驱动接口

创建sht20x_port.c 文件实现如下代码:

/** \file$Id: sht20x_port.c 40486 2018-08-12 13:50:21Z tangmingfei2013@126.com $Copyright (c)tangmingfei2013@126.com Holding B.V.
All Rights Reserved.This source code and any compilation or derivative thereof is the proprietary
information of mingfei.tang Holding B.V. and is confidential in nature.
Under no circumstances is this software to be combined with any
Open Source Software in any way or placed under an Open Source License
of any type without the express written permission of mingfei.tang Holding B.V.
*/
/*******************************************************************************
* EXPORT INCLUDE FILES
*******************************************************************************/
#include "sht2x_port.h"/*******************************************************************************
* LOCAL INCLUDE FILES
*******************************************************************************/#define SHT2X_I2C_PORT_RCC_APB2         RCC_APB2_PERIPH_GPIOB
#define SHT2X_SCL_PIN                   GPIO_PIN_7
#define SHT2X_SDA_PIN                   GPIO_PIN_6
#define SHT2X_I2Cx_GPIOx                GPIOB#define I2C_SHT2X_SCL_1()             GPIO_SetBits(SHT2X_I2Cx_GPIOx, SHT2X_SCL_PIN)           /* SCL = 1 */
#define I2C_SHT2X_SCL_0()             GPIO_ResetBits( SHT2X_I2Cx_GPIOx, SHT2X_SCL_PIN)        /* SCL = 0 */#define I2C_SHT2X_SDA_1()             GPIO_SetBits( SHT2X_I2Cx_GPIOx, SHT2X_SDA_PIN)          /* SDA = 1 */
#define I2C_SHT2X_SDA_0()             GPIO_ResetBits( SHT2X_I2Cx_GPIOx, SHT2X_SDA_PIN)        /* SDA = 0 */I2C stru_Sht2xDrv;
/******************************************************************************
* EXPORTED FUNCTIONS
******************************************************************************/static void i2c_init_port( void )
{GPIO_InitType i2c1_gpio;/* Enable GPIO clock */RCC_EnableAPB2PeriphClk(SHT2X_I2C_PORT_RCC_APB2, ENABLE);/*PB6/PB8 -- SCL; PB7/PB9 -- SDA*/i2c1_gpio.Pin        = SHT2X_SCL_PIN | SHT2X_SDA_PIN;i2c1_gpio.GPIO_Speed = GPIO_Speed_2MHz;i2c1_gpio.GPIO_Mode  = GPIO_Mode_Out_OD;GPIO_InitPeripheral(SHT2X_I2Cx_GPIOx, &i2c1_gpio);
}static uint8_t i2c_SDA_READ( void )
{GPIO_InitType GPIO_InitStructure;uint8_t val;// set io as input GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.Pin       = SHT2X_SDA_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_InitPeripheral(SHT2X_I2Cx_GPIOx, &GPIO_InitStructure);// set io as output val = ((SHT2X_I2Cx_GPIOx->PID & SHT2X_SDA_PIN) != 0);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;GPIO_InitPeripheral(SHT2X_I2Cx_GPIOx, &GPIO_InitStructure);return  val;
}static uint8_t i2c_SCL_READ( void )
{GPIO_InitType GPIO_InitStructure;uint8_t val;// set io as input GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.Pin       = SHT2X_SCL_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_InitPeripheral(SHT2X_I2Cx_GPIOx, &GPIO_InitStructure);// set io as output val = ((SHT2X_I2Cx_GPIOx->PID & SHT2X_SCL_PIN) != 0);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;GPIO_InitPeripheral(SHT2X_I2Cx_GPIOx, &GPIO_InitStructure);   return val;
}static void set_i2c_scl_1( void )
{I2C_SHT2X_SCL_1();
}static void set_i2c_scl_0( void )
{I2C_SHT2X_SCL_0();
}static void set_i2c_sda_1( void )
{I2C_SHT2X_SDA_1();
}static void set_i2c_sda_0( void )
{I2C_SHT2X_SDA_0();
}void i2c_Sht2xDrvRegisterPort(void)
{stru_Sht2xDrv.IIC_InitPort = i2c_init_port;stru_Sht2xDrv.IIC_READ_SCL = i2c_SCL_READ;stru_Sht2xDrv.IIC_READ_SDA = i2c_SDA_READ;stru_Sht2xDrv.IIC_SCL_H = set_i2c_scl_1;stru_Sht2xDrv.IIC_SCL_L = set_i2c_scl_0;stru_Sht2xDrv.IIC_SDA_H = set_i2c_sda_1;stru_Sht2xDrv.IIC_SDA_L = set_i2c_sda_0;
}

2.2 OLED驱动接口

创建oled_port.c 文件,实现如下代码:

/** \file$Id: oled_port.c 40486 2018-08-12 13:50:21Z tangmingfei2013@126.com $Copyright (c)tangmingfei2013@126.com Holding B.V.
All Rights Reserved.This source code and any compilation or derivative thereof is the proprietary
information of mingfei.tang Holding B.V. and is confidential in nature.
Under no circumstances is this software to be combined with any
Open Source Software in any way or placed under an Open Source License
of any type without the express written permission of mingfei.tang Holding B.V.
*/
/*******************************************************************************
* EXPORT INCLUDE FILES
*******************************************************************************/
#include "oled_port.h"
/*******************************************************************************
* LOCAL INCLUDE FILES
*******************************************************************************/
#define OLED_I2C_PORT_RCC_APB2         RCC_APB2_PERIPH_GPIOB
#define OLED_SCL_PIN                   GPIO_PIN_11
#define OLED_SDA_PIN                   GPIO_PIN_12
#define OLED_I2Cx_GPIOx                GPIOB#define I2C_SCL_1()             GPIO_SetBits(OLED_I2Cx_GPIOx, OLED_SCL_PIN)           /* SCL = 1 */
#define I2C_SCL_0()             GPIO_ResetBits( OLED_I2Cx_GPIOx, OLED_SCL_PIN)        /* SCL = 0 */#define I2C_SDA_1()             GPIO_SetBits( OLED_I2Cx_GPIOx, OLED_SDA_PIN)          /* SDA = 1 */
#define I2C_SDA_0()             GPIO_ResetBits( OLED_I2Cx_GPIOx, OLED_SDA_PIN)        /* SDA = 0 */I2C stru_OledDrv;
/******************************************************************************
* EXPORTED FUNCTIONS
******************************************************************************/static void i2c_init_port( void )
{GPIO_InitType i2c1_gpio;/* Enable GPIO clock */RCC_EnableAPB2PeriphClk(OLED_I2C_PORT_RCC_APB2, ENABLE);/*PB11 -- SCL; PB12 -- SDA*/i2c1_gpio.Pin        = OLED_SCL_PIN | OLED_SDA_PIN;i2c1_gpio.GPIO_Speed = GPIO_Speed_2MHz;i2c1_gpio.GPIO_Mode  = GPIO_Mode_Out_OD;GPIO_InitPeripheral(OLED_I2Cx_GPIOx, &i2c1_gpio);
}static uint8_t i2c_SDA_READ( void )
{GPIO_InitType GPIO_InitStructure;uint8_t val;// set io as input GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.Pin       = OLED_SDA_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_InitPeripheral(OLED_I2Cx_GPIOx, &GPIO_InitStructure);// set io as output val = ((OLED_I2Cx_GPIOx->PID & OLED_SDA_PIN) != 0);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;GPIO_InitPeripheral(OLED_I2Cx_GPIOx, &GPIO_InitStructure);return  val;
}static uint8_t i2c_SCL_READ( void )
{GPIO_InitType GPIO_InitStructure;uint8_t val;// set io as input GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.Pin       = OLED_SCL_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_InitPeripheral(OLED_I2Cx_GPIOx, &GPIO_InitStructure);// set io as output val = ((OLED_I2Cx_GPIOx->PID & OLED_SCL_PIN) != 0);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;GPIO_InitPeripheral(OLED_I2Cx_GPIOx, &GPIO_InitStructure);   return val;
}static void set_i2c_scl_1( void )
{I2C_SCL_1();
}static void set_i2c_scl_0( void )
{I2C_SCL_0();
}static void set_i2c_sda_1( void )
{I2C_SDA_1();
}static void set_i2c_sda_0( void )
{I2C_SDA_0();
}void i2c_OledRegisterPort(void)
{stru_OledDrv.IIC_InitPort = i2c_init_port;stru_OledDrv.IIC_READ_SCL = i2c_SCL_READ;stru_OledDrv.IIC_READ_SDA = i2c_SDA_READ;stru_OledDrv.IIC_SCL_H = set_i2c_scl_1;stru_OledDrv.IIC_SCL_L = set_i2c_scl_0;stru_OledDrv.IIC_SDA_H = set_i2c_sda_1;stru_OledDrv.IIC_SDA_L = set_i2c_sda_0;
}

3 应用接口实现

3.1 软件框架

在i2c_master.c文件中实现了所有i2c功能函数

1)sht2x驱动部分

 - 在sht2x_port.c中实现和mcu相关的硬件接口

 - sht2x.c  应用层的驱动函数库

2)OLED驱动部分

 - 在oled_port.c中实现和mcu相关的硬件接口

 - oled.c  应用层的驱动函数库

3.2 sht2x I2C驱动调用

在sht2x.c中调用驱动程序

代码383行:注册驱动接口

代码384行: 初始化设备

3.3 OLED I2C驱动调用

代码55行: 注册驱动接口

代码57行:初始化IO端口

4 功能实现

4.1 功能介绍

本系统实现的功能如下:

1) 使用两组IO( 4个pin)分别实现I2C功能

2)一组i2c 驱动SHT20

3)  另一组i2c驱动OLED

4.2 代码实现

1)初始化OLED UI, 显示温度和湿度的log

2)数据显示函数

UI.c文件中实现了所有和显示相关的函数接口

代码48行:获取sht2x的数据

代码51~62行:处理和显示温度数据

代码66~77行:处理和显示湿度数据

5 测试

5.1 测试代码实现 

在main.c文件中实现所有功能函数的调用

代码36行:初始化sht20驱动

代码37行:初始化OLED,并显示UI

代码41行:实时读取sht20的温湿度数据

代码44行:OLED上实时更新温湿度数据

5.2 板卡运行代码 

编译代码,下载到板卡中,运行程序。

串口终端实时监测数据

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 强化学习编程实践-4-基于蒙特卡洛的方法
  • HQL案例大全之1. 查询没有学全所有课的学生的学号、姓名(特殊:应该先连接,在筛选)
  • 鸿蒙HarmonyOS应用开发为何选择ArkTS不是Java?
  • eNSP:防火墙设置模拟公司配置(二)
  • python入门基础知识·二
  • oslo_i18n学习小结
  • LocalAI离线安装部署
  • java八股文面试题
  • 智能家居装修怎么布线?智能家居网络与开关插座布置
  • java设计模式之:策略模式+工厂模式整合案例实战(一)
  • 【C++深入学习】类和对象(一)
  • QT5.12.9 通过MinGW64 / MinGW32 cmake编译Opencv4.5.1
  • [笔试题] 笔试题面试题
  • 218.贪心算法:分发糖果(力扣)
  • python如何与前端交互
  • 时间复杂度分析经典问题——最大子序列和
  • @jsonView过滤属性
  • 30秒的PHP代码片段(1)数组 - Array
  • 345-反转字符串中的元音字母
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • Java编程基础24——递归练习
  • Java小白进阶笔记(3)-初级面向对象
  • java中的hashCode
  • JS基础之数据类型、对象、原型、原型链、继承
  • Less 日常用法
  • MySQL数据库运维之数据恢复
  • nginx 配置多 域名 + 多 https
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • vue:响应原理
  • 将 Measurements 和 Units 应用到物理学
  • 开源SQL-on-Hadoop系统一览
  • 面试遇到的一些题
  • 一个完整Java Web项目背后的密码
  • 译有关态射的一切
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 走向全栈之MongoDB的使用
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • (04)odoo视图操作
  • (42)STM32——LCD显示屏实验笔记
  • (BFS)hdoj2377-Bus Pass
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (day6) 319. 灯泡开关
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (第二周)效能测试
  • (剑指Offer)面试题34:丑数
  • (三)模仿学习-Action数据的模仿
  • (转)h264中avc和flv数据的解析
  • (转)scrum常见工具列表
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET Core跨平台微服务学习资源
  • .net framework 4.0中如何 输出 form 的name属性。
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • /etc/sudoers (root权限管理)