OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 13306|回复: 6

分享:STM8S105硬件I2C驱动BH1750

[复制链接]

1

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2012-8-31
在线时间
20 小时
发表于 2015-4-22 22:45:29 | 显示全部楼层 |阅读模式
[mw_shl_code=c,true]部分程序与说明来自互联网,感谢他人共享![/mw_shl_code] [mw_shl_code=c,true]在网上搜了很久没找到一篇有关于STM8硬件I2C驱动BH1750,于是参考了一个驱动24C02的例子自己写了一个程序。小弟不才,花了很长时间才调出来,现在分享给大家,希望有需要的人可以少走些弯路[/mw_shl_code] [mw_shl_code=c,true]//相应端口要配置成默认的浮动输入。。。一定要。。 //IAR For STM8S105C6 void i2c_init(void) { //I2C_FREQR和I2C_CCRL,CCRH ,I2C_TRISER要对应fMASTER频率计算。。但测试的效果来看好像又没什么影响。 I2C_FREQR |= 0x10; //输入外设时钟频率为16MHz I2C_CR1 = 0x00; //禁止I2C外设 I2C_TRISER = 0x0c; I2C_CCRL = 0x37; I2C_CCRH = 0x00; I2C_CR1 |= 0x01; //开启I2C外设 I2C_CR2 |= 0x04; //应答使能 I2C_OARL = 0xfe; //自身地址 I2C_OARH = 0x40; } void write_BH1750(u8 addr) { I2C_CR2 &=~ 0x04; //不返回应答 while(I2C_SR3 & 0x02); //等待总线空闲 I2C_CR2 |= 0x01; //产生起始位 while(!(I2C_SR1 & 0x01)); //等待START发送完 I2C_DR =0x46; //发2器件地址 while(!(I2C_SR1 & 0x02)); //等特7位器件地址发送完 I2C_SR1; //在软件读取SR1后,对SR3寄存器读操作 将清除改位 I2C_SR3; //然后读SR3 清 ADDR(等于库函数I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED)) I2C_DR = addr; while(!(I2C_SR1 & 0x04)); I2C_SR1; //在软件读取SR1后,对SR3寄存器读操作 将清除改位 I2C_SR3; //然后读SR3 清 ADDR(等于库函数I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED)) // I2C_CR2&=~0x04; //不返回应答 I2C_CR2|=0x02; //产生停止位 } //。 u16 read_BH1780(void) { u8 buf[2]; u16 r_lx; I2C_CR2 &=~ 0x04; //不返回应答 while(I2C_SR3 & 0x02); //等待总线空闲 I2C_CR2 |= 0x01; //产生起始位 while(!(I2C_SR1 & 0x01)); //等待START发送完 I2C_DR = 0x47; //发器件地址 while(!(I2C_SR1 & 0x02)); //等特7位器件地址发送完 I2C_SR1; //在软件读取SR1后,对SR3寄存器读操作 将清除改位 I2C_SR3; //然后读SR3 清 ADDR(等于库函数I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED))  [/mw_shl_code] [mw_shl_code=c,true] //就是因为少了这句,花了很长时间没调出来就是没看清别人例子和STM8规格书 I2C_CR2 |= 0x04; //为一下循环开始 设置 ack使能,上面 EV7_1设置ack=0发送stop后; //需要手动设置ack=1使能,必要在接收数据之前[/mw_shl_code] [mw_shl_code=c,true] while(!(I2C_SR1 & 0x40)); buf[0]=I2C_DR; // I2C_CR2&=~0x04; //返回应答 while(!(I2C_SR1 & 0x40)); buf[1]=I2C_DR; I2C_CR2 &= ~0x04; //ack使能 I2C_CR2 |= 0x02; //产生停止位 r_lx=(u16)(((buf[0]<<8)+buf[1])/1.2); //计算公式参考规格书例子 return r_lx; } int main(void) { system_init(); io_init(); i2c_init(); write_BH1750(0x01); //启动BH1750 write_BH1750(0x11); //连续H分辨率模式2 ........ while(1) { read_BH1780(); delay_ms(150); //延时至少120ms,参考规格书 ........... } } [/mw_shl_code] [mw_shl_code=c,true]来两张逻辑分析仪的图片[/mw_shl_code]



BH1750中文规格书

bh1750FVI中文数据手册.pdf

2.67 MB, 下载次数: 993

力拔山河兮盖世,时不利兮追不逝
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

樊友军 该用户已被删除
发表于 2016-5-4 17:11:06 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-4-22 23:16:27 | 显示全部楼层
谢谢分享...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2014-4-18
在线时间
5 小时
发表于 2015-4-28 10:02:05 | 显示全部楼层
好东西,顶起来!
回复 支持 反对

使用道具 举报

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2015-8-14
在线时间
7 小时
发表于 2015-8-24 15:26:08 | 显示全部楼层
很好的东西,必须顶
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2015-11-18
在线时间
0 小时
发表于 2015-11-18 17:02:17 | 显示全部楼层

我用的MSP430F149调了好久没有结果,我的BH1750没有ACK应答,请问你程序里的 ACK使能是什么意思,设置SDA端口为输入,直接检测输入信号不可以吗。

还有这个仿真波形是用的软件测的吗?
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2020-2-9
在线时间
0 小时
发表于 2020-2-9 18:51:25 | 显示全部楼层
感谢分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 03:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表