STM32f1系列单片机使用IIC驱动BH1750
首先说明下**GY302模块上面其实就是一个BH1750芯片**,然后加了一小丢丢的外部驱动电路,实际上本质来说没什么区别,用起来一样。
简单的来说下BH1750这款光照强度传感器吧,输入电压VCC在3.0v-3.6v之间,我们一般都是使用3.3v供电啦,通讯采用标准的IIC协议,自身的IIC地址可以有两种选择,怎么选择请看后面。它具有接近视觉的光谱效应,说白了就是你眼睛能感受到的光波范围,它也刚好是这个范围,所以这个模块用在什么光强感应的那些面向消费者的产品上最好了;它的输入光的范围是1-65535lx
刚开始的时候使用STM32的硬件IIC写过这个的程序,但是发现不管怎么整都是返回的0x80,而且STM32的硬件IIC确实是有点问题,后来硬是没弄出来就改用软件IIC了,下面的程序也是用的软件IIC写的,有用硬件IIC成功的朋友可以分享下哈,我把我写的硬件IIC的代码也丢在下面了,希望有热心的伙伴一起研究硬件IIC为什么不成功哈,写硬件IIC的时候一定要注意两点,其一,IIC从机的地址是7位地址往前移动一位,第八位是读写位,其二,STM32读和写的时序中的EV6事件虽然名字相同都叫EV6但是代码却不同,分别是I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED和I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED一定要注意!
下面讲下写BH1750的驱动程序的时候需要注意问题:
芯片IIC地址的选择:通过改变ADDR引脚的电平
接低电平的时候是“0100011”
接高电平的时候是“1011100”
注意这个地址是7位!7位!7位!!!所以如果你使用硬件IIC的话记得把地址往前面移动1位,然后读地址最低为为1 写地址最低为为0 例如:当ADDR接低的时候,IIC地址为0x46 读地址为0x46+1 写地址为0x46
光强的计算方式:光照强度(单位lx)=(High Byte + Low Byte)/ 1.2 * 测量精度
芯片有6种工作模式,需要注意的是,精度越高,测量的时间越长,最长的有120ms,所以你测玩一次就得延时下,然后注意连续测量和单独一次测量的区别,连续测量你发送完上电,配置了测量模式之后,就不断读就行了;单独测量一次,需要你每次测量都先发送上电-测量模式-再去读测量结果
其他的都很简单的,如果你懂IIC的话,不懂的话那就在网上找找资料好好学学把
接下来放代码了
主函数很简单,首先检测模块在不在,然后初始化BH1750模块,其实就是发送上电命令,发送测量模式,然后就不断地去读数据就行了
接下来就是它的驱动函数了,先看头文件把,里面存放了很多的的定义
C文件如下:只要你懂IIC,懂C那就能看懂在干嘛
是不是很简单,但是我也不知道为什么使用硬件IIC就是不行,或许真的被我撞上STM32硬件IIC的毛病了,网上说它的毛病是接收应答信号的时间太短了,错过就GG了,有硬件IIC成功的朋友可以来分享下,我写的硬件IIC的代码我也贴出来把,如下:
这是硬件IIC写的头文件
这是硬件IIC写的C文件
STM32f1系列单片机使用IIC驱动BH1750
首先说明下**GY302模块上面其实就是一个BH1750芯片**,然后加了一小丢丢的外部驱动电路,实际上本质来说没什么区别,用起来一样。
简单的来说下BH1750这款光照强度传感器吧,输入电压VCC在3.0v-3.6v之间,我们一般都是使用3.3v供电啦,通讯采用标准的IIC协议,自身的IIC地址可以有两种选择,怎么选择请看后面。它具有接近视觉的光谱效应,说白了就是你眼睛能感受到的光波范围,它也刚好是这个范围,所以这个模块用在什么光强感应的那些面向消费者的产品上最好了;它的输入光的范围是1-65535lx
刚开始的时候使用STM32的硬件IIC写过这个的程序,但是发现不管怎么整都是返回的0x80,而且STM32的硬件IIC确实是有点问题,后来硬是没弄出来就改用软件IIC了,下面的程序也是用的软件IIC写的,有用硬件IIC成功的朋友可以分享下哈,我把我写的硬件IIC的代码也丢在下面了,希望有热心的伙伴一起研究硬件IIC为什么不成功哈,写硬件IIC的时候一定要注意两点,其一,IIC从机的地址是7位地址往前移动一位,第八位是读写位,其二,STM32读和写的时序中的EV6事件虽然名字相同都叫EV6但是代码却不同,分别是I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED和I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED一定要注意!
下面讲下写BH1750的驱动程序的时候需要注意问题:
芯片IIC地址的选择:通过改变ADDR引脚的电平
接低电平的时候是“0100011”
接高电平的时候是“1011100”
注意这个地址是7位!7位!7位!!!所以如果你使用硬件IIC的话记得把地址往前面移动1位,然后读地址最低为为1 写地址最低为为0 例如:当ADDR接低的时候,IIC地址为0x46 读地址为0x46+1 写地址为0x46
光强的计算方式:光照强度(单位lx)=(High Byte + Low Byte)/ 1.2 * 测量精度
芯片有6种工作模式,需要注意的是,精度越高,测量的时间越长,最长的有120ms,所以你测玩一次就得延时下,然后注意连续测量和单独一次测量的区别,连续测量你发送完上电,配置了测量模式之后,就不断读就行了;单独测量一次,需要你每次测量都先发送上电-测量模式-再去读测量结果
其他的都很简单的,如果你懂IIC的话,不懂的话那就在网上找找资料好好学学把
接下来放代码了
主函数很简单,首先检测模块在不在,然后初始化BH1750模块,其实就是发送上电命令,发送测量模式,然后就不断地去读数据就行了
接下来就是它的驱动函数了,先看头文件把,里面存放了很多的的定义
C文件如下:只要你懂IIC,懂C那就能看懂在干嘛
是不是很简单,但是我也不知道为什么使用硬件IIC就是不行,或许真的被我撞上STM32硬件IIC的毛病了,网上说它的毛病是接收应答信号的时间太短了,错过就GG了,有硬件IIC成功的朋友可以来分享下,我写的硬件IIC的代码我也贴出来把,如下:
这是硬件IIC写的头文件
这是硬件IIC写的C文件
举报