1.、初始化IIC(用到STM32的管脚都要定义)
2、设置BH1750的参数(依次发送0x01,0x07,0x20下面是发送一个字节的流程,有一内内麻烦)
发送一个字节的流程
- 起始信号(跟定义包头差不多,个人理解)
- 发送一个“写操作”字节“0x46(告诉BH1750你要往它那写一个字节,)
- 等待它反馈一个低电平信号
- 发送一个0x01的字节(告诉BH1750它要使能)
- 等待它反馈一个低电平信号
- 发送停止信号(跟定义包尾差不多,个人理解)
发送一个字节的流程
- 起始信号(跟定义包头差不多,个人理解)
- 发送一个“写操作”字节“0x46(告诉BH1750你要往它那写一个字节,)
- 等待它反馈一个低电平信号
- 发送一个0x07的字节(告诉BH1750它要重置它里面的数据重置设置)
- 等待它反馈一个低电平信号
- 发送停止信号(跟定义包尾差不多,个人理解)
发送一个字节的流程
- 起始信号(跟定义包头差不多,个人理解)
- 发送一个“写操作”字节“0x46(告诉BH1750你要往它那写一个字节,)
- 等待它反馈一个低电平信号
- 发送一个0x20的字节(告诉BH1750它要设置成1次H分辨率模数,具体和其他模式下有什么区别有空你们可以尝试一下)
- 等待它反馈一个低电平信号
- 发送停止信号(跟定义包尾差不多,个人理解)
3 完成后需要等带120毫秒,等待BH1750反应时间,(下面是接送一个字节的流程,这个比较简单一内内)
读一个字节的流程
- 起始信号(跟定义包头差不多,个人理解)
- 发送一个“读操作”字节“0x47(告诉BH1750你要往它那读一个字节,)
- 等待它反馈一个低电平信号
- 先接收BH1750采集光照度数据的的高八位,发送一个信号告诉BH1750它可以发送下一个数据了(这个信号我们暂时定义它为1)
- 在接收BH1750采集光照度数据的的低八位,发送一个信号告诉BH1750我们已经接收到最后的一个字节了(这个信号我们暂时定义它为0)
- 发送停止信号(跟定义包尾差不多,个人理解)
4 对数据进行处理将高八位和低八位组合起来,在显示出来
#include "i2c.h"
#include "delay.h"
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOC, ENABLE); //使能GPIOA/C时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHz
GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化
IIC_SCL(1);
IIC_SDA(1);
}
void SDA_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA4端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化IO口
}
void SDA_IN(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA4端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化IO口
}
void IIC_Start(void)
{
SDA_OUT(); //sda线输出
IIC_SDA(1);
IIC_SCL(1);
Delay_us(4);
IIC_SDA(0);//START:when CLK is high,DATA change form high to low
Delay_us(4);
IIC_SCL(0);//钳住I2C总线,准备发送或接收数据
}
void IIC_Stop(void)
{
SDA_OUT();//sda线输出
IIC_SCL(0);
IIC_SDA(0);//STOP:when CLK is high DATA change form low to high
Delay_us(4);
IIC_SCL(1);
IIC_SDA(1);//发送I2C总线结束信号
Delay_us(4);
}
uint8_t IIC_Wait_Ack(void)
{
uint8_t ucErrTime=0;
SDA_IN(); //SDA设置为输入
IIC_SDA(1);
Delay_us(1);
IIC_SCL(1);
Delay_us(1);
while(READ_SDA())
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL(0);//时钟输出0
return 0;
}
void IIC_Ack(void)
{
IIC_SCL(0);
SDA_OUT();
IIC_SDA(0);
Delay_us(2);
IIC_SCL(1);
Delay_us(2);
IIC_SCL(0);
}
void IIC_NAck(void)
{
IIC_SCL(0);
SDA_OUT();
IIC_SDA(1);
Delay_us(2);
IIC_SCL(1);
Delay_us(2);
IIC_SCL(0);
}
void IIC_Send_Byte(uint8_t txd)
{
uint8_t t;
SDA_OUT();
IIC_SCL(0);//拉低时钟开始数据传输
for(t=0; t<8; t++)
{
IIC_SDA((txd&0x80)>>7);
txd<<=1;
Delay_us(2); //对TEA5767这三个延时都是必须的
IIC_SCL(1);
Delay_us(2);
IIC_SCL(0);
Delay_us(2);
}
}
uint8_t IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_IN();//SDA设置为输入
for(i=0; i<8; i++ )
{
IIC_SCL(0);
Delay_us(2);
IIC_SCL(1);
receive<<=1;
if(READ_SDA())receive++;
Delay_us(1);
}
if (!ack)
IIC_NAck();//发送nACK
else
IIC_Ack(); //发送ACK
return receive;
}
#include "bh1750.h" #includefloat result_lx=0; uint8_t BUF[2]={0}; uint16_t result1750=0; extern unsigned char tmp_buf[16]; void BH1750_Init(void) { IIC_Init(); } void Cmd_Write_BH1750(uint8_t cmd) { IIC_Start(); //起始信号 IIC_Send_Byte(BH1750_Addr+0); //发送设备地址+写信号 while(IIC_Wait_Ack()); IIC_Send_Byte(cmd); //内部寄存器地址 while(IIC_Wait_Ack()); IIC_Stop(); //发送停止信号 Delay_ms(5); } void Start_BH1750(void) { Cmd_Write_BH1750(BH1750_ON); //power on Cmd_Write_BH1750(BH1750_RSET); //clear Cmd_Write_BH1750(BH1750_ONE); //一次H分辨率模式,至少120ms,之后自动断电模式 } void Read_BH1750(void) { IIC_Start(); //起始信号 IIC_Send_Byte(BH1750_Addr+1); //发送设备地址+读信号 while(IIC_Wait_Ack()); BUF[0]=IIC_Read_Byte(1); //发送ACK BUF[1]=IIC_Read_Byte(0); //发送NACK IIC_Stop(); //停止信号 Delay_ms(5); } void Convert_BH1750(void) { result1750=BUF[0]; result1750=(result1750<<8)+BUF[1]; //合成数据,即光照数据 result1750=(double)result1750/1.2; }



