首先对寄存器地址进行宏定义
MAX44009_Reg.h
#ifndef _MAX44009_REG_H
#define _MAX44009_REG_H
#define MAX44009_Interupt_Status 0x00
#define MAX44009_Interrupt_Enable 0x01
#define MAX44009_Configuration 0x02
#define MAX44009_Lux_High_Byte 0x03
#define MAX44009_Lux_Low_Byte 0x04
#define MAX44009_Upper_Threshold_High_Byte 0x05
#define MAX44009_Lower_Threshold_High_Byte 0x06
#define MAX44009_Threshold_Timer 0x07
#endif
然后写MAX44009.c文件
#include "stm32f10x.h" // Device header
#include"MAX44009_Reg.h"
#include<math.h>
#define MAX44009_ADDRESS 0x94
void MAX44009_WaitEvent(I2C_TypeDef*I2Cx , uint32_t I2C_EVENT) //等待EV时间结束
{
uint32_t Timeout;
Timeout = 100000;
while (I2C_CheckEvent(I2Cx,I2C_EVENT) != SUCCESS)
{
Timeout --;
if (Timeout == 0)
{
break;
}
}
}
void MAX44009_WriteReg(uint8_t RegAddress,uint8_t Data) //写单个寄存器
{
I2C_GenerateSTART(I2C2,ENABLE);
MAX44009_WaitEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT) ;
I2C_Send7bitAddress(I2C2,MAX44009_ADDRESS,I2C_Direction_Transmitter);
MAX44009_WaitEvent(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) ;
I2C_SendData(I2C2,RegAddress);
MAX44009_WaitEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTING) ;
I2C_SendData(I2C2,Data);
MAX44009_WaitEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED) ;
I2C_GenerateSTOP(I2C2,ENABLE);
}
uint8_t MAX44009_ReadReg(uint8_t RegAddress)//读寄存器
{
uint8_t Data;
I2C_GenerateSTART(I2C2,ENABLE);
MAX44009_WaitEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT);
I2C_Send7bitAddress(I2C2,MAX44009_ADDRESS,I2C_Direction_Transmitter);
MAX44009_WaitEvent(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) ;
I2C_SendData(I2C2,RegAddress);
MAX44009_WaitEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED);
I2C_GenerateSTART(I2C2,ENABLE);
MAX44009_WaitEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT);
I2C_Send7bitAddress(I2C2,MAX44009_ADDRESS,I2C_Direction_Receiver);
MAX44009_WaitEvent(I2C2,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED) ;
I2C_AcknowledgeConfig(I2C2,DISABLE);
I2C_GenerateSTOP(I2C2,ENABLE);
MAX44009_WaitEvent(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED) ;
Data = I2C_ReceiveData(I2C2);
I2C_AcknowledgeConfig(I2C2,ENABLE);
return Data;
}
void MAX44009_Init(void) //MAX44009初始化
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
I2C_InitTypeDef I2C_InitStructure;
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_ClockSpeed = 50000;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_OwnAddress1 = 0x00;
I2C_Init(I2C2,&I2C_InitStructure);
I2C_Cmd(I2C2,ENABLE);
MAX44009_WriteReg(MAX44009_Interrupt_Enable,0x00);
MAX44009_WriteReg(MAX44009_Configuration,0x03);
MAX44009_WriteReg(MAX44009_Upper_Threshold_High_Byte,0xFF);
MAX44009_WriteReg(MAX44009_Lower_Threshold_High_Byte,0x00);
MAX44009_WriteReg(MAX44009_Threshold_Timer,0xFF);
}
void MAX44009_GetData(float *LUX) //通过指针传参
{
uint8_t Data_H, Data_L, M;
float E;
I2C_GenerateSTART(I2C2,ENABLE);
MAX44009_WaitEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT);
I2C_Send7bitAddress(I2C2,MAX44009_ADDRESS,I2C_Direction_Transmitter);
MAX44009_WaitEvent(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) ;
I2C_SendData(I2C2,MAX44009_Lux_High_Byte);
MAX44009_WaitEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED);
I2C_GenerateSTART(I2C2,ENABLE);
MAX44009_WaitEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT);
I2C_Send7bitAddress(I2C2,MAX44009_ADDRESS,I2C_Direction_Receiver);
MAX44009_WaitEvent(I2C2,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED) ;
MAX44009_WaitEvent(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED) ;
Data_H = I2C_ReceiveData(I2C2);
I2C_AcknowledgeConfig(I2C2,DISABLE);
I2C_GenerateSTOP(I2C2,ENABLE);
MAX44009_WaitEvent(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED) ;
Data_L = I2C_ReceiveData(I2C2);
I2C_AcknowledgeConfig(I2C2,ENABLE);
E = (float)(Data_H >> 4);
M = ((Data_H & 0x0F) << 4) | (Data_L & 0x0F);
*LUX =pow(2.0, E) * M * 0.045;
}
头文件
#ifndef _MAX44009_H
#define _MAX44009_H
void MAX44009_WriteReg(uint8_t RegAddress,uint8_t Data);
uint8_t MAX44009_ReadReg(uint8_t RegAddress);
void MAX44009_Init(void);
void MAX44009_GetData(float *LUX);
#endif
main.c
#include "stm32f10x.h" // Device header
#include"Delay.h"
#include"OLED.h"
#include"MAX44009.h"
float LUX;
int main()
{
OLED_Init();
MAX44009_Init();
OLED_ShowString(1,1,"LUX:");
while(1)
{
MAX44009_GetData(&LUX);
OLED_ShowNum(1,5,LUX,6);
}
}