STM32硬件接口I2C应用(基于BH1750)

目录

概述

1 STM32Cube控制配置I2C

1.1 I2C参数配置

1.2 使用STM32Cube产生工程

2 HAL库函数介绍

2.1 初始化函数

2.2 写数据函数

2.3 读数据函数

3 光照传感器BH1750

3.1 认识BH1750

3.2 BH1750寄存器

3.3 采集数据流程

4 BH1750驱动实现

4.1 接口函数实现

4.2 完整驱动代码

5 测试

6 逻辑分析仪捕捉波形


测试代码下载地址:

https://gitee.com/mftang/stm32_open_test_proj/tree/master/stm32_f407_proj


 

概述

本文主要介绍STM32F4的内部I2C接口的使用方法,包括使用STM32Cube配置i2c接口函数,还介绍了STM32 HAL库中的接口函数,为了验证接口函数的是否能够正常工作,还使用bh1750作为device,以I2C接口作为通信接口,以实现该芯片数据的读写操作。

1 STM32Cube控制配置I2C

STM32CubeMX 版本: 6.11

HAL库版本: STM32Cube_FW_F4_V1.27.1

1.1 I2C参数配置

STM32F407 的标准I2C接口最大支持100K工作频率,笔者选择最大工作频100k,以配置I2C的参数。

I2C使用的GPIO接口如下:

使用MCU类型和HAL库的版本

1.2 使用STM32Cube产生工程

 在配置完成项目后,点击GENERATE生成项目,打开项目后项目目录如下,和I2C相关的代码如下:

代码第40行:选择I2C2作为硬件接口

代码第41行:I2C通信速率为100K

代码第44行:定义地址位7bit

2 HAL库函数介绍

STM32 HAL库函数数量很多,本文仅介绍笔者使用的一些函数接口。其他函数在使用的时候在具体研究,而不许把每个函数搞清楚才去应用。

2.1 初始化函数

函数原型:

HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c);

参数介绍

hi2c:  指向I2C_HandleTypeDef结构体的指针,该结构体包含指定I2C的配置信息。

 一个使用案例: 如果已经初始化完成hi2c结构,初始化时,直接调用该结构体即可。

2.2 写数据函数

函数原型:

HAL_StatusTypeDef HAL_I2C_Master_Transmit(  I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)

参数介绍:

hi2c:  指向I2C_HandleTypeDef结构体的指针,该结构体包含指定I2C的配置信息。

DevAddress: 目标设备地址:设备的7位地址值在调用接口之前,必须将数据表向左移动

pData:            写数据指针

Size:               写数据大小

Timeout:         写数据超时时间

 2.3 读数据函数

函数原型:

HAL_StatusTypeDef HAL_I2C_Master_Receive( I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)

参数介绍:

hi2c:  指向I2C_HandleTypeDef结构体的指针,该结构体包含指定I2C的配置信息。

DevAddress: 目标设备地址:设备的7位地址值在调用接口之前,必须将数据表向左移动

pData:            读数据指针

Size:               读数据大小

Timeout:         读数据超时时间

3 光照传感器BH1750

3.1 认识BH1750

 光照传感器BH1750是一种高性能数字光照传感器。它采用I2C总线通信接口,可测量环境中的光照强度,并输出数字信号。BH1750传感器具有高分辨率、高灵敏度和宽动态范围的特点,能够适应不同亮度条件下的测量需求。

BH1750传感器具有两种工作模式:连续测量模式和单次测量模式。在连续测量模式下,传感器会以设定的时间间隔进行光照强度的测量,并将结果输出。而在单次测量模式下,传感器进行一次测量后便停止,并将结果输出。用户可以根据实际需求选择适合的工作模式。

BH1750传感器还具有灵敏度调节功能,可以根据环境的亮度调整传感器的灵敏度,以确保测量结果的准确性。

光照传感器BH1750广泛应用于室内照明控制、户外光照强度监测、智能电子设备的自适应亮度调节等领域。它能够帮助节能减排、提升用户体验、增加设备智能化程度。

3.2 BH1750寄存器

3.3 采集数据流程

4 BH1750驱动实现

4.1 接口函数实现

1)写寄存器函数

代码第26行: 调用master发送数据至slave函数

2)读寄存器函数

代码第37行: 调用master读数据函数

 3)修改模式函数

4)设置精度函数

4.2 完整驱动代码

 1)创建bh1750.c文件,编写如下代码:

