通用型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 板卡运行代码 

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

串口终端实时监测数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/871155.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3 学习笔记08 -- computed 和 watch

vue3 学习笔记08 – computed 和 watch computed computed 是 Vue 3 中用于创建计算属性的重要 API,它能够根据其它响应式数据动态计算出一个新的值,并确保在依赖数据变化时自动更新。 基本用法 squaredCount 是一个计算属性,它依赖于 count…

C语言基础and数据结构

C语言程序和程序设计概述 程序:可以连续执行的一条条指令的集合 开发过程:C源程序(.c文件) --> 目标程序(.obj二进制文件,目标文件) --> 可执行文件(.exe文件) -->结果 在任何机器上可以运行C源程序生成的 .exe 文件 没有安装C语言集成开发环境,不能编译C语言程…

常见算法和数据结构(如排序、搜索、链表、树等)。

在计算机科学中,算法和数据结构是解决问题的基石。下面是一些常见的算法和数据结构的简要描述: 常见算法 排序算法: 冒泡排序:通过重复遍历要排序的数列,比较每对相邻元素的值,若发现顺序错误则交换之&am…

Scala学习笔记16: 注解

目录 第十六章 注解1- 常见的Scala注解1.1 标准注解1.2 Java注释 2- 自定义注解3- 注解的使用场景3.1 编译时处理3.2 运行时反射 4- 注解参数end 第十六章 注解 Scala 中的注解 (Annotations) 是一种元编程工具, 用于向编译器、运行时或其他工具提供元数据 ; 注解可以应用于各…

Open-TeleVision——通过VR沉浸式感受人形机器人视野的远程操作

前言 7.3日,我司大模型机器人(具身智能)线下营群里的一学员发了《Open-TeleVision: Teleoperation with Immersive Active Visual Feedback》这篇论文的链接,我当时快速看了一遍,还是有价值的一个工作(其有受mobile aloha工作的启发)&#x…

锂电池剩余寿命预测 | Matlab基于Transformer的锂电池剩余寿命预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab基于Transformer的锂电池剩余寿命预测 Matlab基于Transformer的锂电池剩余寿命预测(单变量) 运行环境Matlab2023b及以上 NASA数据集,B0005号电池数据训练,B00…

web前端开发——标签一(注释、标题、段落、换行、格式、图片)

今天我来针对web前端开发讲解标签一 目录 html标签_标题&段落&换行 注释标签:Ctrl/ 标题标签: h1-h6 段落标签: 换行标签: 格式标签 图片标签_src属性 html标签_标题&段落&换行 注释标签:Ctrl/ Ctrl/ &…

小程序-设置环境变量

在实际开发中,不同的开发环境,调用的接口地址是不一样的 例如:开发环境需要调用开发版的接口地址,生产环境需要正式版的接口地址 这时候,我们就可以使用小程序提供了 wx.getAccountInfoSync() 接口,用来获取…

查找PPT中某种字体的全部对应文字

本文章的目的是找到某种字体的文字,而不是替换某种字体的文字,也不是将某种字体全部替换为另外一种文字。 第一步:在PPT中按下ALTF11 出现以下窗口 第二步:点击插入->模块 第三步:将以下代码输入到窗体中 Sub F…

在大型企业级应用中,如何优化 XML 数据的存储和检索效率,以满足高并发访问需求?

在大型企业级应用中,优化XML数据的存储和检索效率可采取以下措施: 数据库选择:选择适合XML存储和查询的数据库,如Oracle、MySQL、PostgreSQL等。这些数据库提供了专门的XML存储和查询功能,能够更高效地处理XML数据。 …

系统Doze白名单常用接口

获取Doze白名单列表:DeviceIdleController.getUserPowerWhitelist是否Doze白名单:DeviceIdleController.isPowerSaveWhitelistAppDoze白名单变化广播:PowerManager.ACTION_POWER_SAVE_WHITELIST_CHANGED设置Doze白名单:DeviceIdleController.…

【常用知识点-Linux】SSH免密登陆

Author:赵志乾 Date:2024-07-12 Declaration:All Right Reserved!!! 1. 简介 SSH免密登录是一种基于公钥加密技术的安全认证方式,其原理如下: 生成密钥对:客户端生成一对…

树的结构(b,b+树)

无论线性表,栈还是队列,都是一对一,查询的时候,效率较低,数据量比较的大的情况 1.树的定义 一种数据结构,有层次关系的集合,根朝上,叶朝下 除了根节点外,每个子节点都…

【25届秋招备战C++】算法篇-排序算法合集

【25届秋招备战C】算法篇-排序算法合集 一、简介二、解题思路三、模板四、参考 一、简介 排序算法是计算机科学中的基本算法之一,用于将一组数据按照特定的顺序(升序或降序)进行排列。排序算法广泛应用于数据管理和检索系统,提高…

论文翻译:Large Language Models for Education: A Survey and Outlook

https://arxiv.org/abs/2403.18105 目录 教育领域的大型语言模型:一项调查和展望摘要1. 引言2. 教育应用中的LLM2.1 概述2.2 学习辅助2.2.1 问题解决(QS) 2.2.2 错误纠正(EC)2.2.3 困惑助手(CH)…

第一节变量、运算符、表达式、输入与输出

Hello World package org.wyp;public class Main {//定义了一个类Mainpublic static void main(String[] args) {System.out.println("Hello World");} }变量 byte(字节) 01010111 一个有8位二进制数 每一个0/1叫一位,简称为bit 1byte8bit 一个byte就是一个字节,一…

解决elementUI列表的疑难杂症,排序显示错乱的问题

大家好,在使用elementUI表格时,有时会出现一些意料之外的问题,比如数据排序正常但表格显示、排序错乱等。在网上搜索后一般有2种解决方法:1.给表格每一项的el-table-column添加唯一的id用于区分。2.给表格每一项的el-table-column…

昇思训练营打卡第二十四天(LSTM+CRF序列标注)

LSTM(Long Short-Term Memory,长短时记忆网络)是一种特殊的循环神经网络(RNN),由Hochreiter和Schmidhuber在1997年提出。它旨在解决传统RNN在处理长距离依赖问题时出现的梯度消失和梯度爆炸问题。以下是LST…

羧基聚乙二醇生物素的制备方法;COOH-PEG-Biotin

羧基聚乙二醇生物素(COOH-PEG-Biotin)是一种常见的生物分子聚合物,具有多种应用,特别是在生物实验、药物研发和生物技术等领域。以下是对该化合物的详细解析: 一、基本信息 名称:羧基聚乙二醇生物素&#x…

数据结构:链表详解 (c++实现)

前言 对于数据结构的线性表,其元素在逻辑结构上都是序列关系,即数据元素之间有前驱和后继关系。 但在物理结构上有两种存储方式: 顺序存储结构: 使用此结构的线性表也叫 顺序表物理存储上是连续的,因此可以随机访问…