注册 登录
查看: 6930|回复: 15

[K60] 终于搞定了→→BH1750光照度传感器I2C协议采集数据 LCD显示

[复制链接]
发表于 2015-5-5 22:21:45 | 显示全部楼层 |阅读模式
本帖最后由 tintinshine 于 2015-5-5 23:55 编辑

几经波折 把I2C看了个底掉 把数据手册读烂 把程序改到面目全非 克服了一个又一个困难 总算是把BH1750的程序移植到K60上了
几天下来 感觉编程的能力上升了N个台阶T_T...............
基于山外库5.2  参考STM32下BH1750的例程改编而来
地址见传送门http://www.openedv.com/posts/list/31163.htm
主函数:
unsigned int lux_data=0;                   //光数据
site.x = 5;
site.y = 90;
LCD_str(site, "Lux_data:", WHITE, BCOLOUR);   
site.x = 5+6*12;  



i2c_init(I2C0,9600); // 初始化 I2C0,期待的波特率为 9600


while(1)
{
i2c_write_reg(I2C0,0x23,0x01,0x00);
DELAY_MS(10);
i2c_write_reg(I2C0,0x23,0x10,0x00);
DELAY_MS(180);
lux_data=i2c_read_reg(I2C0,0x23 ,0x00 );    //从iic总线读取数值        

DELAY_MS(10);
site.y = 90;  
LCD_num_C(site,lux_data, YELLOW, BCOLOUR);//光照度值显示  

}

MK60_i2c.c文件下修改:
void i2c_write_reg(I2Cn_e i2cn, uint8 SlaveID, uint8 reg, uint8 Data)
{


    i2c_Start(i2cn);                                    //发送启动信号


    i2c_write_byte(i2cn, ( SlaveID << 1 ) | MWSR);      //发送从机地址和写位


    i2c_write_byte(i2cn, reg);                          //发送从机里的寄存器地址


//    i2c_write_byte(i2cn, Data);                         //发送需要写入的数据    这段话要注释掉


    i2c_Stop(i2cn);


    i2c_delay();                                        //延时太短的话,可能写出错
}





uint16 i2c_read_reg(I2Cn_e i2cn, uint8 SlaveID, uint8 reg)
{


    //先写入寄存器地址,再读取数据,因此此过程是 I2C 的复合格式,改变数据方向时需要重新启动
    uint16 result;
    uint8 BUF[2]={0};
   
    ASSERT((SlaveID & 0x80) == 0);                      //断言,我们要求的7位地址的值仅仅是7bit,不是通信时要求的高7位
    //有些手册,给出的7位地址指的是8bit里的高7位
    //有些手册,给出的7位地址指的是7bit
    //请自行确认,可以尝试是否通信正常来确认


//MWSR =   0x00,  /* 主机写模式  */
//MRSW =   0x01   /* 主机读模式  */
    i2c_Start(i2cn);                                    //发送启动信号


    i2c_write_byte(i2cn, ( SlaveID << 1 ) | MWSR);      //发送从机地址和写位


    i2c_write_byte(i2cn, reg);                          //发送从机里的寄存器地址


    i2c_RepeatedStart(i2cn);                            //复合格式,发送重新启动信号


    i2c_write_byte(i2cn, ( SlaveID << 1) | MRSW );      //发送从机地址和读位
   


    i2c_EnterRxMode(i2cn);  //进入接收模式(应答,需要接收多个数据,接收最后一个字节前需要禁用应答i2c_DisableAck)      


    result = I2C_D_REG(I2CN[i2cn]);                     //虚假读取一次,启动接收数据
    i2c_Wait(i2cn);                                     //等待接收完成     
    BUF[0] = I2C_D_REG(I2CN[i2cn]);                     //读取数据
   
   
    i2c_Wait(i2cn);
    BUF[1] = I2C_D_REG(I2CN[i2cn]);
   
    i2c_Stop(i2cn); //发送停止信号
   
    result=BUF[0];
    result=(result<<8)+BUF[1];  //合成数据,即光照数据                                    
    i2c_delay();                                        //必须延时一下,否则出错


    return result;
   
}


MK60_i2c.h下修改:
extern uint16   i2c_read_reg (I2Cn_e, uint8 SlaveID, uint8 reg);                  //读取寄存器的数据

