历史上的今天
返回首页

历史上的今天

今天是:2025年07月21日(星期一)

正在发生

2021年07月21日 | 【STM32Cube_14】使用硬件I2C读写环境光强度传感器(BH1750)

2021-07-21 来源:eefocus

本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件I2C外设读取环境光强度传感器数据(BH1750)。

1. 准备工作

硬件准备

  • 开发板
    首先需要准备一个开发板,这里我准备的是STM32L4的开发板(BearPi):
    mark

  • BH1750模块
    BH1750FV1是两线式串行总线接口(IIC)的16位数字输出型环境光强度传感器,利用它的高分辨率可以探测较大范围内的光照强度变化(1lx - 65535lx)。
    mark

BH1750的原理图如下:

mark

软件准备

  • 需要安装好Keil - MDK及芯片对应的包,以便编译和下载生成的代码;

 

 

2.生成MDK工程

选择芯片型号

打开STM32CubeMX,打开MCU选择器:
mark

搜索并选中芯片STM32L431RCT6:
mark

配置时钟源

  • 如果选择使用外部高速时钟(HSE),则需要在System Core中配置RCC;

  • 如果使用默认内部时钟(HSI),这一步可以略过;

这里我都使用外部时钟:
mark

配置串口

小熊派开发板板载ST-Link并且虚拟了一个串口,原理图如下:

mark

这里我将开关拨到AT-MCU模式,使PC的串口与USART1之间连接。

接下来开始配置USART1:

mark

配置硬件I2C

首先查看小熊派开发板的原理图,确定EEPROM接在哪个I2C接口上,如图:

mark

接下来开始配置I2C接口1:

mark

配置时钟树

STM32L4的最高主频到80M,所以配置PLL,最后使HCLK = 80Mhz即可:

mark

生成工程设置

mark

代码生成设置

最后设置生成独立的初始化文件:

mark

生成代码

点击GENERATE CODE即可生成MDK-V5工程:

mark

3. 在MDK中编写、编译、下载用户代码

修改I2C初始化代码的小BUG

mark

重定向printf( )函数

参考:【STM32Cube_09】重定向printf函数到串口输出的多种方法。

4. 编写BH1750驱动程序

参考bh1750FVI中文数据手册.pdf进行编程。

宏定义BH1750器件地址

BH1750的器件地址由ADDR端口的高低电平决定:


mark


结合原理图,在 bh1750_i2c_drv.h 头文件中可以定义如下:


#define BH1750_ADDR_WRITE 0x46 //01000110

#define BH1750_ADDR_READ 0x47 //01000111

枚举BH1750工作模式

参考数据手册在 bh1750_i2c_drv.h 头文件中进行如下枚举定义:


typedef enum

{

POWER_OFF_CMD = 0x00, //断电:无激活状态

POWER_ON_CMD = 0x01, //通电:等待测量指令

RESET_REGISTER = 0x07, //重置数字寄存器(在断电状态下不起作用)

CONT_H_MODE = 0x10, //连续H分辨率模式:在11x分辨率下开始测量,测量时间120ms

CONT_H_MODE2 = 0x11, //连续H分辨率模式2:在0.51x分辨率下开始测量,测量时间120ms

CONT_L_MODE = 0x13, //连续L分辨率模式:在411分辨率下开始测量,测量时间16ms

ONCE_H_MODE = 0x20, //一次高分辨率模式:在11x分辨率下开始测量,测量时间120ms,测量后自动设置为断电模式

ONCE_H_MODE2 = 0x21, //一次高分辨率模式2:在0.51x分辨率下开始测量,测量时间120ms,测量后自动设置为断电模式

ONCE_L_MODE = 0x23 //一次低分辨率模式:在411x分辨率下开始测量,测量时间16ms,测量后自动设置为断电模式

} BH1750_MODE;


发送命令和读取数据

接下来编写bh1750_i2c_drv.c驱动文件,参考数据手册中的这部分:

