本帖最后由 木子山风 于 2016-10-16 21:09 编辑
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;
}
/***************¿ªÊ¼********************/
void IIC_start(void)
{
SDA_H;
SCL_H;//
tim7_delay_us(5);
SDA_L;//
tim7_delay_us(5);
SCL_L;//
}
/****************Í£Ö¹*******************/
void IIC_stop(void)
{
SCL_L;
SDA_L;//
tim7_delay_us(5);
SCL_H;
tim7_delay_us(5);
SDA_H;//
tim7_delay_us(4);
}
/********************·¢ËÍÓ¦´ð***************/
void IIC_send_ack(void)
{
SCL_L;
SDA_L;
tim7_delay_us(5);
SCL_H;
tim7_delay_us(5);
SCL_L;
}
/*********************·¢ËͲ»Ó¦´ð************/
void IIC_send_noack(void)
{
SCL_L;
SDA_H;
tim7_delay_us(5);
SCL_H;
tim7_delay_us(5);
SCL_L;
}
/******************½ÓÊÕÓ¦´ð********************/
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;
}
/******************д×Ö½Ú***********************/
void write_byte(u8 data)
{
u8 i;
for(i = 0;i < 8;i++)//
{
SCL_L; //ÔÊÐíдSDA
if(data & 0x80)//
{
SDA_H; //д1
}else
{
SDA_L; //д0
}
tim7_delay_us(5);
SCL_H; //
tim7_delay_us(5);
SCL_L; //
data <<= 1; //
}
}
/**********************¶Á×Ö½Ú************************/
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); //Í
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);
}
}
SCL高电平时,发送/接收SDA,SCL低电平时,才能改变SDA的值
一周热门 更多>