编程不易 转载请注明出处!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 1互助 +2 收起 理由
baixiaole + 2 很牛逼

查看全部评分

回复

使用道具 举报

发表于 2015-5-8 14:05:40 | 显示全部楼层
六步上篮 发表于 2015-5-8 12:30
现场根据按键调会简单些吧

楼主不是飞思卡尔比赛的,是阳光下的,好像是搞毕设。
回复 支持 1 反对 0

使用道具 举报

发表于 2015-5-5 22:24:58 | 显示全部楼层
编程不易啊,我也经常把Datasheet读了几遍,反复折腾才搞定。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-5 23:20:24 | 显示全部楼层
山外メ雲ジ 发表于 2015-5-5 22:24
编程不易啊,我也经常把Datasheet读了几遍,反复折腾才搞定。

最恶心的地方是bh1750的i2c协议跟山外库的i2c根本就不在一个路数上 不论是发送还是接收都得改
先是slave adress为啥是0x23整不明白 结果最后才发现人家只有七位 把最后的读写位加上就是历程里面的0x46 0x47
建议山外大神给以后的山外库里面添个接收多字节 且发送应答的i2c_read函数吧
不然太伤了
库里的函数不仅只能接受一个字节 返回值还是八位 太受限制!
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2015-5-5 23:33:37 | 显示全部楼层
tintinshine 发表于 2015-5-5 23:20
最恶心的地方是bh1750的i2c协议跟山外库的i2c根本就不在一个路数上 不论是发送还是接收都得改
先是slave  ...

从机地址,其实我们代码里有强调的!!不同芯片手册,给的描述不同。有的是单纯7位,有的是8位里的高7位,自己注意区分两者不同。


因为手上没有多字节的模块,所以没加。
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-5 23:46:56 | 显示全部楼层
山外メ雲ジ 发表于 2015-5-5 23:33
从机地址,其实我们代码里有强调的!!不同芯片手册,给的描述不同。有的是单纯7位,有的是8位里的高7位 ...

一开始天真的以为调两个函数就能搞定bh1750了 没想到废了这么大劲儿
山外大神试试bh1750吧 最具代表性的双字节i2c传感器了 便宜还好用
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2015-5-6 13:52:26 | 显示全部楼层
谢谢分享。 (๑•́ ₃ •̀๑)
回复 支持 反对

使用道具 举报

发表于 2015-5-7 08:22:59 | 显示全部楼层
这个传感器用来做什么的
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-7 12:32:26 | 显示全部楼层
六步上篮 发表于 2015-5-7 08:22
这个传感器用来做什么的

采集光照强度 反馈给主控动态改变鹰眼阈值
回复 支持 反对

使用道具 举报

发表于 2015-5-8 12:30:26 | 显示全部楼层
tintinshine 发表于 2015-5-7 12:32
采集光照强度 反馈给主控动态改变鹰眼阈值

现场根据按键调会简单些吧
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2015-5-21 20:25:32 | 显示全部楼层
以前搞过 K60的假读把我玩的快死了。。。搞了好几天
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-23 15:55:38 | 显示全部楼层
Greece 发表于 2015-5-21 20:25
以前搞过 K60的假读把我玩的快死了。。。搞了好几天

我还是没整明白假读是干啥的 反正最后也是调通了
回复 支持 反对

使用道具 举报

发表于 2015-9-10 13:16:23 | 显示全部楼层
tintinshine 发表于 2015-5-7 12:32
采集光照强度 反馈给主控动态改变鹰眼阈值

改阈值还要初始化摄像头吧,比较耗时啊,阈值改完后车子是不是直接就出去了。。。
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2015-9-14 12:22:48 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2016-5-6 14:23:01 | 显示全部楼层
怎么没用呢?
回复 支持 反对

使用道具 举报

发表于 2017-5-28 09:31:08 | 显示全部楼层
山外メ雲ジ 发表于 2015-5-5 22:24
编程不易啊,我也经常把Datasheet读了几遍,反复折腾才搞定。

山外哥,山外鹰眼是否会有小范围内的焦变呢?
回复 支持 反对

使用道具 举报

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

本版积分规则

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