1.數(shù)字光強(qiáng)度檢測(cè)模塊概述:
引腳:VCC GND SCL SDA ADDR
供電電壓:3-5V
數(shù)據(jù)范圍:0-65535
傳感器內(nèi)置16bitAD轉(zhuǎn)換器,直接數(shù)字輸出
不區(qū)分環(huán)境光源,接近于視覺靈敏度的分光特性,可對(duì)廣泛的亮度進(jìn)行1lx的高精度測(cè)量
2.光強(qiáng)的檢測(cè)過程
實(shí)則是單片機(jī)與模塊的通過I2C通信,使用GPIO口模擬I2C總線,并實(shí)現(xiàn)雙向傳輸,則需一個(gè)輸入輸出口(SDA),另外還需一個(gè)輸出口(SCL),不用stm32的IIC外設(shè),自己模擬時(shí)序,但是還用這兩個(gè)復(fù)用引腳PB10(SCL) PB11(SDA) 。
IIC接口時(shí)序圖
IIC時(shí)序圖
寫測(cè)量指令和讀測(cè)量結(jié)果指令都是通過i2c總線接口完成的

以下分析三個(gè)最基本的函數(shù)功能塊:
初始化IIC
void IIC_Init(void)
{
RCC->APB2ENR|=1<<3; // PB10( SCL) PB11 (SDA) PB端口使能
GPIOB->CRH&=~(0xff);
GPIOB->CRH|=(0x3<<8)|(0x3<<12); //配置PB10 PB11為通用推挽輸出
GPIOB->ODR|=3<<10; //SCL SDA 持續(xù)輸出1 拉高總線
}
起始信號(hào)
(由時(shí)序圖可以看出 起始信號(hào)就是在兩條線都是高電平的情況下,先拉低SDA 再拉低SCL 即可實(shí)現(xiàn)IIC的開始)
void IIC_Start(void)
{
SDA_OUT(); // 數(shù)據(jù)線做輸出
IIC_SDA(1); // 拉高數(shù)據(jù)線
IIC_SCL(1); // 拉高時(shí)鐘線
Delay_us(4);
IIC_SDA(0); // 拉低數(shù)據(jù)線,在時(shí)鐘線高電平期間
Delay_us(4);
IIC_SCL(0); // 拉低時(shí)鐘線 為發(fā)送數(shù)據(jù)做準(zhǔn)備
}
停止信號(hào)
(分析同上)
void IIC_Stop(void)
{
SDA_OUT();
IIC_SCL(0);
IIC_SDA(0);
Delay_us(4);
IIC_SCL(1);
IIC_SDA(1);
Delay_us(4);
}
讀數(shù)據(jù)(一位Byte)(傳感器 —> 單片機(jī))
(主語是單片機(jī) 以上都是給予的單片機(jī)的指令 讓單片機(jī) 端口復(fù)位 讀數(shù)據(jù) 寫數(shù)據(jù))
u8 IIC_Read_Byte(unsigned char Ack)
{
u8 i,RxData=0;
SDA_IN();
for(i=0;i<8;i++ )
{
IIC_SCL(0);
Delay_us(2);
IIC_SCL(1);
RxData<<=1;
if(READ_SDA) //讀出數(shù)據(jù) 一個(gè)周期讀一位 共8位
RxData++;
Delay_us(1);
}
if (!Ack)
IIC_NAck();
else
IIC_Ack();
return RxData;
}
單片機(jī)從傳感器接受數(shù)據(jù)的過程為
給傳感器發(fā)起始信號(hào)+等待應(yīng)答+接收數(shù)據(jù)
即:
/*讀數(shù)據(jù)*/
void BH170_Read(void)
{
IIC_Start();
IIC_Send_Byte(BH170_ADDR+1);
IIC_Wait_Ack();
BH_Data[0]=IIC_Read_Byte(1);//高字節(jié)
//IIC_Ack();
BH_Data[1]=IIC_Read_Byte(0);//低字節(jié)
//IIC_NAck();
IIC_Stop();
}
而讓傳感器工作 第一步當(dāng)然要啟動(dòng)它 配置模式
/*啟動(dòng)BH170*/
void BH170_Start(void)
{
IIC_Start();
IIC_Send_Byte(BH170_ADDR+0);//
IIC_Wait_Ack();
IIC_Send_Byte(BH170_ON );//通電
IIC_Wait_Ack();
IIC_Stop();
IIC_Start();
IIC_Send_Byte(BH170_ADDR+0);//
IIC_Wait_Ack();
IIC_Send_Byte(BH170_ONE);//單次H模式//通電
IIC_Wait_Ack();
IIC_Stop();
}
至于要顯示數(shù)據(jù)比如輸出到單片機(jī)的顯示屏上,就是LCD函數(shù)的任務(wù)了
使用IIC接口,并且操縱時(shí)序,還是很有意思的具體程序看github吧
Test-environment/IIC/IIC.c