mark

本驱动程序底层使用 HAL 库的 IIC 初始化文件,所以包含如下头文件:


#include "bh1750_i2c_drv.h"

#include "i2c.h"

根据上图,发送命令的函数如下:


/**

* @brief 向BH1750发送一条指令

* @param cmd —— BH1750工作模式指令(在BH1750_MODE中枚举定义)

* @retval 成功返回HAL_OK

*/

uint8_t BH1750_Send_Cmd(BH1750_MODE cmd)

{

return HAL_I2C_Master_Transmit(&hi2c1, BH1750_ADDR_WRITE, (uint8_t*)&cmd, 1, 0xFFFF);

}

接收光照强度数据的函数如下:


/**

* @brief 从BH1750接收一次光强数据

* @param dat —— 存储光照强度的地址(两个字节数组)

* @retval 成功 —— 返回HAL_OK

*/

uint8_t BH1750_Read_Dat(uint8_t* dat)

{

return HAL_I2C_Master_Receive(&hi2c1, BH1750_ADDR_READ, dat, 2, 0xFFFF);

}

数据转换函数

根据数据手册中给出的公式,编写将从BH1750读出的两个字节数据转换为对应强度值的函数:


/**

* @brief 将BH1750的两个字节数据转换为光照强度值(0-65535)

* @param dat —— 存储光照强度的地址(两个字节数组)

* @retval 成功 —— 返回光照强度值

*/

uint16_t BH1750_Dat_To_Lux(uint8_t* dat)

{

uint16_t lux = 0;

lux = dat[0];

lux <<= 8;

lux += dat[1];

lux = (int)(lux / 1.2);


return lux;

}

5. 测试驱动程序

在main.c中测试驱动程序是否正常:


int main(void)

{

uint8_t dat[2] = {0}; //dat[0]是高字节,dat[1]是低字节


HAL_Init();

SystemClock_Config();

MX_GPIO_Init();

MX_I2C1_Init();

MX_USART1_UART_Init();


while (1)

{

if(HAL_OK == BH1750_Send_Cmd(ONCE_H_MODE))

{

//printf("send okn");

}

else

{

//printf("send failn");

}


HAL_Delay(200);

if(HAL_OK == BH1750_Read_Dat(dat))

{

//printf("recv okn");

printf("current: %5d luxn", BH1750_Dat_To_Lux(dat));


}

else

{

//printf("recv fail");

}


HAL_Delay(1000);

}

}


编译下载运行,测试结果如下:

mark

至此,我们已经学会如何使用硬件IIC接口读取环境光强度传感器数据(BH1750),下一节将讲述如何使用硬件IIC接口读取温湿度传感器数据并使用软件CRC校验(SHT30)。

推荐阅读

史海拾趣

冠西电子(COSMO)公司的发展小趣事

进入21世纪,冠西电子不断加大在研发方面的投入,成功突破了一系列技术难题,特别是在光耦合器和继电器领域取得了显著成果。这些技术突破不仅提升了冠西电子产品的竞争力,也为其赢得了更多国际大厂的信赖。同时,冠西电子积极拓展市场,其产品广泛应用于电源、互联网设备、电脑系统和相关系统、家电、工业、安防系统等领域,为全球客户提供优质的产品和服务。

BOT公司的发展小趣事

广西来宾电厂是中国第一个国家正式批准的BOT试点项目。该项目由法国电力国际和通用电气阿尔斯通公司作为项目公司的主要股东,总投资为6.16亿美元。这个电厂的装机规模为72万千瓦,安装了两台36万千瓦的进口燃煤机组。在长达18年的特许经营期内,该项目为广西地区提供了稳定的电力供应,同时也为项目公司带来了可观的投资回报。随着时间的推移,该项目成为了BOT模式在中国成功应用的典范,为后来的类似项目提供了宝贵的经验。

