初级会员

- 积分
- 124
- 金钱
- 124
- 注册时间
- 2016-4-3
- 在线时间
- 41 小时
|
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); //·¢Ëíêy¾Y
I2C_SCL_L;
delay_us(2);
}
}
//I2C ¶áè¡ò»¸ö×Ö½ú
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õê¼»ˉ
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);
}
}
|
|