通用型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,一经查实,立即删除!

相关文章

C语言基础and数据结构

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

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…

树的结构(b,b+树)

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

论文翻译: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)…

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

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

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

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

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

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

电压反馈型运算放大器的增益和带宽

简介 本教程旨在考察标定运算放大器的增益和带宽的常用方法。需要指出的是,本讨论适用于电压反馈(VFB)型运算放大器。 开环增益 与理想的运算放大器不同,实际的运算放大器增益是有限的。开环直流增益(通常表示为AVOL)指放大器在反馈环路未闭合时的增益…

借人工智能之手,编织美妙歌词篇章

在音乐的领域中,歌词宛如璀璨的明珠,为旋律增添了无尽的魅力和情感深度。然而,对于许多创作者来说,编织出美妙动人的歌词并非易事。但如今,随着科技的飞速发展,人工智能为我们带来了全新的创作可能。 “妙…

Cornerstone3D导致浏览器崩溃的踩坑记录

WebGL: CONTEXT_LOST_WEBGL: loseContext: context lost ⛳️ 问题描述 在使用vue3vite重构Cornerstone相关项目后,在Mac本地运行良好,但是部署测试环境后,在window系统的Chrome浏览器中切换页面会导致页面崩溃。查看Chrome的任务管理器&am…

浅析Kafka Streams消息流式处理流程及原理

以下结合案例&#xff1a;统计消息中单词出现次数&#xff0c;来测试并说明kafka消息流式处理的执行流程 Maven依赖 <dependencies><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-streams</artifactId><exclusio…

【三维AIGC】扩散模型LDM辅助3D Gaussian重建三维场景

标题&#xff1a;《Sampling 3D Gaussian Scenes in Seconds with Latent Diffusion Models》 来源&#xff1a;Glasgow大学&#xff1b;爱丁堡大学 连接&#xff1a;https://arxiv.org/abs/2406.13099 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何…

Spring Security学习笔记(一)Spring Security架构原理

前言&#xff1a;本系列博客基于Spring Boot 2.6.x依赖的Spring Security5.6.x版本 Spring Security中文文档&#xff1a;https://springdoc.cn/spring-security/index.html 一、什么是Spring Security Spring Security是一个安全控制相关的java框架&#xff0c;它提供了一套全…

海外ASO:iOS与谷歌优化的相同点和区别

海外ASO是针对iOS的App Store和谷歌的Google Play这两个主要海外应用商店进行的优化过程&#xff0c;两个不同的平台需要采取不同的优化策略&#xff0c;以下是对iOS优化和谷歌优化的详细解析&#xff1a; 一、iOS优化&#xff08;App Store&#xff09; 1、关键词覆盖 选择关…

用node.js写一个简单的图书管理界面——功能:添加,删除,修改数据

涉及到的模块&#xff1a; var fs require(‘fs’)——内置模块 var ejs require(‘ejs’)——第三方模块 var mysql require(‘mysql’)——第三方模块 var express require(‘express’)——第三方模块 var bodyParser require(‘body-parser’)——第三方中间件 需要…

打造你的智能家居指挥中心:基于STM32的多协议(zigbee、http)网关(附代码示例)

1. 项目概述 随着物联网技术的蓬勃发展&#xff0c;智能家居正逐步融入人们的日常生活。然而&#xff0c;市面上琳琅满目的智能家居设备通常采用不同的通信协议&#xff0c;导致不同品牌设备之间难以实现互联互通。为了解决这一难题&#xff0c;本文设计了一种基于STM32的多协…