[I2C應(yīng)用實(shí)例]STM32+BH1750FVI光強(qiáng)檢測(cè)模塊

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在使用單片機(jī)的過程中,I2C 通信可以說是最被廣泛使用和采納的協(xié)議之一,采用 I2C 協(xié)議可以占用更少的資源,鏈接...
    noparkinghere閱讀 2,409評(píng)論 0 8
  • IIC通信實(shí)驗(yàn) IIC簡介 I2C(Inter-Integrated Circuit)字面上的意思是集成電路之間,...
    btskyrmb閱讀 2,072評(píng)論 0 2
  • 什么是嵌入式 IEEE(Institute of Electrical and Electronics Engin...
    Leon_Geo閱讀 3,975評(píng)論 1 20
  • 一陣桂香襲來,突然意識(shí)到秋天真的來了。 在城市中,天氣漸涼,看到街上的人漸漸穿上外套,知道秋天來了。除此之外沒有任...
    沐慧閱讀 632評(píng)論 2 2
  • 山雨 不知何時(shí) 徒步名聲鵲起 你一隊(duì) 我一組 大家在一起 清晨相約 夜幕相聚 只為鍛煉身體 有人說 那是閑的無處用...
    如影泡幻閱讀 367評(píng)論 0 3

友情鏈接更多精彩內(nèi)容