ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

stm32f103ve+BH1750使用教程+oled(HAL库)

2022-06-08 23:04:05  阅读:259  来源: 互联网

标签:SCL BH1750 HAL stm32f103ve void delay iic IIC2 define


1.硬件:BH1750模块+oled

2.代码:BH1750是标准的iic协议的外设,我这里单独有iic的文件,之后想要实现多个设备共用一个iic。

BH1750.c
 1 #include "BH1750.h"
 2 #include "delay.h"
 3 #include "iic.h"
 4 void bh_data_send(u8 command)
 5 {
 6     do{
 7     iic_start();
 8     iic_byte_write(BHAddWrite);
 9     }while(iic_wait_ack());
10     iic_byte_write(command);
11     iic_wait_ack();
12     iic_stop();
13 }
14 
15 u16 bh_data_read(void)
16 {
17     u16 buf;
18     iic_start();
19     iic_byte_write(BHAddRead);
20     iic_wait_ack();
21     buf=iic_byte_read(1);
22     buf=buf<<8;
23     buf+=0x00ff&iic_byte_read(0);
24     iic_stop();
25     return buf;
26 }
BH1750.h
#ifndef __BH1750_H
#define __BH1750_H

#include "main.h"


/*************************************************************/

#define BHAddWrite     0x46      //从机地址+最后写方向位
#define BHAddRead      0x47      //从机地址+最后读方向位
#define BHPowDown      0x00      //关闭模块
#define BHPowOn        0x01      //打开模块等待测量指令
#define BHReset        0x07      //重置数据寄存器值在PowerOn模式下有效
#define BHModeH1       0x10      //高分辨率 单位1lx 测量时间120ms
#define BHModeH2       0x11      //高分辨率模式2 单位0.5lx 测量时间120ms
#define BHModeL        0x13      //低分辨率 单位4lx 测量时间16ms
#define BHSigModeH     0x20      //一次高分辨率 测量 测量后模块转到 PowerDown模式
#define BHSigModeH2    0x21      //同上类似
#define BHSigModeL     0x23      // 上类似
/*************************************************************/
void bh_data_send(u8 command);
u16 bh_data_read(void);


#endif

iic.c

#include "iic.h"
#include "delay.h"

void iic_init(void)
{    
    IIC2_SCL = 1;
    IIC2_SDA = 1;
}
/*
函数名:iic_start
功  能:启动iic,启动方式,在SCL高电平期间将SDA由高置低
参  数:无
返回值:无
*/
void iic_start(void)
{
    SDA2_OUT();
    IIC2_SDA=1;
    IIC2_SCL=1;
    delay_us(1);
    IIC2_SDA=0;
    delay_us(1);
    IIC2_SCL=0;
}
/*
函数名:iic_stop
功  能:停止传输数据,实现方式在SCL高电平期间将SDA由低置高
参  数:无
返回值:无
*/
void iic_stop(void)
{
    IIC2_SCL=0;
    SDA2_OUT();    
    IIC2_SDA=0;
    delay_us(1);
    IIC2_SCL=1;
    IIC2_SDA=1;
    delay_us(1);
}
/*
函数名:iic_ack
功  能:接收从机应答信号,释放掉总线读取SDA置看是否有负脉冲,
        当一段时间无应答默认接收完毕
参  数:无
返回值:无
*/
u8 iic_wait_ack(void)
{
    u8 i=0;
    SDA2_IN();
    IIC2_SDA=1;delay_us(1);
    IIC2_SCL=1;delay_us(1);
    while(READ2_SDA)
    {
        i++;
        if(i>250) 
        {        
            iic_stop();            //如果i>255则产生非应答信号,iic停止
            return 1;
        }
        
    }
    IIC2_SCL=0;//时钟输出0 
    return 0;
}
/*
函数名:iic_nask
功  能:产生非应答信号
参  数:无
返  回:无
*/
void iic_nack(void)
{
    IIC2_SCL=0;
    SDA2_OUT();
    IIC2_SDA=1;
    delay_us(1);
    IIC2_SCL=1;
    delay_us(1);
    IIC2_SCL=0;
}    
/*
函数名:iic_ask
功  能:产生ask应答
参  数:无
返  回:无
*/
void iic_ack(void)
{
    IIC2_SCL=0;
    SDA2_OUT();
    IIC2_SDA=0;
    delay_us(1);
    IIC2_SCL=1;
    delay_us(1);
    IIC2_SCL=0;
}
/*
函数名:iic_bit_write
功  能:传送一个字节
参  数:u8
返回值:无
*/
void iic_byte_write(u8 buf)
{
    u8 i;
    SDA2_OUT();
    IIC2_SCL=0;
    for(i=1;i<=8;i++)
    {
        IIC2_SDA=(buf>>(8-i))&0x01;
        delay_us(1);
        IIC2_SCL=1;
        delay_us(1);
        IIC2_SCL=0;
        delay_us(1);        
    }
}
/*
函数名:iic_bit_read
功  能:主机读取一个字节
参  数:ask
返回值:
*/
u8 iic_byte_read(unsigned char ask)
{
    unsigned char  i,buf=0;
    SDA2_IN();
    for(i=0;i<8;i++)
    {
       IIC2_SCL=0;
       delay_us(1);
       IIC2_SCL=1;
       buf <<=1;
       if(READ2_SDA)
           buf++;
        delay_us(1);
    }
    if(!ask)
        iic_nack();
    else
        iic_ack();
    return buf;
}

iic.h

#ifndef __IIC_H
#define __IIC_H 

#include "main.h"

#define SDA2_IN()  {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=(u32)8<<4;}
#define SDA2_OUT() {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=(u32)3<<4;}

#define IIC2_SCL    PBout(8) //SCL
#define IIC2_SDA    PBout(9) //SDA     
#define READ2_SDA   HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_9)




void iic_init(void);
void iic_start(void);
void iic_stop(void);
u8 iic_wait_ack(void);
void iic_byte_write(u8 buf);
u8 iic_byte_read(unsigned char ask);

#endif

mian.c


int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ SystemClock_Config(); MX_GPIO_Init(); /* USER CODE BEGIN 2 */ OLED_Clear(); LEDG_OFF(); OLED_Init(); iic_init(); bh_data_send(BHPowOn); //==使能BH1750模块 bh_data_send(BHReset); //==复位BH1750模块 bh_data_send(BHModeH2);//==配置BH1750工作模式 /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ datalx =bh_data_read()/1.2; sprintf(string,"Light= %.1f",datalx); OLED_ShowString(0,0,string,16); OLED_ShowString(88,0,"lux",16); OLED_Refresh(); } /* USER CODE END 3 */ }

 

标签:SCL,BH1750,HAL,stm32f103ve,void,delay,iic,IIC2,define
来源: https://www.cnblogs.com/loremmoqi/p/16357565.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有