/* USER CODE BEGIN Header */
/**
******************************************************************************
* File Name            : bh1750.c
* Description          : I2C drive based on STM32F4
* STM32 HAL library ver: STM32Cube_FW_F4_V1.27.1
* 
******************************************************************************
* @attention
*
* Copyright (c) 2024~2029 mingfei.tang
* All rights reserved.
*
*************************************************************************
*/
/* USER CODE END Header */
#include "bh1750.h"static uint8_t s_MTReg;    /* 灵敏度倍率 */
static uint8_t s_Mode;     /* 测量模式 */static uint8_t bh1750_WeReg(  uint8_t *pData, uint16_t Size )
{HAL_StatusTypeDef status;status = HAL_I2C_Master_Transmit( &hi2c2, BH1750_SLAVE_ADDRESS, pData, Size, 1000);if( status == HAL_OK)return BH1750_OK;elsereturn BH1750_ERROR; 
}static uint8_t bh1750_RdReg( uint8_t *pData, uint16_t Size )
{HAL_StatusTypeDef status;status = HAL_I2C_Master_Receive( &hi2c2, BH1750_SLAVE_ADDRESS, pData, Size, 1000);if( status == HAL_OK)return BH1750_OK;elsereturn BH1750_ERROR; 
}void BH1750_ChageMode(uint8_t _ucMode)
{uint8_t cmd;if (_ucMode == 1)           /* 连续高分测量模式1 */{cmd = BHOP_CON_H_RES;bh1750_WeReg(&cmd, 1);    s_Mode = 1;             /* 测量模式1,分辨率 1 lux*/}else if (_ucMode == 2)      /* 连续高分测量模式2 */{cmd = BHOP_CON_H_RES2;bh1750_WeReg(&cmd, 1);  s_Mode = 2;             /* 测量模式2, 分辨率 0.5 lux */        }else if (_ucMode == 3)     /* 连续低分测量模式 */{cmd = BHOP_CON_L_RES;bh1750_WeReg(&cmd, 1);s_Mode = 3;            /* 测量模式3,低分辨率 4 lux*/        }
}void BH1750_AdjustSensitivity(uint8_t _ucMTReg)
{uint8_t cmd;if (_ucMTReg <= 31){_ucMTReg = 31;}else if (_ucMTReg >= 254){_ucMTReg = 254;}s_MTReg = _ucMTReg;cmd = 0x40 + (s_MTReg >> 5);bh1750_WeReg(&cmd,1);            /* 更改高3bit */cmd = 0x60 + (s_MTReg & 0x1F);bh1750_WeReg(&cmd,1);            /* 更改低5bit *//* 更改量程范围后,需要重新发送命令设置测量模式 */BH1750_ChageMode(s_Mode);
}uint16_t BH1750_ReadData(void)
{uint8_t buff[2];bh1750_RdReg( buff, 2);return (buff[0] << 8) + buff[1];
}float BH1750_GetLux(void)
{uint16_t usLight;float lux;usLight = BH1750_ReadData();/* 计算光强度 = 16位寄存器值 / 1.2  * (69 / X) */lux = (float)(usLight * 5 * 69) / (6 * s_MTReg);if (s_Mode == 2)    /* 高分辨率测量模式2 */{lux = lux / 2;}return lux;
}void bh1750_test( void )
{uint8_t cmd;float fLux;cmd = BHOP_POWER_ON;            /* 芯片上电 */bh1750_WeReg(&cmd, 1); BH1750_ChageMode(2);             /* 高分辨率连续测量 */BH1750_AdjustSensitivity(69);    /* 芯片缺省灵敏度倍率 = 69 */while(1){fLux = BH1750_GetLux();printf("Ambient Light = %6.2f lux  \r",fLux);HAL_Delay(100);}
}/* End of this file */

2)创建bh1750.h文件,编写如下代码:

/* USER CODE BEGIN Header */
/********************************************************************************* File Name          : bh1750.h* Description        : I2C drive based on STM32F4* ******************************************************************************* @attention** Copyright (c) 2024~2029 mingfei.tang* All rights reserved.***************************************************************************/
/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __BH1750_H
#define __BH1750_H#ifdef __cplusplusextern "C" {
#endif#include "stdio.h"
#include "main.h"#define BH1750_OK                1
#define BH1750_ERROR             0#define bsp_DelayMS             HAL_Delay
#define BH1750_SLAVE_ADDRESS    0x46        /* I2C从机地址 *//* 操作码 Opercode 定义 */
enum
{BHOP_POWER_DOWN = 0x00,        /* 进入掉电模式。芯片上电后缺省就是PowerDown模式 */BHOP_POWER_ON   = 0x01,        /* 上电,等待测量命令 */BHOP_RESET      = 0x07,        /* 清零数据寄存器 (Power Down 模式无效) */BHOP_CON_H_RES  = 0x10,        /* 连续高分辨率测量模式  (测量时间 120ms) (最大 180ms)*/BHOP_CON_H_RES2 = 0x11,        /* 连续高分辨率测量模式2 (测量时间 120ms)*/BHOP_CON_L_RES  = 0x13,        /* 连续低分辨率测量模式 (测量时间 16ms)*/BHOP_ONE_H_RES  = 0x20,        /* 单次高分辨率测量模式 , 之后自动进入Power Down */BHOP_ONE_H_RES2 = 0x21,        /* 单次高分辨率测量模式2 , 之后自动进入Power Down  */BHOP_ONE_L_RES  = 0x23,        /* 单次低分辨率测量模式 , 之后自动进入Power Down  */
};void bh1750_test( void );#ifdef __cplusplus
}
#endif#endif /*__BH1750_H */

