void Single_Write_BH1750(uint8_t REG_Data) { while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY)!=RESET);//檢測是否總線忙 I2C_TransferHandling(I2C1,SlaveAddress,1,I2C_SoftEnd_Mode,I2C_Generate_Start_Write); while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS)==RESET);//檢測發送 I2C_SendData(I2C1,REG_Data); while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TC)==RESET); I2C_GenerateSTOP(I2C1,ENABLE); while(I2C_GetFlagStatus(I2C1,I2C_FLAG_STOPF)==RESET);//是否停止 } uint16_t Read_BH1750() { uint16_t Recev=0x00;//光強為16位。先發送高8后低8 while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY)!=RESET);//IFBUSY I2C_TransferHandling(I2C1,SlaveAddress+1,2,I2C_AutoEnd_Mode,I2C_Generate_Start_Read); while(I2C_GetFlagStatus(I2C1,I2C_FLAG_RXNE)==RESET); Recev|=I2C_ReceiveData(I2C1);Recev<<=8; while(I2C_GetFlagStatus(I2C1,I2C_FLAG_RXNE)==RESET); Recev|=I2C_ReceiveData(I2C1); while(I2C_GetFlagStatus(I2C1,I2C_FLAG_STOPF)==RESET); return Recev; } void BH1750_Get_Guang(float*Zhaodu) #include"stm32f10x_lib.h" #define uchar unsigned char #define uint unsigned int #define DataPort P0//LCD1602數據端口 #define SlaveAddress 0x46#define BH1750_SCL GPIO_Pin_14 #define BH1750_SDA GPIO_Pin_15 #define GPIO_I2C GPIOB #defineBH1750_SCL_0()GPIOF->BRR=BH1750_SCL #define BH1750_SCL_1()GPIOF->BSRR=BH1750_SCL #define BH1750_SDA_0()GPIOF->BRR=BH1750_SDA #define BH1750_SDA_1()GPIOF->BSRR=BH1750_SDA #define BH1750_SDA_STATE()(GPIOF->IDR&BH1750_SDA) return(GPIOB->IDR typedefunsigned char BYTE; typedef unsigned short WORD;BYTE BUF[8];//接收數據緩存區 uchar ge,shi,bai,qian,wan;//顯示變量 int dis_data;//變量 void Init_BH1750(void); void conversion(uint temp_data);void Single_Write_BH1750(ucharREG_Address); uchar Single_Read_BH1750(uchar REG_Address); void Multiple_Read_BH1750(void);//連續的讀取內部寄存器數據 u8BH1750_Start(void); void BH1750_Stop(void); u8 BH1750_SendByte(u8 Data); u8 BH1750_ReceiveByte(void); void BH1750_SendACK(void); void BH1750_SendNACK(void); void BH1750_Nop (void voidBH1750_Delay(unsigned int u8BH1750_ACK u8BH1750_READYu8BH1750_NACK u8BH1750_BUS_BUSY u8BH1750_BUS_ERROR u8BH1750_RETRY_COUNT//重試次數 void BH1750_Nop(void)u8i=50; while(i) voidBH1750_Delay(unsigned int unsignedintu8BH1750_Start(void)BH1750_SDA_1();BH1750_Nop(); BH1750_SCL_1();BH1750_Nop(); if(!BH1750_SDA_STATE())// //DebugPrint("TWI_START:BUSY\n"); return BH1750_BUS_BUSY; BH1750_SDA_0(); BH1750_Nop(); BH1750_SCL_0();BH1750_Nop(); if(BH1750_SDA_STATE())// //DebugPrint("TWI_START:BUSERROR\n"); return BH1750_BUS_ERROR; returnBH1750_READY; voidBH1750_Stop(void) BH1750_SDA_0();BH1750_Nop(); BH1750_SCL_1();BH1750_Nop(); BH1750_SDA_1();BH1750_Nop();// //DebugPrint("TWI_STOP\n"); voidBH1750_SendACK(void)BH1750_SDA_0(); BH1750_Nop(); BH1750_SCL_1(); BH1750_Nop(); BH1750_SCL_0(); BH1750_Nop(); BH1750_SDA_1(); //DebugPrint("TWI_SendACK\n"); voidBH1750_SendNACK(void)BH1750_SDA_1(); BH1750_Nop(); BH1750_SCL_1(); BH1750_Nop(); BH1750_SCL_0(); BH1750_Nop();// //DebugPrint("TWI_SendNACK\n"); //---------數據建立----------if(Data&0x80)Data<<=1;BH1750_Nop();//---數據建立保持一定延時----// BH1750_SCL_1(); BH1750_Nop(); BH1750_SCL_0(); BH1750_Nop();//延時,防止SCL還沒變成低時改變SDA,從而產生START/STOP信號//接收從機的應答BH1750_SDA_1(); BH1750_Nop(); BH1750_SCL_1(); BH1750_Nop(); if(BH1750_SDA_STATE())BH1750_SCL_0();BH1750_SDA_1();// //DebugPrint("TWI_NACK!n");return BH1750_NACK; BH1750_SCL_0(); BH1750_SDA_1();// //DebugPrint("TWI_ACK!n"); return BH1750_ACK; u8BH1750_ReceiveByte(void)u8i,Dat; BH1750_SDA_1(); BH1750_SCL_0(); Dat=0;BH1750_SCL_1();//產生時鐘上升沿[正脈沖],讓從機準備好數據BH1750_Nop(); Dat<<=1;if(BH1750_SDA_STATE())//讀引腳狀態BH1750_SCL_0();//準備好再次接收數據BH1750_Nop();//等待數據準備好// //DebugPrint("TWI_Dat:%xn",Dat); return Dat; //voidconversion(uint temp_data)temp_data=temp_data%10000; //取余運算 temp_data=temp_data%1000;//取余運算 temp_data=temp_data%100;//取余運算 temp_data=temp_data%10;//取余運算 voidSingle_Write_BH1750(uchar REG_Address)BH1750_Start();//起始信號 BH1750_SendByte(SlaveAddress);//發送設備地址+寫信號 BH1750_SendByte(REG_Address);//內部寄存器地址, BH1750_SendByte(REG_data);//內部寄存器數據, BH1750_Stop();//發送停止信號 ucharSingle_Read_BH1750(uchar REG_Address) ucharREG_data;BH1750_Start();//起始信號 BH1750_SendByte(SlaveAddress);//發送設備地址+寫信號 BH1750_SendByte(REG_Address);//發送存儲單元地址,從0開始 BH1750_Start();//起始信號 BH1750_SendByte(SlaveAddress+1);//發送設備地址+讀信號 REG_data=BH1750_RecvByte();//讀出寄存器數 BH1750_SendACK(1);BH1750_Stop();//停止信號 return REG_data;//連續讀出BH1750內部數據 voidMultiple_Read_BH1750(void)BH1750_Start(); //起始信號 BH1750_SendByte(SlaveAddress+1);//發送設備地址+讀信號 BH1750_ReceiveByte();//BUF[0]存儲0x32地址中的數據 BH1750_SendNACK();//最后一個數據需要回NOACK BH1750_SendACK();//回應 ACK BH1750_Stop();//停止信號// Delay5ms();BH1750_Delay(500)//初始化BH1750, void Init_BH1750() voidBH1750_Get_Guang(float*Zhaodu)//延時100ms Init_BH1750();//初始化BH1750 Single_Write_BH1750(0x01); resolutionmode BH1750_Delay(200)//延時180ms Multiple_Read_BH1750();//連續讀出數據,存儲在BUF dis_data=BUF[0]; dis_data=(dis_data<<8)+BUF[1]; //合成數據,即光照數據 *Zhaodu=(float)dis_data/1.2;
|