OV-Watch/Software/OV_Watch_V2.3.1/BSP/AHT21/AHT21.c

137 lines
2.7 KiB
C

#include "AHT21.h"
#define AHT_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE()
iic_bus_t AHT_bus =
{
.IIC_SDA_PORT = GPIOB,
.IIC_SCL_PORT = GPIOB,
.IIC_SDA_PIN = GPIO_PIN_13,
.IIC_SCL_PIN = GPIO_PIN_14,
};
uint8_t AHT_Read_Status(void)
{
uint8_t Byte_first;
IICStart(&AHT_bus);
IICSendByte(&AHT_bus,0x71);
IICWaitAck(&AHT_bus);
Byte_first = IICReceiveByte(&AHT_bus);
IICSendNotAck(&AHT_bus);
IICStop(&AHT_bus);
return Byte_first;
}
uint8_t AHT_Read_Cal_Enable(void) //check cal enable bit
{
uint8_t val = 0;//ret = 0,
val = AHT_Read_Status();
if((val & 0x68)==0x08) //check NOR mode
return 1;
else
return 0;
}
void AHT_Reset(void)//AHT21 send 0xBA reset call
{
IICStart(&AHT_bus);
IICSendByte(&AHT_bus,0x70);
IICWaitAck(&AHT_bus);
IICSendByte(&AHT_bus,0xBA);
IICWaitAck(&AHT_bus);
IICStop(&AHT_bus);
}
uint8_t AHT_Init(void)
{
AHT_CLK_ENABLE;
IICInit(&AHT_bus);
delay_ms(40);
if(AHT_Read_Status()&&0x08!=0x08)
{
IICStart(&AHT_bus);
IICSendByte(&AHT_bus,0x70);
IICWaitAck(&AHT_bus);
IICSendByte(&AHT_bus,0xBE);
IICWaitAck(&AHT_bus);
IICSendByte(&AHT_bus,0x08);
IICWaitAck(&AHT_bus);
IICSendByte(&AHT_bus,0x00);
IICWaitAck(&AHT_bus);
IICStop(&AHT_bus);
delay_ms(10);
}
//AHT_Reset();
return 0;
}
uint8_t AHT_Read(float *humi, float *temp)
{
uint8_t cnt=5;
uint8_t Byte_1th=0;
uint8_t Byte_2th=0;
uint8_t Byte_3th=0;
uint8_t Byte_4th=0;
uint8_t Byte_5th=0;
uint8_t Byte_6th=0;
uint32_t RetuData = 0;
IICStart(&AHT_bus);
IICSendByte(&AHT_bus,0x70);
IICWaitAck(&AHT_bus);
IICSendByte(&AHT_bus,0xAC);
IICWaitAck(&AHT_bus);
IICSendByte(&AHT_bus,0x33);
IICWaitAck(&AHT_bus);
IICSendByte(&AHT_bus,0x00);
IICWaitAck(&AHT_bus);
IICStop(&AHT_bus);
delay_ms(80);
while(AHT_Read_Status()&0x80==0x80 && cnt)
{
delay_ms(5);
cnt--;
AHT_Read_Status();
}
if(!cnt)
{return 1;}
IICStart(&AHT_bus);
IICSendByte(&AHT_bus,0x71);
IICWaitAck(&AHT_bus);
Byte_1th = IICReceiveByte(&AHT_bus);
IICSendAck(&AHT_bus);
Byte_2th = IICReceiveByte(&AHT_bus);
IICSendAck(&AHT_bus);
Byte_3th = IICReceiveByte(&AHT_bus);
IICSendAck(&AHT_bus);
Byte_4th = IICReceiveByte(&AHT_bus);
IICSendAck(&AHT_bus);
Byte_5th = IICReceiveByte(&AHT_bus);
IICSendAck(&AHT_bus);
Byte_6th = IICReceiveByte(&AHT_bus);
IICSendNotAck(&AHT_bus);
IICStop(&AHT_bus);
RetuData = (RetuData|Byte_2th)<<8;
RetuData = (RetuData|Byte_3th)<<8;
RetuData = (RetuData|Byte_4th);
RetuData =RetuData >>4;
*humi = (RetuData * 1000 >> 20);
*humi /= 10;
RetuData = 0;
RetuData = (RetuData|Byte_4th)<<8;
RetuData = (RetuData|Byte_5th)<<8;
RetuData = (RetuData|Byte_6th);
RetuData = RetuData&0xfffff;
*temp = ((RetuData * 2000 >> 20)- 500);
*temp /= 10;
return 0;
}