STM32 HAL库BH1750光强检测器驱动代码
#ifndef __LIGHT_H
#define __LIGHT_H#include "system.h"
#include "delay.h"//IO方向设置
#define SDA_IN() {IIC_SDA_GPIO_Port->CRH&=0XFFFFFF0F;IIC_SDA_GPIO_Port->CRH|=(u32)8<<4;}
#define SDA_OUT() {IIC_SDA_GPIO_Port->CRH&=0XFFFFFF0F;IIC_SDA_GPIO_Port->CRH|=(u32)3<<4;}#define IIC_SCL PCout(8) //SCL
#define IIC_SDA PCout(9) //SDA
#define READ_SDA PCin(9) //输入SDA
#define ADDR 0x23 //0100011#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 Single_Write_BH1750(u8 REG_Address);
void Light_Init(void);
void bh_data_send(u8 command);
u16 bh_data_read(void);//IIC所有操作函数
void IIC_Init(void); //初始化IIC的IO口
void IIC_Start(void); //发送IIC开始信号
void IIC_Stop(void); //发送IIC停止信号
void IIC_Send_Byte(u8 txd); //IIC发送一个字节
u8 IIC_Read_Byte(u8 ack); //IIC读取一个字节
u8 IIC_Wait_Ack(void); //IIC等待ACK信号
void IIC_Ack(void); //IIC发送ACK信号
void IIC_NAck(void); //IIC不发送ACK信号void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 data);
u8 IIC_Read_One_Byte(u8 daddr,u8 addr);#endif
#include "bh1750.h"void Single_Write_BH1750(u8 REG_Address)
{IIC_Start(); // 起始信号IIC_Send_Byte(BHAddWrite); // 发送设备地址+写信号IIC_Send_Byte(REG_Address); // 内部寄存器地址,
// BH1750_SendByte(REG_data); // 内部寄存器数据,IIC_Stop(); // 发送停止信号
}void Light_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};// 使能GPIOD时钟__HAL_RCC_GPIOD_CLK_ENABLE();// PD6和7引脚置高HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_SET);// 初始化引脚GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_15;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);Single_Write_BH1750(0x01);bh_data_send(BHPowOn);bh_data_send(BHReset);bh_data_send(BHModeL); //选择的是分辨率是4lx,测量时间是16ms的delay_ms(180);
}//产生IIC起始信号
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 lowdelay_us(4);IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
}//产生IIC停止信号
void IIC_Stop(void)
{SDA_OUT();//sda线输出IIC_SCL=0;IIC_SDA=0;//STOP:when CLK is high DATA change form low to highdelay_us(4);IIC_SCL=1;IIC_SDA=1;//发送I2C总线结束信号delay_us(4);
}//等待应答信号到来
//返回值:1,接收应答失败
// 0,接收应答成功
u8 IIC_Wait_Ack(void)
{u8 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;//时钟输出0return 0;
}//产生ACK应答
void IIC_Ack(void)
{IIC_SCL=0;SDA_OUT();IIC_SDA=0;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;
}//不产生ACK应答
void IIC_NAck(void)
{IIC_SCL=0;SDA_OUT();IIC_SDA=1;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;
}//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答
void IIC_Send_Byte(u8 txd)
{u8 t;SDA_OUT();IIC_SCL=0;//拉低时钟开始数据传输for(t=0; t<8; t++){//IIC_SDA=(txd&0x80)>>7;if((txd&0x80)>>7)IIC_SDA=1;elseIIC_SDA=0;txd<<=1;delay_us(2); //对TEA5767这三个延时都是必须的IIC_SCL=1;delay_us(2);IIC_SCL=0;delay_us(2);}
}//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
u8 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();//发送nACKelseIIC_Ack(); //发送ACKreturn receive;
}void bh_data_send(u8 command)
{do{IIC_Start(); //iic起始信号IIC_Send_Byte(BHAddWrite); //发送器件地址}while(IIC_Wait_Ack()); //等待从机应答IIC_Send_Byte(command); //发送指令IIC_Wait_Ack(); //等待从机应答IIC_Stop(); //iic停止信号
}u16 bh_data_read(void)
{u16 buf;IIC_Start(); //iic起始信号IIC_Send_Byte(BHAddRead); //发送器件地址+读标志位IIC_Wait_Ack(); //等待从机应答buf=IIC_Read_Byte(1); //读取数据buf=buf<<8; //读取并保存高八位数据buf+=0x00ff&IIC_Read_Byte(0); //读取并保存第八位数据IIC_Stop(); //发送停止信号return buf;
}
STM32 HAL库BH1750光强检测器驱动代码相关推荐
- [stm32 HAL库] RTC和BKP驱动
CubeMX 配置 打开外部时钟 激活时钟和日历 更改RCC时钟为外部低速时钟 以上在CubeMX中的配置就已经完成,点击生成代码即可. 4.这里我需要使用串口进行调试,因此打开了串口一 工程修改 以 ...
- HIH8121(HIH8000系列)温湿度传感器驱动代码-基于STM32 HAL库
HIH8121温湿度传感器代码基于STM32 HAL库 HIH8121传感器简介 驱动代码.c 驱动代码.h main函数 HIH8121传感器简介 HIH8121是霍尼韦尔公司生产的测量温湿度参数一 ...
- STM32 HAL库PID控制电机 第二章 TB6612FNG芯片驱动GB37-520电机
STM32 HAL库PID控制电机 第二章 TB6612FNG芯片驱动GB37-520电机(HAL库) 1 电路图 2 TB6612简介 TB6612是双驱动,可同时驱动两个电机 STBY:接单片机的 ...
- VL6810X驱动 距离和光线传感器 stm32 HAL库
VL6810X驱动 距离和光线传感器 stm32 HAL库 代码 库文件和官方文档 注意事项 1. 2. 3. 这是一款ST出品的传感器,感觉用的人不多 网上没什么驱动代码,所以自己根据st的官方资料 ...
- STM32 HAL库 驱动 MT6701 磁编码器
写在前面: MT6701 是 MagnTek 推出的新一代基于差分霍尔感应原理的磁性角度编码器芯片.值得一提的是 MT6701不仅提供 0~360° 的角度信号,而且还提供了一个"按压&qu ...
- 【春节歌曲回味 | STM32小音乐盒 】PWM+定时器驱动无源蜂鸣器(STM32 HAL库)
l STM32通过PWM与定时器方式控制无源蜂鸣器鸣响 l STM32小音乐盒,歌曲进度条图形显示与百分比显示,歌曲切换 l 编程使用STM32 HAL库 l IIC OLED界面编程,动画实 ...
- 基于STM32 HAL库的遥控小车
目录 前言 一.材料清单 二.系统概述 三.硬件设计 1.HC-SR04超声波模块 2.HC-05/06蓝牙模块 3.L298n电机驱动模块 四.代码 1.引脚设置 2.遥控部分 3.超声波报警部分 ...
- 温湿度传感器驱动SHT85 单片机STM32 HAL库
功能介绍:读取传感器SHT85数据,转换成温度.湿度 .饱和水蒸气含量. 注意事项: SDA脚设置为开漏输出,外部上拉电阻10k.或者设置成推挽,软件切换SDA输入输出. 调试时可适当加长延时时间. ...
- STM32 HAL库学习笔记1-HAL库简介
STM32 HAL库学习笔记1-HAL库简介 HAL库 SPL 库 和 HAL 库两者相互独立,互不兼容.几种库的比较如下 目前几种库对不同芯片的支持情况如下 ST 中文官网上有一篇<关于ST库 ...
最新文章
- iRank: 基于互联网类脑架构的阿尔法鹰眼发展趋势评估
- sql server修改索引名称_索引基本知识和索引优化
- 构建高性能ASP.NET站点 网站优化需要考虑的方面
- SQL Server聚集索引的选择
- 纪·阿晶的首次AWS之行!
- python2 使用matplotlib
- Spring Boot 应用监控
- 2020 Pwn2Own东京大赛落幕,Master of Pwn 诞生
- mqtt之C++编译
- W5500调试的部分问题和注意点
- mysql注入转义绕过_SQL注入防御绕过
- Android 11适配指南之系统相机拍照、打开相册
- Python分析【崩坏学园2】凝魔纹心所输出
- 南丁格尔图文字颜色跟随
- 黑马day15作业2,3
- python scapy 抓包_python+scapy 抓包与解析
- 完美解决网页中Flash狂闪的问题
- 计算机网络第三章——数据链路层
- TypeError: can‘t subtract offset-naive and offset-aware datetimes
- 工作流之activiti6新手上路