BH1750 是一种采用I2C串行总线接口的数字型光强度传感器集成电路。它的高分辨率可以探测较大范围的光强度变化。它的输出结果为光强单位:勒克斯lx。
本次学习使用现成的模块,
使用BH1750测试I2C的原因,是因为BH1750的通讯协议比较简单,也很容易用逻辑分析仪捕捉并分析通讯数据。
G32A1465自身提供了一个LPI2C外设(使用G32A1445的数据手册,不一定准确),在程序中使用GPIO的端口复用功能,PA3复用为SCL,PA2复用为SDA。
代码配置:
{
.base = PMA,
.pinPmIdx = 2U,
.pullCfg = PM_INTERNAL_PULL_UP_ENABLED,
.drvSel = PM_LOW_DRIVE_STRENGTH,
.passiveFilt = false,
.mux = PM_MUX_ALT3,
.pinLk = false,
.intCfg = PM_DMA_INT_DISABLED,
.clrIntFlg = false,
.gpioBase = NULL,
.digitFilt = false,
},
{
.base = PMA,
.pinPmIdx = 3U,
.pullCfg = PM_INTERNAL_PULL_UP_ENABLED,
.drvSel = PM_LOW_DRIVE_STRENGTH,
.passiveFilt = false,
.mux = PM_MUX_ALT3,
.pinLk = false,
.intCfg = PM_DMA_INT_DISABLED,
.clrIntFlg = false,
.gpioBase = NULL,
.digitFilt = false,
},
BH1750相关的处理函数:
// 写传感器函数
void BH1750_Write(uint8_t REG_Address) {
STATUS_T statusCode = STATUS_ERROR;
uint8_t buf[2]={0};
buf[0]=REG_Address;
//Soft_I2C_Write(BHAdd, buf, 1, 1);
statusCode = LPI2C_MasterSendDataBlocking(LPI2C_INSTANCE, buf, 1, true, OSIF_WAIT_FOREVER);
}
// 读传感器函数
float BH1750_Read(void) {
STATUS_T statusCode = STATUS_ERROR;
uint8_t buf[2];
float temp;
//Soft_I2C_Read(BHAdd, buf, 2, 1);
statusCode = LPI2C_MasterReceiveDataBlocking(LPI2C_INSTANCE, buf, 2, true, OSIF_WAIT_FOREVER);
temp= (float)(((uint16_t)buf[0]<<8) + buf[1]) * SCALE_INTERVAL / 1.2f ;
return temp;
}
// 对传感器进行初始化
void BH1750_Init(void) {
BH1750_Write(BHPowOn); // 通电
BH1750_Write(Resolution); // 设置分辨率
}
主程序的处理逻辑很简单,在初始化BH1750后,每隔1秒获取BH1750的数据:
/* Includes */
#include "user_config.h"
#include "board.h"
#include "osif.h"
#include <stdio.h>
#include <string.h>
#define BHAdd 0x23 //从机地址 ADDR = L
//#define BHAdd 0x5C //从机地址 ADDR = H
#define BHPowDown 0x00 //关闭模块
#define BHPowOn 0x01 //打开模块等待测量指令
#define BHReset 0x07 //重置数据寄存器值在PowerOn模式下有效
#define BHModeH 0x10 //连续高分辨率模式 单位 1lx 测量时间120ms
#define BHModeH2 0x11 //连续高分辨率模式2 单位0.5lx 测量时间120ms
#define BHModeL 0x13 //连续低分辨率模式 单位 4lx 测量时间16ms
#define BHSigModeH 0x20 //一次高分辨率模式 单位 1lx 测量时间120ms,测量后转到 PowerDown模式
#define BHSigModeH2 0x21 //一次高分辨率模式2 单位0.5lx 测量时间120ms,测量后转到 PowerDown模式
#define BHSigModeL 0x23 //一次低分辨率模式 单位 4lx 测量时间16ms,测量后转到 PowerDown模式
#define Resolution BHModeH2 // 连续高分辨率模式,0.5lx
#define SCALE_INTERVAL 0.5f
void BH1750_Init(void);
float BH1750_Read(void);
// 写传感器函数
void BH1750_Write(uint8_t REG_Address) {
STATUS_T statusCode = STATUS_ERROR;
uint8_t buf[2]={0};
buf[0]=REG_Address;
//Soft_I2C_Write(BHAdd, buf, 1, 1);
statusCode = LPI2C_MasterSendDataBlocking(LPI2C_INSTANCE, buf, 1, true, OSIF_WAIT_FOREVER);
}
// 读传感器函数
float BH1750_Read(void) {
STATUS_T statusCode = STATUS_ERROR;
uint8_t buf[2];
float temp;
//Soft_I2C_Read(BHAdd, buf, 2, 1);
statusCode = LPI2C_MasterReceiveDataBlocking(LPI2C_INSTANCE, buf, 2, true, OSIF_WAIT_FOREVER);
temp= (float)(((uint16_t)buf[0]<<8) + buf[1]) * SCALE_INTERVAL / 1.2f ;
return temp;
}
// 对传感器进行初始化
void BH1750_Init(void) {
BH1750_Write(BHPowOn); // 通电
BH1750_Write(Resolution); // 设置分辨率
}
int main(void) {
STATUS_T statusCode = STATUS_ERROR;
uint32_t bytesRemaining = 0;
LPI2C_BAUDRATE_PARAMS_T baudRateParams;
LPI2C_MASTER_STATE_T lpi2cMasterState;
float temp=0;
// 设置I2C通讯速度
baudRateParams.baudrate = 400000U;
// 初始化时钟
CLOCK_SYS_Init(&g_clockConfig);
// 初始化用到的GPIO口
PINS_Init(CONFIGURED_PINS_CNT, g_pinsConfig);
// 初始化板载LED
LED_Init();
// 初始化按钮
BTN_Init();
// 初始化LPUART1
COM_Init();
printf("\r\n******************** LPI2C test start! ********************\r\n");
// 初始化LPI2C外设
statusCode = LPI2C_MasterInit(LPI2C_INSTANCE, &g_lpi2cMasterUserConfig, &lpi2cMasterState);
if (statusCode != STATUS_SUCCESS) {
printf("Failed to initialize LPI2C as Master!\r\n");
goto end;
}
printf("LPI2C master initialized!\r\n");
// 初始化从机地址,BH1750:0x23
LPI2C_MasterSetSlaveAddr(LPI2C_INSTANCE, BHAdd, false);
// 设置I2C通讯速度:400KHz
LPI2C_MasterSetBaudrate(LPI2C_INSTANCE, LPI2C_FAST_MODE, baudRateParams);
memset(&baudRateParams, 0, sizeof(baudRateParams));
LPI2C_MasterGetBaudrate(LPI2C_INSTANCE, &baudRateParams);
// 使用BH1750的I2C地址初始化I2C外设
printf("LPI2C current baudrate: %dKHz, Slave address: 0x%02X.\r\n", baudRateParams.baudrate / 1000, BHAdd);
printf("\r\nLPI2C master blocking write and read data test start!\r\n");
// 初始化BH1750
BH1750_Init();
while (1) {
// 读取BH1750测试数据
temp = BH1750_Read();
printf("BH1750 = %5.2f \r\n", temp);
OSIF_TimeDelay(1000);
}
end:
LPI2C_MasterDeInit(LPI2C_INSTANCE);
LED_On(LED_RED);
return 0;
}
通过逻辑分析仪获取的通讯情况:

串口的输出结果:

全部评论