Glenair公司的发展小趣事
使用万用表等工具检查电路中的关键元件是否损坏或性能下降,如电压比较器、继电器、可控硅等。
Abracon公司的发展小趣事
首先检查电路的供电电源是否正常,确保电压稳定且符合电路要求。
EZchip Technologies Ltd公司的发展小趣事

在激烈的市场竞争中,产品质量和客户服务是企业赢得客户信任的关键。EZchip一直秉承“质量第一、客户至上”的理念,注重产品的质量控制和客户服务体验。公司采用严格的生产流程和质量控制标准,确保每一件产品都符合高标准、高质量的要求。同时,EZchip还建立了完善的客户服务体系,为客户提供及时、专业的技术支持和售后服务。这些措施不仅提升了产品的竞争力,也赢得了客户的广泛赞誉和信任。

DIALIGHT公司的发展小趣事

随着业务的不断发展和市场的不断扩大,DIALIGHT公司逐渐实现了全球化布局。他们在美国、英国、丹麦、德国、马来西亚、新加坡、澳大利亚、墨西哥和巴西等地设立了分支机构或办事处,为全球客户提供及时、高效的服务。此外,DIALIGHT还积极寻求与其他企业的合作与共赢,通过战略合作协议的签署,为双方带来新的业务机遇和合作空间。这些举措不仅增强了DIALIGHT的市场竞争力,也为其未来的发展奠定了坚实的基础。

请注意,由于篇幅限制,以上三个故事仅为DIALIGHT公司发展历程的简要概述。如需更详细的信息和更多故事,建议查阅相关资料或访问公司官网。

问答坊 | AI 解惑

plc教案2

呵呵,大家都很喜欢看电子书?…

查看全部问答>

华为内部绝密硬件设计手册(模拟)

本人收藏的好东西! [ 本帖最后由 starrysky0228 于 2009-8-11 08:47 编辑 ]…

查看全部问答>

电子元件模特秀(一)

爱因迪生:观众朋友们,大家好。这里是首届元件模特大赛现场,我是主持人爱因迪生。我们请来了各路元件,秀出自己的身材(封装、外观),秀出自己的风采。我们的希望参赛选手不拘一格、敢于挑战、尽情发挥。 爱因迪生:1号选手上来了。瞧,这位选 ...…

查看全部问答>

谈谈为什么中国的个人发明多但实用[上市]的少?

首先我要肯定一点;我们中国人是很聪明能干的。从最有名四大发明起有不少伟大的发明来自中国,现在一些好的发明创造也不少,但真正把他变成财富或者说由理想变成现实的,很少呢。好多都让老外抄袭去了有了更好更广泛的发展和市场[四大发明就是典型 ...…

查看全部问答>

在LabVIEW中第三方数据采集卡的应用

在LabVIEW中第三方数据采集卡的应用…

查看全部问答>

wince下COM口的编程方法和WINDOWS下一样吗?

GetOverlappedResult和BuildCommDCB用不了怎么会事啊?谁有CE下的开发例子发给我一个好吗cst1978@yahoo.com.cn…

查看全部问答>

ST针对STM32ARM内核微控制器推出一个趣味性开发解决方案

完整、独立、预编程的评估工具套件,既有充满趣味性的功能介绍,又有严肃的开发工具,可以链接到在线开发社区中国,2007年10月15日 —意法半导体(纽约证券交易所代码:STM)今天推出了一套价格低廉的开发工具,这款代号为STM32 Pri ...…

查看全部问答>

MSP430F149+nRF2401案例参考

发现坛子里整无线模块的不多,发个资料合集。 注意:1.不是nRF24L01,而是nRF2401。             2.无电路原理图,其实看程序就能明白用到哪些端口   …

查看全部问答>

最近对双向链表的研究(比较好的插入双向链表的程序)

#include<stdio.h>#include<stdlib.h> #define FALSE   0#define TRUE    1typedef struct NODE{ struct NODE *fwd; struct NODE *bwd; int        value; ...…

查看全部问答>