4976|2

4

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

F149模拟I2C总线驱动BH1750的问题 [复制链接]

BH1750FVI是光强度传感器,支持IIC接口。小弟最近欲做一个简单的光强度检测程序,将光强度用数码管显示出来,不过调试了好久一直无法工作。请各位大虾帮忙看下IIC的模拟哪里有错,不胜感激!

#include<msp430x14x.h>
#define uchar unsigned char
#define uint unsigned int
#define SDA_1  P3OUT|=BIT1 // P3.1为SDA
#define SDA_0  P3OUT&=~BIT1
#define SCL_1 P3OUT |= BIT0 //P3.0为SCL
#define SCL_0 P3OUT &= ~BIT0 
#define DIR_IN P3DIR &= ~BIT1 
#define DIR_OUT P3DIR |= BIT1 
#define SDA_IN ((P3IN >> 1) & 0x01)
#define dis_data  P5OUT  //数码管输出
#define TIME 5
#define SlaveAddress   0xA6

uchar seg_bcd[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //数码管

void delay_nms(unsigned int k) //延时k毫秒
{
  unsigned int i,j;
  for(i=0;i<k;i++)
    {
      for(j=0;j<121;j++)
        {;}
    }
}
void Delay(unsigned int n)    //延时
{
   unsigned int i;
   for(i = 0;i < n;i++)
    {
      ;
    }
}

void BH1750_Start()         //起始信号
{
    DIR_OUT;
    SDA_1;                   
    delay_nms(5);
    SCL_1;                    
    Delay(TIME);               
    SDA_0;                    
    Delay(TIME);              
    SCL_0;                    
}

void BH1750_Stop()        //结束信号
{
    DIR_OUT;
    SDA_0;                    
    Delay(TIME);
    SCL_1;                    
    Delay(TIME);              
    SDA_1;                    }

void BH1750_SendACK()       //发送Ack
{
    SCL_0;
    DIR_OUT;
    SDA_0;
    Delay(TIME);
    SCL_1;
    Delay(TIME);
    SCL_0;
}

void BH1750_RecvACK()         //接受ACK
{   SCL_1;                   
    Delay(TIME);
    DIR_IN;
    while(SDA_IN);
    DIR_OUT;
    SCL_0;
    Delay(TIME);
}

void BH1750_SendByte(uchar dat)     //发送一个字节
{   DIR_OUT;
    unsigned int i;
    for(i = 0;i < 8;i++)
    {
    SCL_0;
    Delay(TIME);
    if((dat >> 7) & 0x01) SDA_1;
    else SDA_0; 
    Delay(TIME);
    SCL_1;
    Delay(TIME);
    dat <<= 1; //数据左移一位,进入下一轮送数
    }
    Delay(TIME);
}

uchar BH1750_RecvByte()         //接受一个字节
{
    uchar i;
    uchar dat = 0;
    uchar datbit=0;
    SCL_0;
    Delay(TIME);
    SDA_1;                    
    DIR_IN;
    for (i=0; i<8; i++)         
    {
        SCL_1;                
        Delay(TIME);             
        datbit = SDA_IN;           
        Delay(TIME);
        dat = ((dat << 1) | datbit);
        SCL_0;                
        Delay(TIME);             
    }
    return dat;
}


void Single_Write_BH1750(uchar REG_Address)  //写入
{
    BH1750_Start();                  
    BH1750_SendByte(SlaveAddress);   
    BH1750_SendByte(REG_Address);    
   // BH1750_SendByte(REG_data);      
    BH1750_Stop();                   
}

void main()
{ uchar tmp;
  float temp;
  int t;
  WDTCTL = WDTPW + WDTHOLD;
  P5DIR |= 0Xff;
  P4DIR |= 0x01;
  P5OUT |= 0x00;
  delay_nms(200);
  Single_Write_BH1750(0x01);
  Single_Write_BH1750(0x10); 
  while(1)
   { Single_Write_BH1750(0x01);
     Single_Write_BH1750(0x10);
     delay_nms(180);
     tmp=BH1750_RecvByte();
     temp=(float)tmp;
     t=temp/100;
     dis_data=seg_bcd[t];
   }
}

最新回复

我现在也用这个,有的地方搞不懂,楼主能留个联系方式么?  详情 回复 发表于 2012-4-18 10:59
 
点赞 关注

回复
举报

424

帖子

0

TA的资源

纯净的硅(高级)

沙发
 
BH1750FVI这个东西真的不了解。看看有没有了解的人。

个人一点看法:不要简单的贴代码。很少有人会有耐心看既不知道原理图又不知道具体应用的代码,对大家来说是个挑战。

我建议您可以这样,描述一下您再做I2C测试时遇到的现象。
1 硬件连接有没有问题?检查下BH1750FVI外围电路正常否。
2 比如做了哪些实验?有什么现象?
3 IIC通信的地址波特率设置正确否?
3 用示波器抓图看看波形。

唠叨了很多,希望对您有所帮助。
 
 

回复

4

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

回复 楼主 lzy901025 的帖子

我现在也用这个,有的地方搞不懂,楼主能留个联系方式么?
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖直播:当AI遇见仿真,会有什么样的电子行业革新之路?
首场直播:Simcenter AI 赋能电子行业研发创新
直播时间:04月15日14:00-14:50

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 12

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表