OpenEdv-开源电子网

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

求助:用IIC接收BH1750的数据要么返回0要么返回0xff00

[复制链接]

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2016-10-8
在线时间
16 小时
发表于 2016-10-16 20:09:49 | 显示全部楼层 |阅读模式
本帖最后由 木子山风 于 2016-10-16 21:09 编辑

8000,7F00又是什么

8000,7F00又是什么

#ifndef _IIC_H_
#define _IIC_H_

#include <stm32f4xx.h>
#define  SCL_H    (GPIOF->BSRRL |= 1 << 0)
#define  SCL_L    (GPIOF->BSRRH |= 1 << 0)
#define  SDA_H    (GPIOF->BSRRL |= 1 << 1)
#define  SDA_L    (GPIOF->BSRRH |= 1 << 1)
#define  READ_SDA ((GPIOF->IDR & 1 << 1)&&1)

void IIC_init(void);
void IIC_start(void);
void IIC_stop(void);
void IIC_send_ack(void);
void IIC_send_noack(void);
u8 IIC_get_ack(void);
void write_byte(u8 data);
u8 read_byte(u8 ack);
#endif



#include "iic.h"
#include "all.h"

void IIC_init(void)
{
RCC->AHB1ENR |= 1 << 5;

GPIOF->MODER &= ~(3 << (2 * 0));
GPIOF->MODER |= 1 << (2 * 0);
GPIOF->OTYPER &= ~(1 << 0);
GPIOF->OSPEEDR &= ~(3 << (2 * 0));
GPIOF->OSPEEDR |= 2 << (2 * 0);

GPIOF->MODER &= ~(3 << (2 * 1));
GPIOF->MODER |= 1 << (2 * 1);
GPIOF->OTYPER |= 1 << 1;
GPIOF->OSPEEDR &= ~(3 << (2 * 1));
GPIOF->OSPEEDR |= 2 << (2 * 1);

SCL_H;
SDA_H;
}
/***************&iquest;&ordf;&Ecirc;&frac14;********************/
void IIC_start(void)
{
SDA_H;
SCL_H;//
tim7_delay_us(5);
SDA_L;//
tim7_delay_us(5);
SCL_L;//
}
/****************&Iacute;&pound;&Ouml;&sup1;*******************/
void IIC_stop(void)
{
SCL_L;
SDA_L;//
tim7_delay_us(5);
SCL_H;
tim7_delay_us(5);
SDA_H;//
tim7_delay_us(4);
}
/********************·&cent;&Euml;&Iacute;&Oacute;&brvbar;&acute;&eth;***************/
void IIC_send_ack(void)
{
SCL_L;
SDA_L;
tim7_delay_us(5);
SCL_H;
tim7_delay_us(5);
SCL_L;
}
/*********************·&cent;&Euml;&Iacute;&sup2;&raquo;&Oacute;&brvbar;&acute;&eth;************/
void IIC_send_noack(void)
{
SCL_L;
SDA_H;
tim7_delay_us(5);
SCL_H;
tim7_delay_us(5);
SCL_L;
}
/******************&frac12;&Oacute;&Ecirc;&Otilde;&Oacute;&brvbar;&acute;&eth;********************/
u8 IIC_get_ack(void)
{
u8 i = 0;
SCL_L;
tim7_delay_us(5);
SCL_H;
while(READ_SDA)//
{
  i++;
  if(i >= 250)//
  {
   IIC_stop();
   return 1;
  }
}
tim7_delay_us(5);
SCL_L;
return 0;
}
/******************&ETH;&acute;×&Ouml;&frac12;&Uacute;***********************/
void write_byte(u8 data)
{
u8 i;
for(i = 0;i < 8;i++)//
{
  SCL_L;         //&Ocirc;&Ecirc;&ETH;í&ETH;&acute;SDA
  if(data & 0x80)//
  {
   SDA_H;       //&ETH;&acute;1
  }else
  {
   SDA_L;       //&ETH;&acute;0
  }
  tim7_delay_us(5);
  SCL_H;         //
  tim7_delay_us(5);
  SCL_L;         //
  data <<= 1;    //
}
}
/**********************&para;&Aacute;×&Ouml;&frac12;&Uacute;************************/
u8 read_byte(u8 ack)
{
u8 i,data = 0;
for(i = 0;i < 8; i++)
{
  data <<= 1;//
  SCL_L;
  tim7_delay_us(5);
  SCL_H;
  if(READ_SDA)//
  {
   data |= 1;
  }
}
if(!ack)//
{
  IIC_send_ack();
}
else
{
  IIC_send_noack();
}
return data;//
}


void BH1750_init(void)
{
BH1750_write(0x46,0x01);   //
BH1750_write(0x46,0x07);   //
BH1750_write(0x46,0x42);   //&Iacute;
BH1750_write(0x46,0x65);   
BH1750_write(0x46,0x10);   


}

/******************************************************
BH1750写函数
**************************************************/
void BH1750_write(u8 adder,u8 data)
{
IIC_start();           //
write_byte(adder);
if(IIC_get_ack())      //
{
  goto end;            //
}
write_byte(data);      //
if(IIC_get_ack())      //
{
  goto end;            //
}
end:
IIC_stop();            //
tim7_delay_ms(5);
}

/******************************************************
  读函数
**************************************************/
u16 BH1750_read(u8 adder)
{
u16 hbyte = 0,lbyte = 0;
IIC_start();           //
write_byte(adder|0x01);
if(IIC_get_ack())      //
{
  goto end;
}
hbyte = read_byte(0);    //
lbyte = read_byte(1);   
end:
IIC_stop();                      //
return (hbyte<<8)|lbyte;        
}

int main(void)
{
u16 temp = 0;
usart1_init(84,9600,0);
time7_init();
IIC_init();
BH1750_init();
while(1)
{
  tim7_delay_ms(180);
  temp = BH1750_read(0x46);
//  temp = temp*0xA/0xC;
  printf("%x\n",temp);
}
}




捕获.PNG
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2016-9-25
在线时间
8 小时
发表于 2016-10-22 19:19:19 | 显示全部楼层
有个疑问:
IIC_get_ack、read_byte函数里都有:
  SCL_L;
  tim7_delay_us(5);
  SCL_H;
  if(READ_SDA)//
怎么在SCL为高时(几乎是上升沿)读SDA?
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2016-10-8
在线时间
16 小时
 楼主| 发表于 2016-10-22 20:08:56 | 显示全部楼层
hcf98 发表于 2016-10-22 19:19
有个疑问:
IIC_get_ack、read_byte函数里都有:
  SCL_L;

SCL高电平时,发送/接收SDA,SCL低电平时,才能改变SDA的值
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-3-1 02:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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