OpenEdv-开源电子网

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

光照传感器程序不好使,求大神指正

[复制链接]

11

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2016-4-3
在线时间
41 小时
发表于 2016-4-14 11:46:30 | 显示全部楼层 |阅读模式
15金钱
最近在用stm32的I2C总线调光传感器的一个程序,实在调不好了,求大神指教。光传感器应该是BH1750,就是5个接口,有使能。程序如下I2c程序,这是我直接改的例程,应该没错
#include "I2C.h"

/****************************************************************************
* Function Name  : IIC_Config
* Description    : 3õê¼»ˉGPIO.
* Input          : None
* Output         : None
* Return         : None
****************************************************************************/
void I2C_INIT()
{
        GPIO_InitTypeDef GPIO_InitStructure;        
        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

        GPIO_InitStructure.GPIO_Pin=I2C_SCL|I2C_SDA;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_Init(GPIOB,&GPIO_InitStructure);

        I2C_SCL_H;
        I2C_SDA_H;
}

/*******************************************************************************
* oˉ êy Ãû         : I2C_SDA_OUT
* oˉêy1|Äü                   : SDAêä3öÅäÖà          
* êä    èë         : ÎT
* êä    3ö         : ÎT
*******************************************************************************/
void I2C_SDA_OUT()
{
    GPIO_InitTypeDef GPIO_InitStructure;        
        
        GPIO_InitStructure.GPIO_Pin=I2C_SDA;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_Init(GPIOB,&GPIO_InitStructure);
}

/*******************************************************************************
* oˉ êy Ãû         : I2C_SDA_IN
* oˉêy1|Äü                   : SDAêäèëÅäÖà          
* êä    èë         : ÎT
* êä    3ö         : ÎT
*******************************************************************************/
void I2C_SDA_IN(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;        
        
        GPIO_InitStructure.GPIO_Pin=I2C_SDA;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//ÏÂà-êä3ö
        GPIO_Init(GPIOB,&GPIO_InitStructure);
}

//2úéúÆeê¼DÅoÅ
void I2C_Start(void)
{
    I2C_SDA_OUT();
        
        I2C_SDA_H;
        I2C_SCL_H;
        delay_us(5);
        I2C_SDA_L;
        delay_us(6);
        I2C_SCL_L;
}

//2úéúí£Ö1DÅoÅ
void I2C_Stop(void)
{
   I2C_SDA_OUT();

   I2C_SCL_L;
   I2C_SDA_L;
   I2C_SCL_H;
   delay_us(6);
   I2C_SDA_H;
   delay_us(6);
}

//Ö÷»ú2úéúó|′eDÅoÅACK
void I2C_Ack(void)
{
   I2C_SCL_L;
   I2C_SDA_OUT();
   I2C_SDA_L;
   delay_us(2);
   I2C_SCL_H;
   delay_us(5);
   I2C_SCL_L;
}

//Ö÷»ú2»2úéúó|′eDÅoÅNACK
void I2C_NAck(void)
{
   I2C_SCL_L;
   I2C_SDA_OUT();
   I2C_SDA_H;
   delay_us(2);
   I2C_SCL_H;
   delay_us(5);
   I2C_SCL_L;
}
//μè′y′ó»úó|′eDÅoÅ
//·μ»ØÖμ£o1 ½óêÕó|′eê§°ü
//                  0 ½óêÕó|′e3é1|
u8 I2C_Wait_Ack(void)
{
        u8 tempTime=0;

        I2C_SDA_IN();

        I2C_SDA_H;
        delay_us(1);
        I2C_SCL_H;
        delay_us(1);

        while(GPIO_ReadInputDataBit(GPIO_I2C,I2C_SDA))
        {
                tempTime++;
                if(tempTime>250)
                {
                        I2C_Stop();
                        return 1;
                }         
        }

        I2C_SCL_L;
        return 0;
}
//I2C ·¢Ëíò»¸ö×Ö½ú
void I2C_Send_Byte(u8 txd)
{
        u8 i=0;

        I2C_SDA_OUT();
        I2C_SCL_L;//à-μíê±Öó¿aê¼êy¾Y′«êä

        for(i=0;i<8;i++)
        {
                if((txd&0x80)>0) //0x80  1000 0000
                        I2C_SDA_H;
                else
                        I2C_SDA_L;

                txd<<=1;
                I2C_SCL_H;
                delay_us(2); //·¢&#203;íêy&#190;Y
                I2C_SCL_L;
                delay_us(2);
        }
}

//I2C &#182;áè&#161;ò&#187;&#184;&#246;×&#214;&#189;ú

u8 I2C_Read_Byte(u8 ack)
{
   u8 i=0,receive=0;

   I2C_SDA_IN();
   for(i=0;i<8;i++)
   {
                   I2C_SCL_L;
                delay_us(2);
                I2C_SCL_H;
                receive<<=1;
                if(GPIO_ReadInputDataBit(GPIO_I2C,I2C_SDA))
                   receive++;
                delay_us(1);        
   }

           if(ack==0)
                   I2C_NAck();
        else
                I2C_Ack();

        return receive;
}
光传感器程序
#include "BH1750.h"
float result=0;

