芯查查logo
  • 数据服务
    1. 新产品
    2. 物料选型
    3. 查替代
    4. 丝印反查
    5. 查品牌
    6. PCN/PDN
    7. 查方案
    8. 查代理
    9. 数据合作
  • SaaS/方案
      SaaS产品
    1. 供应链波动监控
    2. 半导体产业链地图
    3. BOM管理
    4. 解决方案
    5. 汽车电子
    6. 政府机构
    7. 数据API
  • 商城
  • 行业资讯
    1. 资讯
    2. 直播
  • 论坛社区
    1. 论坛
    2. 学习
    3. 测评中心
    4. 活动中心
    5. 积分商城
  • 查一下
  • 开通会员
享受人生
极海G32A1465开发板测评+使用LPI2C外设驱动BH1

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;
}


通过逻辑分析仪获取的通讯情况:

 

串口的输出结果:

 

开发板测评
版块: 极海半导体
2025/01/31 14:20
  • 举报
😁😂😃😄😅😆😉😊😋😌😍😏😒😓😔😖😘😚😜😝😞😠😡😢😣😤😥😨😩😪😫😭😰😱😲😳😵😷😸😹😺😻😼😽😾😿🙀🙅🙆🙇🙈🙉🙊🙋🙌🙍🙎🙏✂✅✈✉✊✋✌✏✒✔✖✨✳✴❄❇❌❎❓❔❕❗❤➕➖➗➡➰🚀🚃🚄🚅🚇🚉🚌🚏🚑🚒🚓🚕🚗🚙🚚🚢🚤🚥🚧🚨🚩🚪🚫🚬🚭🚲🚶🚹🚺🚻🚼🚽🚾🛀Ⓜ🅰🅱🅾🅿🆎🆑🆒🆓🆔🆕
@好友

全部评论

加载中
游客登录通知
已选择 0 人
自定义圈子
移动
发布帖子
发布动态
发布问答
最新帖子
萤火工场GD32VW553-IOT测评+蓝牙串口透传树莓派pico 2测评 - 初体验【工程师经验】+ 飞线【开源】zvs142857 2.1A,3A快充 充电宝迷你UC3842 开关电源优化全解析:攻克常见难题,提升性能
热门版块
查看更多
电子DIY
维修技术
电子元器件
萤火工场
汽车电子工程师论坛
工业电子专区
新手入门指南
单片机/MCU论坛
PCB设计
开源项目

38

收藏

分享

微信扫码
分享给好友

评论