STM32驱动_GY-30

GY_30.c

  GY_30.c如下:

#include "sys.h"
#include "GY_30.h"
#include "delay.h"
#include "myiic.h"

BYTE BUF[8]; /* 接收数据缓存区 */

void BH1750_Start ( void ) {
    
     /* 光照传感器起始信号 */
    IIC_Start();
}

void BH1750_Stop ( void ) {
    
     /* 光照传感器停止信号 */
    IIC_Stop();
}

void BH1750_SendACK ( BYTE ack ) {
    
     /* 发送应答信号。参数ack为0是ACK,为1是NAK */
    if ( ack == 0 ) {
    
    
        IIC_Ack();
    } else {
    
    
        IIC_NAck();
    }
}

BYTE BH1750_RecvACK ( void ) {
    
     /* 接收应答信号 */
    return IIC_Wait_Ack();
}

void BH1750_SendByte ( BYTE dat ) {
    
     /* 向IIC总线发送一个字节数据 */
    IIC_Send_Byte ( dat );
    BH1750_RecvACK();
}

BYTE BH1750_RecvByte ( void ) {
    
     /* 从IIC总线接收一个字节数据 */
    return IIC_Read_Byte ( 0 );
}

void Single_Write_BH1750 ( uchar REG_Address ) {
    
    
    BH1750_Start(); /* 起始信号 */
    BH1750_SendByte ( SlaveAddress ); /* 发送设备地址 + 写信号 */
    BH1750_SendByte ( REG_Address ); /* 内部寄存器地址 */
    BH1750_Stop(); /* 发送停止信号 */
}

void Init_BH1750 ( void ) {
    
     /* BH1750初始化函数 */
    IIC_Init();
    delay_ms ( 50 );
    Single_Write_BH1750 ( 0x01 );
}

void Multiple_read_BH1750 ( void ) {
    
     /* 连续读出BH1750内部数据 */
    uchar i;
    BH1750_Start(); /* 起始信号 */
    BH1750_SendByte ( SlaveAddress + 1 ); /* 发送设备地址 + 读信号 */

    for ( i = 0; i < 3; i++ ) {
    
     /* 连续读取2个地址数据,存储在BUF中 */
        BUF[i] = BH1750_RecvByte(); /* BUF[0]存储0x32地址中的数据 */

        if ( i == 3 ) {
    
    
            BH1750_SendACK ( 1 ); /* 最后一个数据需要回应NOACK */
        } else {
    
    
            BH1750_SendACK ( 0 ); /* 回应ACK */
        }
    }

    BH1750_Stop(); /* 停止信号 */
    delay_ms ( 5 );
}

GY_30.h

  GY_30.h如下:

#ifndef _GY_30_H_
#define _GY_30_H_

#define uchar unsigned char
#define uint unsigned int

typedef unsigned char BYTE;
typedef unsigned short WORD;

#define SlaveAddress 0x46

void BH1750_Start ( void );
void BH1750_Stop ( void );
void BH1750_SendACK ( BYTE ack );
BYTE BH1750_RecvACK ( void );
void BH1750_SendByte ( BYTE dat );
BYTE BH1750_RecvByte ( void );
void Single_Write_BH1750 ( uchar REG_Address );
void Init_BH1750 ( void );
void Multiple_read_BH1750 ( void );
#endif

myiic.c

  myiic.c如下:

#include "myiic.h"
#include "delay.h"

void IIC_Init ( void ) {
    
    
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd ( RCC_APB2Periph_GPIOC, ENABLE );
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init ( GPIOC, &GPIO_InitStructure );
    IIC_SCL = 1;
    IIC_SDA = 1;
}

void IIC_Start ( void ) {
    
    
    SDA_OUT();
    IIC_SDA = 1;
    IIC_SCL = 1;
    delay_us ( 4 );
    IIC_SDA = 0;
    delay_us ( 4 );
    IIC_SCL = 0;
}

void IIC_Stop ( void ) {
    
    
    SDA_OUT();
    IIC_SCL = 0;
    IIC_SDA = 0;
    delay_us ( 4 );
    IIC_SCL = 1;
    IIC_SDA = 1;
    delay_us ( 4 );
}

