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

2019-07-20 19:25发布

本帖最后由 木子山风 于 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 ",temp);
}
}




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
hcf98
1楼-- · 2019-07-20 20:27
 精彩回答 2  元偷偷看……
木子山风
2楼-- · 2019-07-20 21:02
hcf98 发表于 2016-10-22 19:19
有个疑问:
IIC_get_ack、read_byte函数里都有:
  SCL_L;

SCL高电平时,发送/接收SDA,SCL低电平时,才能改变SDA的值

一周热门 更多>