5 测试

1)编写测试代码

void bh1750_test( void )
{uint8_t cmd;float fLux;cmd = BHOP_POWER_ON;            /* 芯片上电 */bh1750_WeReg(&cmd, 1); BH1750_ChageMode(2);             /* 高分辨率连续测量 */BH1750_AdjustSensitivity(69);    /* 芯片缺省灵敏度倍率 = 69 */while(1){fLux = BH1750_GetLux();printf("Ambient Light = %6.2f lux  \r",fLux);HAL_Delay(100);}
}

2)编译代码,下载到板卡中,运行代码得到结果如下:

6 逻辑分析仪捕捉波形

 1)读取lux值

2) 配置参数函数

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

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

相关文章

vite+js配置

vite js 配置路径 npm install types/node --save-dev vite.config.js import { defineConfig } from vite import vue from vitejs/plugin-vue //需要引入 import path from path// https://vitejs.dev/config/ export default defineConfig({plugins: [vue()],resolve: {a…

港口与航运3D三维虚拟仿真展区让更多人了解到海洋知识

在短短20天内&#xff0c;搭建起200多家线上3D展厅&#xff0c;听起来似乎是一项艰巨的任务。然而&#xff0c;对于我们的3d云展平台而言&#xff0c;这早已成为常态。连续三年&#xff0c;我们已成功为众多会展公司在短时间内构建出几百家甚至上千家的线上3D展会&#xff0c;见…

简单的利用有限脉冲响应(FIR)滤波器对心电信号进行降噪(Python)

代码很简单。 import numpy as np import matplotlib.pyplot as plt#------------------------Bandstop Filter Function------------------------ def bandstop(M,low,high,Fs):#50Hz removalk1 int( (low/Fs)*M) # index 22k2 int( (high/Fs)*M) # index 27#DC removalk0 …

关于C++的IO流简单总结

基础IO流 C的IO以面向对象的形式实现, 同时兼容了C语言面向过程的IO方式 C 标准库提供了四个基本流对象&#xff1a; cin&#xff1a;用于从标准输入&#xff08;通常是键盘&#xff09;读取数据。 cout&#xff1a;用于向标准输出&#xff08;通常是控制台&#xff09;写入…

怎么使用Stable diffusion中的models

Stable diffusion中的models Stable diffusion model也可以叫做checkpoint model&#xff0c;是预先训练好的Stable diffusion权重&#xff0c;用于生成特定风格的图像。模型生成的图像类型取决于训练图像。 如果训练数据中从未出现过猫的图像&#xff0c;模型就无法生成猫的…

面试八-存泄漏是什么,有哪几种,怎么解决?

一、内存泄漏几种情况 当使用基类指针指向派生类对象时&#xff0c;如果基类的析构函数不是虚函数&#xff0c;那么在使用基类指针来删除这个对象时&#xff0c;只会调用基类的析构函数&#xff0c;而不会调用派生类的析构函数。这就导致了派生类中的资源无法正确释放&#xff…

22公司斩获亚洲品牌经济峰会“亚洲数字化服务领军企业奖”

5月25日&#xff0c;以“亚洲新势力&#xff1a;创新、融合与可持续发展”为主题的亚洲品牌经济峰会2024深圳会议在深圳益田威斯汀酒店举办&#xff0c;本次活动由中国亚洲经济发展协会指导&#xff0c;由亚洲国际品牌研究院主办&#xff0c;旨在搭建品牌创新与经济发展交流平台…

B站pink老师CSS学习(一)

文章目录 一、CSS基础选择器1.标签选择器2.类选择器3. id选择器4.通配符选择器 二、字体属性1.字体2.字体大小3.字体粗细4.文字样式5.复合属性 三、文本属性1.文本颜色2.对齐文本3.装饰文本4.文本缩进5.行间距 四、CSS引入方式1. 内部样式表2.行内样式表3.外部样式表 一、CSS基…

CTF流量分析之wireshark使用

01.基本介绍 在CTF比赛中&#xff0c;对于流量包的分析取证是一种十分重要的题型。通常这类题目都是会提供一个包含流量数据的pcap文件&#xff0c;参赛选手通过该文件筛选和过滤其中无关的流量信息&#xff0c;根据关键流量信息找出flag或者相关线索。 pcap流量包的分析通常…