u8 IIC_Wait_Ack ( void ) {
    
    
    u8 ucErrTime = 0;
    SDA_IN();
    IIC_SDA = 1;
    delay_us ( 1 );
    IIC_SCL = 1;
    delay_us ( 1 );

    while ( READ_SDA ) {
    
    
        ucErrTime++;

        if ( ucErrTime > 250 ) {
    
    
            IIC_Stop();
            return 1;
        }
    }

    IIC_SCL = 0;
    return 0;
}

void IIC_Ack ( void ) {
    
    
    IIC_SCL = 0;
    SDA_OUT();
    IIC_SDA = 0;
    delay_us ( 2 );
    IIC_SCL = 1;
    delay_us ( 2 );
    IIC_SCL = 0;
}

void IIC_NAck ( void ) {
    
    
    IIC_SCL = 0;
    SDA_OUT();
    IIC_SDA = 1;
    delay_us ( 2 );
    IIC_SCL = 1;
    delay_us ( 2 );
    IIC_SCL = 0;
}

void IIC_Send_Byte ( u8 txd ) {
    
    
    u8 t;
    SDA_OUT();
    IIC_SCL = 0;

    for ( t = 0; t < 8; t++ ) {
    
    
        IIC_SDA = ( txd & 0x80 ) >> 7;
        txd <<= 1;
        delay_us ( 2 );
        IIC_SCL = 1;
        delay_us ( 2 );
        IIC_SCL = 0;
        delay_us ( 2 );
    }
}

u8 IIC_Read_Byte ( unsigned char ack ) {
    
    
    unsigned char i, receive = 0;
    SDA_IN();

    for ( i = 0; i < 8; i++ ) {
    
    
        IIC_SCL = 0;
        delay_us ( 2 );
        IIC_SCL = 1;
        receive <<= 1;

        if ( READ_SDA ) {
    
    
            receive++;
        }

        delay_us ( 1 );
    }

    return receive;
}

myiic.h

  myiic.h如下:

#ifndef __MYIIC_H
#define __MYIIC_H
#include "sys.h"

#define SDA_IN()  {
      
      GPIOC->CRL &= 0XFFF0FFFF; GPIOC->CRL |= 8 << (4*4);}
#define SDA_OUT() {
      
      GPIOC->CRL &= 0XFFF0FFFF; GPIOC->CRL |= 3 << (4*4);}

#define IIC_SCL  PCout(3)
#define IIC_SDA  PCout(4)
#define READ_SDA PCin(4)

void IIC_Init ( void );
void IIC_Start ( void );
void IIC_Stop ( void );
void IIC_Send_Byte ( u8 txd );
u8 IIC_Read_Byte ( unsigned char ack );
u8 IIC_Wait_Ack ( void );
void IIC_Ack ( void );
void IIC_NAck ( void );
void IIC_Write_One_Byte ( u8 daddr, u8 addr, u8 data );
u8 IIC_Read_One_Byte ( u8 daddr, u8 addr );
#endif

main.c

  main.c如下:

#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "GY_30.h"
#include "string.h"
#include "stdio.h"

extern BYTE BUF[];

int main ( void ) {
    
    
    float temp = 0.0f; /* 要显示的数值 */
    unsigned int dis_data = 0; /* 从传感器中读取的数据 */
    char show_buf[30] = {
    
    0}; /* 数据发送缓冲区 */
    SystemInit();
    delay_init ( 72 );
    NVIC_Configuration();
    uart_init ( 9600 );
    Init_BH1750();

    while ( 1 ) {
    
    
        Single_Write_BH1750 ( 0x01 ); /* power on */
        Single_Write_BH1750 ( 0x10 ); /* H-resolution mode */
        delay_ms ( 180 ); /* 延时180ms */
        Multiple_read_BH1750(); /* 连续读出数据,存储在BUF中 */
        dis_data = BUF[0];
        dis_data = ( dis_data << 8 ) + BUF[1]; /* 合成数据,即光照数据 */
        temp = ( float ) dis_data / 1.2;
        sprintf ( show_buf, "Light is %d LX\r\n", ( int ) temp );
        printf ( "%s", show_buf );
        memset ( show_buf, 0, sizeof ( show_buf ) );
        delay_ms ( 500 );
    }
}

猜你喜欢

转载自blog.csdn.net/fukangwei_lite/article/details/121046606