u8 BH1750_ReadOneByte(u8 addr)
{
        u8 temp=0;

        I2C_Start();
        
        
                I2C_Send_Byte(0x94);
                I2C_Wait_Ack();
                I2C_Send_Byte(addr);        //addr是内部寄存器地址
        
                I2C_Wait_Ack();


        I2C_Start();
        I2C_Send_Byte(0x95);
        I2C_Wait_Ack();

        temp=I2C_Read_Byte(0); //  0   ′ú±í NACK
        I2C_NAck();
        I2C_Stop();
        
        return temp;        
}

void BH1750_WriteOneByte(u8 addr,u8 dt)
{
        I2C_Start();


                I2C_Send_Byte(0x94);
                I2C_Wait_Ack();
                I2C_Send_Byte(addr);        


        I2C_Wait_Ack();

        I2C_Send_Byte(dt);
        I2C_Wait_Ack();
        I2C_Stop();

        delay_ms(10);
}


void BH1750_INIT(void)
{
        I2C_INIT();
        I2C_Start();
        GPIOE->BSRR=GPIO_Pin_0;
  BH1750_WriteOneByte(0x04,0x00);
        
}
float BH1750_celiang(void)
{
        u8 i;
        u32 a;
  for(i=0;i<4;i++)
        {
                a|=BH1750_ReadOneByte(i);
                delay_ms(400);
                a<<=8;
        }
       result=(float)a/1.2;
        return result;
}


主程序

void GPIO_Config(void);
int main(void)
{
        float a;

        
        GPIO_Config();//GPIO初始化
        BH1750_INIT();//i2c3&#245;ê&#188;&#187;ˉ
        
        delay_ms(5);
        while(1)
        {
        a=BH1750_celiang();
                if(a>0)
                {
                        GPIO_SetBits(GPIOE,GPIO_Pin_13);
                        delay_ms(500);
                        GPIO_SetBits(GPIOE,GPIO_Pin_14);
                        delay_ms(500);
                }

}

最佳答案

查看完整内容[请看2#楼]

我知道是哪里的问题了,是内部寄存器地址的问题
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2016-4-3
在线时间
41 小时
 楼主| 发表于 2016-4-14 11:46:31 | 显示全部楼层
我知道是哪里的问题了,是内部寄存器地址的问题
回复

使用道具 举报

15

主题

317

帖子

0

精华

高级会员

Rank: 4

积分
863
金钱
863
注册时间
2015-2-12
在线时间
354 小时
发表于 2016-4-14 13:52:23 | 显示全部楼层
仔细分析了你的I2C程序,感觉没有问题
1、你是不是将Slave_Address弄错了?
2、能否将if(tempTime > 250) 之 250 弄大些, 如 5000? 注意此时 tempTime 变换一下数据类型。
       
回复

使用道具 举报

11

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2016-4-3
在线时间
41 小时
 楼主| 发表于 2016-4-14 15:04:57 | 显示全部楼层
csmjmcc 发表于 2016-4-14 13:52
仔细分析了你的I2C程序,感觉没有问题
1、你是不是将Slave_Address弄错了?
2、能否将if(tempTime > 250) ...

那个地址是我在手册上查到的,0x94是写地址,I2c的程序没问题那传感器程序和主程序呢,我觉得很可能是这两个程序有问题
回复

使用道具 举报

15

主题

317

帖子

0

精华

高级会员

Rank: 4

积分
863
金钱
863
注册时间
2015-2-12
在线时间
354 小时
发表于 2016-4-14 15:12:36 | 显示全部楼层
它说:有两种类型地址,视ADDR接法。

111.jpg
回复

使用道具 举报

11

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2016-4-3
在线时间
41 小时
 楼主| 发表于 2016-4-14 15:21:05 | 显示全部楼层
csmjmcc 发表于 2016-4-14 15:12
它说:有两种类型地址,视ADDR接法。

可是0x46我也试过啊
回复

使用道具 举报

15

主题

317

帖子

0

精华

高级会员

Rank: 4

积分
863
金钱
863
注册时间
2015-2-12
在线时间
354 小时
发表于 2016-4-14 15:27:56 | 显示全部楼层
ADDR接高电平为:B9 或 B8
          接低电平为:47 或 46
我没弄错吧?
回复

使用道具 举报

11

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2016-4-3
在线时间
41 小时
 楼主| 发表于 2016-4-14 15:38:54 | 显示全部楼层
csmjmcc 发表于 2016-4-14 15:27
ADDR接高电平为:B9 或 B8
          接低电平为:47 或 46
我没弄错吧?

我能说我这些都试过了吗
回复

使用道具 举报

15

主题

317

帖子

0

精华

高级会员

Rank: 4

积分
863
金钱
863
注册时间
2015-2-12
在线时间
354 小时
发表于 2016-4-14 16:06:20 | 显示全部楼层
zhuri 发表于 2016-4-14 15:38
我能说我这些都试过了吗

现在,你说了。以前没说。当我没说,可以吗?
回复

使用道具 举报

11

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2016-4-3
在线时间
41 小时
 楼主| 发表于 2016-4-14 16:08:38 | 显示全部楼层
csmjmcc 发表于 2016-4-14 16:06
现在,你说了。以前没说。当我没说,可以吗?

别啊,你在帮我看看呗,我自己都弄两天了,实在是找不到错啊,都快炸了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 01:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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