1、IIC配置

2、aht20.c
#include "aht20.h"
float AHT20_Temp,AHT20_Humidity;
extern I2C_HandleTypeDef hi2c1;
static void AHT20_Send(uint8_t *data, uint8_t len)
{
HAL_I2C_Master_Transmit(&hi2c1, AHT20_ADDRESS_W, data, len, 0xFF);
}
static void AHT20_Receive(uint8_t *data, uint8_t len)
{
HAL_I2C_Master_Receive(&hi2c1, AHT20_ADDRESS_R, data, len, 0xFF);
}
/**
* @brief AHT20初始化函数
*/
void AHT20_Init(void)
{
uint8_t readBuffer;
HAL_Delay(40);
AHT20_Receive(&readBuffer, 1); //获取传感器状态
if((readBuffer & 0x08) == 0x00) //校准是否开启
{
uint8_t sendBuffer[3] = {0xBE, 0x08, 0x00};
AHT20_Send(sendBuffer, 3); //开启校准
}
}
/**
* @brief AHT20测量函数
* @note 传感器在采集时需要时间,主机发出测量指令(0xAC)后,延时75毫秒以上再读取转换后的数据并判断返回的状态位是否正常。
* 若状态比特位[Bit7]为0代表数据可正常读取,为1时传感器为忙状态,主机需要等待数据处理完成。
**/
void AHT20_Measure(void)
{
uint8_t sendBuffer[3] = {0xAC, 0x33, 0x00};
uint8_t readBuffer[6];
AHT20_Send(sendBuffer, 3);
HAL_Delay(75); //延时等待数据转换
AHT20_Receive(readBuffer, 6);
if((readBuffer[0] & 0x80) == 0x00)
{
uint32_t data = 0;
data = ((uint32_t)readBuffer[3] >> 4) + ((uint32_t)readBuffer[2] << 4) + ((uint32_t)readBuffer[1] << 12);
AHT20_Humidity = data * 100.0f / (1 << 20);
data = (((uint32_t)readBuffer[3] & 0x0F) << 16) + (((uint32_t)readBuffer[4]) << 8) + (uint32_t)readBuffer[5];
AHT20_Temp = data * 200.0f / (1 << 20) - 50;
}
}
3、aht20.h
#ifndef __AHT20_H__
#define __AHT20_H__
// AHT20 IIC器件地址
#define AHT20_ADDRESS_W 0x70
#define AHT20_ADDRESS_R 0x71
void AHT20_Init(void);
void AHT20_Measure(void);
#endif