137 lines
2.7 KiB
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;
|
|
}
|