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

news2024/12/25 9:19:50

通用型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.coloradmin.cn/o/1923505.html

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

相关文章

捷配笔记-PCB阻焊颜色对产品有什么影响?

阻焊层也称为阻焊层或阻焊剂。它是一种薄的聚合物层,应用于(PCB)。阻焊层的目的是保护PCB表面,并有助于防止焊桥。焊桥是两个导体之间的无意连接,通常是由于存在一小块焊料。需要注意的是,阻焊层被视为其单…

SSM整合及使用

SSM整合 介绍 SSM(SpringSpringMVCMyBatis)框架集由Spring、MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容),常作为数据源较简单的web项目的框架。 步骤 SSM整合主要是将各个框架的核心组件都交给sprin…

【机器学习】和【人工智能】在航空航天中的应用

作者主页: 知孤云出岫 目录 引言机器学习和人工智能在航空航天中的应用1. 预测性维护2. 飞行路径优化3. 自动驾驶飞行器 未来展望1. 增强人机协作2. 更智能的空中交通管理3. 高效的航空制造 结论参考文献 引言 随着科技的迅猛发展,机器学习和人工智能(…

Goland 通道

channel通道 目录 channel通道 channel介绍 channel基本使用 有缓存通道和无缓存通道的区别 通道的初始化,写入数据到通道,从通道读取数据及基本的注意事项 channel的关闭和遍历 channel的关闭 为什么关闭 如何优雅地关闭通道 channel的遍历 chan…

亚马逊插件安装教程,新手必学的两个选品步骤

亚马逊插件安装教程,跟卖新手必学,选品两个步骤。 大家好,今天讲下erp的插件下载和跟卖采集。erp更新到13.8版本了。 点击右上角的插件下载,已经下载到桌面了,已被压缩。 点击设置,选择扩展,…

python-亲和数(赛氪OJ)

[题目描述] 古希腊数学家毕达哥拉斯在自然数研究中发现,220 的所有真约数(即不是自身的约数)之和为: 1245101120224455110=284 。 而 284 的所有真约为 1 、 2 、 4 、 71 、 142 ,加起来恰好为 220 。人们对这样的数感到很惊奇&a…

【研路导航】重庆大学计算机保研面试真题分享交流

写在前面 在保研的道路上,面试是非常重要的一环。这里是成功保研到重庆大学的学长的计算机保研面试的部分真题及详细解答 ! Q 快速排序和合并排序: 快速排序(quicksort) 和合并排序(merge sort) 两种方法都将输入的待排序序列划分为2个子序列&#xf…

centos单机配置多个内网IP地址

centos单机配置多个内网IP地址 引配置1. 查看当前网络IP配置2. 打开网络配置目录3. 设置静态IP4. 编辑ifcfg-eno1:15. 重启网络配置 引 同一个局域网,但是对接的多个子系统使用了不同的网段,如一个系统主机IP地址是192.168.10.1,另一个系统主…

2024 辽宁省大学数学建模竞赛A题 风切变影响及处置 完整思路 代码结果分享(仅供学习)

风切变对航空安全会构成危害。航空人员需了解相关知识,掌握相应技术,从而在遭遇上述天气时最大程度的规避风险,保证飞行安全。 风切变是指在大气中相对比较短的距离内或时间段内产生的风速大小、方向大幅度变化的现象。通常将发生在距离地面…

Rust Hello

首先还是安装: 一定要换源,否则真的太慢了。 curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh 就是~/.cargo/config [source.crates-io] # 替换成你偏好的镜像源 replace-with tuna# 清华大学 5mb [source.tuna] registry "htt…

课程的概述

课程概述 课程类型 课程理论流派 制约课程开发的因素 课程设计的概念及两种模式 课程内容 课程评价 新课程改革理念

python基础语法 005 函数1-2 函数作用域

1 函数续 1.7 函数作用域 1.7.1 全局变量 定义在函数外部的变量全局变量在函数内部和函数外部都可以访问使用 a 100 def run():print("a {}".format(a))print(a) print(run())1.7.2 局部变量 函数是一个黑盒子,外面看不到盒子里面的东西&#xff0…

QEMU模拟器源码编译与使用

QEMU模拟器源码编译与使用 1 编译MySBIBenOS2 编译QEMU3 QEMU运行MySBIBenOS4 使用gdb调试QEMU5 通过QEMU调试指令6 小结 本文属于 《RISC-V指令集差分测试(DiffTest)系列教程》之一,欢迎查看其它文章。 1 编译MySBIBenOS 参考《NEMU模拟器…

AI绘画Midijourney操作技巧及变现渠道喂饭式教程!

前言 盘点Midijourney(AIGF)热门赚米方法,总有一种适合你之AI绘画操作技巧及变现渠道剖析 【表情包制作】 首先我们对表情包制作进行详细的讲解: 当使用 Midjourney(AIGF) 绘画来制作表情包时&#xff…

【Linux网络】网络基础

本篇博客整理了 Linux 网络编程的前置知识,例如网络的发展、协议和协议栈分层、网络通信原理、网络地址等,为后续进入 Linux 网络编程作铺垫。 目录 一、网络发展 二、网络协议 1)协议的作用 2)协议栈 3)协议分层…

自动驾驶(萝卜快跑)是毁灭出租司机工作机会的灾难?

引言 自动驾驶技术的飞速发展在全球范围内引发了广泛的讨论和担忧,特别是在中国,自动驾驶出租车服务“萝卜快跑”成为了热门话题。本文探讨自动驾驶对出租司机工作机会的影响,以及这种技术变革背后的社会经济因素。 自动驾驶的历史与现状 …

yoloV8导出engine模型

yoloV8导出engine模型 引言: 目的是TensorRT加速YOLO实例分割模型。 本博客记录达成此目的所需的步骤,及步骤中可能遇到的问题。 as follow: 1. 首先导出onnx模型的脚本命令: yolo export modelbest.pt formatonnx opset12 simpl…

全网都在找数学建模美赛模版,免费直接复制,无需关注公众号!!!

文件夹结构如下 美版论文模版预览(截选) tex文件代码如下 \documentclass{mcmthesis} \mcmsetup{CTeX false, % 使用 CTeX 套装时,设置为 truetcn 1111111, problem ABCDEF,sheet true, titleinsheet true, keywordsinsheet true,titlepage false, abstra…

C++ | Leetcode C++题解之第226题翻转二叉树

题目: 题解: class Solution { public:TreeNode* invertTree(TreeNode* root) {if (root nullptr) {return nullptr;}TreeNode* left invertTree(root->left);TreeNode* right invertTree(root->right);root->left right;root->right …

深度学习5 神经网络

生物神经网络是指人的大脑,这是人工神经网络的技术原型。根据生物神经网络的原理,人们用计算机复现了简化的神经网络。当然,人工神经网络是机器学习的一大分支。 1.基本组成 1.1神 经 元 神经元是神经网络的基本组成。激活函数又称作激励函…