本帖最后由 freeelectron 于 2020-1-19 11:58 编辑
1、基本特性 l I2C接口(支持全速模式) l 16bit数字输出 l 红色、绿色、蓝色以及红外光 l 两个I2C地址可选 l 分辨率0.0125lx/count(在高增益和最长时间测量模式下) l 典型的电流消耗为190uA l 工作温度范围-40~85℃
2、引脚描述 ADDR引脚就是用来选择地址的: INT引脚:输出电平变化、接mcu的外部中断接口。
3、寄存器描述
4、程序设计 4.1、寄存器以及参数设定定义 - #define BH1749NUC_I2C_ADDR 0x72 //8bit
- //#define BH1749NUC_I2C_ADDR 0x39 7bit
- #define BH1749NUC_SYSTEM_CONTROL 0x40
- //bit[7]
- #define BH1749NUC_SOFEWARE_RESET_NOT_DONE 0x00
- #define BH1749NUC_SOFEWARE_RESET_DONE 0x80
- //bit[6]
- #define BH1749NUC_INT_RESET_NOT_CHANGE 0x00
- #define BH1749NUC_INT_RESET_INACTIVE 0x40
- //bit[5:0]
- #define BH1749NUC_MODE_CONTROL1 0x41
- //bit[6:5]
- #define BH1749NUC_IR_GAIN_FORBIDDEN1 0x00
- #define BH1749NUC_IR_GAIN_X1 0x20
- #define BH1749NUC_IR_GAIN_FORBIDDEN2 0x40
- #define BH1749NUC_IR_GAIN_X32 0x60
- //bit[4:3]
- #define BH1749NUC_RGB_GAIN_FORBIDDEN1 0x00
- #define BH1749NUC_RGB_GAIN_X1 0x08
- #define BH1749NUC_RGB_GAIN_FORBIDDEN2 0x10
- #define BH1749NUC_RGB_GAIN_X32 0x18
- //bit[2:0]
- #define BH1749NUC_MEASUREMENT_MODE_FORBIDDEN1 0x00
- #define BH1749NUC_MEASUREMENT_MODE_FORBIDDEN2 0x01
- #define BH1749NUC_MEASUREMENT_MODE_120MS 0x02
- #define BH1749NUC_MEASUREMENT_MODE_240MS 0x03
- #define BH1749NUC_MEASUREMENT_MODE_FORBIDDEN3 0x04
- #define BH1749NUC_MEASUREMENT_MODE_35MS 0x05
- #define BH1749NUC_MEASUREMENT_MODE_FORBIDDEN4 0x06
- #define BH1749NUC_MEASUREMENT_MODE_FORBIDDEN5 0x07
- #define BH1749NUC_MODE_CONTROL2 0x42
- //bit[4]
- #define BH1749NUC_RGB_EN_INACTIVE 0x00
- #define BH1749NUC_RGB_EN_ACTIVE 0x10
- #define BH1749NUC_RED_DATA_L 0x50
- #define BH1749NUC_RED_DATA_H 0x51
- #define BH1749NUC_GREEN_DATA_L 0x52
- #define BH1749NUC_GREEN_DATA_H 0x53
- #define BH1749NUC_BLUE_DATA_L 0x54
- #define BH1749NUC_BLUE_DATA_H 0x55
- #define BH1749NUC_IR_DATA_L 0x58
- #define BH1749NUC_IR_DATA_H 0x59
- #define BH1749NUC_GREEN2_DATA_L 0x5A
- #define BH1749NUC_GREEN2_DATA_H 0x5B
- #define BH1749NUC_INTERRUPT 0x60
- //bit[7]
- #define BH1749NUC_INT_STATUS_INACTIVE 0x00
- #define BH1749NUC_INT_STATUS_ACTIVE 0x80
- //bit[3:2]
- #define BH1749NUC_INT_SOURCE_RED 0x00
- #define BH1749NUC_INT_SOURCE_GREEN 0x04
- #define BH1749NUC_INT_SOURCE_BLUE 0x08
- #define BH1749NUC_INT_SOURCE_FORBIDDEN 0x0C
- #define BH1749NUC_PERSISTENCE 0x61
- //bit[1:0]
- #define BH1749NUC_ACTIVE_MEASUREMENT_END 0x00
- #define BH1749NUC_UPDAED_MEASUREMENT_END 0x01
- #define BH1749NUC_UPDAED_4_CONSECUTIVE 0x02
- #define BH1749NUC_UPDAED_8_CONSECUTIVE 0x03
- #define BH1749NUC_TH_HIGH 0x62
- #define BH1749NUC_TH_LOW 0x63
- #define BH1749NUC_MANUFACTURER_ID 0x92 //only read,the value is 0xE0.
复制代码
4.2、读取设备ID 设备ID一般都是一个固定值,芯片出厂的时候已经固化在芯片里面了,只读,可用于检测I2C通信是否正常、检测芯片是否存在。 - bool BH1749NUCCheck(void)
- {
- uint8 chip_id=0;
-
- chip_id=BH1749NUC_ReadRegU8(BH1749NUC_MANUFACTURER_ID);
-
- if(chip_id==0xE0)
- {
- return true;
- }
- else
- {
- return false;
- }
- }
复制代码
4.3、初始化、参数设定 - void BH1749NUCInit(void)
- {
- BH1749NUC_WriteRegU8(BH1749NUC_SYSTEM_CONTROL,BH1749NUC_SOFEWARE_RESET_DONE); //复位初始化:软件复位
-
- BH1749NUC_WriteRegU8(BH1749NUC_MODE_CONTROL1,BH1749NUC_IR_GAIN_X1|BH1749NUC_RGB_GAIN_X1|BH1749NUC_MEASUREMENT_MODE_35MS); //模式控制寄存器1:红外增益设置为1,RGB增益设置为1,测量时间设置为35ms
-
- BH1749NUC_WriteRegU8(BH1749NUC_MODE_CONTROL2,BH1749NUC_RGB_EN_ACTIVE); //模式控制寄存器2:使能RGB测量
- }
复制代码
4.4、读取数据 - void BH1749NUCRead(void)
- {
- uint16 red, green, blue,ri, green2;
-
- red=BH1749NUC_ReadRegU16(BH1749NUC_RED_DATA_L);
- green=BH1749NUC_ReadRegU16(BH1749NUC_GREEN_DATA_L);
- blue=BH1749NUC_ReadRegU16(BH1749NUC_BLUE_DATA_L);
- ri=BH1749NUC_ReadRegU16(BH1749NUC_IR_DATA_L);
- green2=BH1749NUC_ReadRegU16(BH1749NUC_GREEN2_DATA_L);
-
- printf(“red=%d, green=%d, blue=%d, ri=%d, green2=%d\r\n\r\n”);
- }
复制代码
用标准的颜色,测试了一下发现,数据有变化,但是与所选取的颜色的rgb值还是蛮大的。 green和green2寄存器读出来的数据,基本差不多,不知道green2寄存器的意义何在? RGB的是0-255,既就是8位的,而上面的寄存器是16位的,似乎对上不? 这里就与设置的增益有关,芯片是支持两种增益,1和32,增益设置为1的时候,读出来直接是RGB值;增益设置为32的时候,读出来的数值,需要乘以分辨率0.0125lx/count,转化为RGB值。
|