/* * AHT20.c * * Created on: Sep 24, 2024 * Author: 10425 */ #include "AHT20.h" #define I2C_HANDLE hi2c2 #define AHT20_TIMEOUT 10 MYI2C_Struct SENx = {0}; void AHT20_Init(MYI2C_Struct *pst,uint16_t ReadTimMS,uint16_t xAddr) { HAL_StatusTypeDef result; pst->Adrr =xAddr; pst->Step = SENSOR_IDLE; result=HAL_I2C_IsDeviceReady(&I2C_HANDLE, pst->Adrr<<1, 10, 200); if(ReadTimMS>MinReadTim)pst->SetRTim=ReadTimMS; else pst->SetRTim=MinReadTim; } uint8_t AHT20_READ_FUNC(MYI2C_Struct *pst,uint8_t device_addr,uint8_t register_addr,uint8_t *pDat,uint8_t len) { uint8_t NoAck=0; if(register_addr) { // 发送寄存器地址 if (HAL_I2C_Mem_Write(&I2C_HANDLE, (device_addr << 1), register_addr, I2C_MEMADD_SIZE_8BIT, NULL, 0, AHT20_TIMEOUT) != HAL_OK) { NoAck++; } } // 读取数据 if (HAL_I2C_Master_Receive(&I2C_HANDLE, (device_addr << 1) | 0x01, pDat, len, AHT20_TIMEOUT) != HAL_OK) { NoAck++; } pst->ErrFlag=NoAck; return NoAck; } /******************************************************************************* * Function Name : * Description : * Input : None * Output : None * Return :None *******************************************************************************/ uint8_t AHT20_WRITE_FUNC(MYI2C_Struct *pst,uint8_t device_addr,uint8_t register_addr,uint8_t *pDat,uint8_t len) { uint8_t NoAck = 0; // 将要发送的数据缓冲区 uint8_t data_buffer[len + 1]; data_buffer[0] = register_addr; // 第一个字节是寄存器地址 memcpy(&data_buffer[1], pDat, len); // 后续字节是要写入的数据 // 发送设备地址、寄存器地址和数据 if (HAL_I2C_Master_Transmit(&I2C_HANDLE, (device_addr << 1), data_buffer, len + 1, HAL_MAX_DELAY) != HAL_OK) { NoAck++; } // 更新错误标志 pst->ErrFlag = NoAck; return NoAck; } uint8_t CheckCrc8(uint8_t *pDat,uint8_t Lenth) { uint8_t crc = 0xff, i, j; for (i = 0; i < Lenth ; i++) { crc = crc ^ *pDat; for (j = 0; j < 8; j++) { if (crc & 0x80) crc = (crc << 1) ^ 0x31; else crc <<= 1; } pDat++; } return crc; } void AHT20_Handle(MYI2C_Struct *pst) { uint32_t s32x; pst->timcnt += MYI2C_Tick; if(pst->timcnt>PowerOnTim && pst->Step==SENSOR_IDLE) { pst->Step=SENSOR_MEASURE; pst->SendByte[0]=0x33; pst->SendByte[1]=0x00; AHT20_WRITE_FUNC(pst,pst->Adrr,0xAC, &pst->SendByte[0], 2); } else if(pst->timcnt>MeasureTim && pst->Step==SENSOR_MEASURE) { pst->Step=SENSOR_COMPLETE; AHT20_READ_FUNC(pst,pst->Adrr,0, &pst->ReadByte[0], 7); if(pst->ErrFlag==0) { if((CheckCrc8(&pst->ReadByte[0],6)==pst->ReadByte[6])&&((pst->ReadByte[0]&0x98) == 0x18)) { s32x=pst->ReadByte[1];s32x=s32x<<8;s32x+=pst->ReadByte[2];s32x=s32x<<8;s32x+=pst->ReadByte[3];s32x=s32x>>4; pst->RH=s32x; pst->RH=pst->RH*100/1048576; s32x=pst->ReadByte[3]&0x0F;s32x=s32x<<8;s32x+=pst->ReadByte[4];s32x=s32x<<8;s32x+=pst->ReadByte[5]; pst->T=s32x; pst->T=pst->T*200/1048576-50; } } else { pst->RH=0; pst->T=0; } } else if(pst->timcnt>pst->SetRTim) { pst->Step=SENSOR_IDLE; pst->timcnt=0; } }