响应式页面布局处理-一篇打尽

纯pc端响应式 pc端平常用到的响应式布局 大致就如下三种&#xff0c;当然也会有其他方法&#xff0c;欢迎评论区补充 将div height、width设置成100% flex布局 flex布局主要是将flex-wrap: wrap&#xff0c; 最后&#xff0c;你可以通过给子元素设置 flex 属性来控制它们的…

布隆过滤器-详解及使用

一、什么是布隆过滤器 1、简介 布隆过滤器是一个很长的二进制向量和一系列随机映射函数。可以用于检索一个元素是否在一个集合中。。理解为SET集合。 布隆过滤器其内部维护了一个全为 0 的 bit 数组&#xff0c;需要说明的是&#xff0c;布隆过滤器有一个误判的概念&#xf…

如何搭建雾锁王国多人联机服务器,搭建教程分享

雾锁王国&#xff08;Enshrouded&#xff09;是一款融合了生存、制作以及动作RPG战斗的游戏&#xff0c;2024年1月24日在Steam平台以抢先体验形式发售&#xff0c;支持中文。游戏背景设定在一个基于体素构筑的辽阔大陆上。玩家将在这个开放世界中自由选择前进的方向&#xff0c…

机器视觉HALCON:3.图像获取,运算,率噪,滤波(边缘),锐化

目录 图像获取生成单通道图像图像运算加法运算减法运算乘法运算除法 仿射变换图像平滑&#xff08;噪点处理&#xff09;高斯滤波均值滤波中值滤波多图像均值 边缘滤波索贝尔滤波凯尼滤波 图像锐化索贝尔锐化拉普拉斯锐化高通滤波锐化几种锐化方式对比 图像获取 用到的函数&…

8个最佳实践,助你打造成功的短剧平台开发团队

当涉及到跨境电商平台开发&#xff0c;成功的团队至关重要。在这篇文章中&#xff0c;我将分享8个最佳实践&#xff0c;助你打造成功的短剧平台开发团队。无论是经验丰富的团队还是初创企业&#xff0c;这些实践都能为你的团队带来价值&#xff0c;提高开发效率&#xff0c;确保…

lua 计算第几周

需求 计算当前赛季的开始和结束日期&#xff0c;2024年1月1日周一是第1周的开始&#xff0c;每两周是一个赛季。 lua代码 没有处理时区问题 local const 24 * 60 * 60 --一整天的时间戳 local server_time 1716595200--todo:修改服务器时间 local date os.date("*t…

快速复制成功模式:解读SaaS裂变工具的核心价值

在数字化快速发展的今天&#xff0c;企业如何在竞争激烈的市场中迅速站稳脚跟&#xff0c;成为许多企业家和管理者关注的焦点。SaaS裂变工具作为一种创新的解决方案&#xff0c;以其独特的优势&#xff0c;帮助企业快速复制成功模式&#xff0c;实现业务的快速增长。 SaaS裂变工…

Mysql 单行转多行,把逗号分隔的字段拆分成多行

一、拆分前后的数据 二、执行SQL select substring_index(substring_index(a.gzlx,,,b.help_topic_id1),,,-1) gzlxname, a.gzlx,a.* from dt_task_zxgz_info a join mysql.help_topic b on b.help_topic_id < (length(a.gzlx) - length(replace(a.gzlx,,,))1) 三、解释说…

cobalt strike基础测试

下载链接4.3&#xff1a;https://pan.baidu.com/s/1E_0t30tFWRiE5aJ7F-ZDPg 链接4.0&#xff1a;https://pan.baidu.com/s/1SkMmDem3l6bePqIDgUz2mA 提取码&#xff1a;burp 一、简介&#xff1a; cobalt strike(简称CS)是一款团队作战渗透测试神器&#xff0c;分为客户端…

使用大模型LLM实现销售AI

想象一个场景&#xff0c;客户通过聊天窗口咨询一款产品。销售AI首先使用LLM解析客户的问题&#xff0c;然后通过智能代理查询数据库获取产品详细信息&#xff0c;并以自然而友好的方式回应客户。 在对话过程中&#xff0c;AI可以评估客户的兴趣&#xff0c;并主动提供促销信息…

905. 按奇偶排序数组 - 力扣

1. 题目 给你一个整数数组 nums&#xff0c;将 nums 中的的所有偶数元素移动到数组的前面&#xff0c;后跟所有奇数元素。 返回满足此条件的 任一数组 作为答案。 2. 示例 3. 分析 开辟一个数组res用来保存操作过后的元素。第一次遍历数组只插入偶数&#xff0c;第二次遍历数组…