[Mod] AHT10驱动 优化AHT10源码 +1

1. 解决数据读取错误;
2. 添加重试机制;
This commit is contained in:
gaoyang3513
2026-03-18 22:57:50 +08:00
parent 0ded3c35eb
commit 8347ce25fa
3 changed files with 41 additions and 39 deletions

View File

@ -14,3 +14,5 @@ insert_final_newline = false
[*.c]
indent_size = 8
indent_style = tab
trim_trailing_whitespace = true
insert_final_newline = true

View File

@ -9,12 +9,12 @@
int main() {
int ret = 0, fd_i2c_s = 0;
i2c_driver_info_t info = {0};
float humidity, temp;
fd_i2c_s = open ("/dev/i2c1", O_RDWR);
if (fd_i2c_s < 0) {
printf("ErrNo(%d) %s, failed to open I2C device\n", errno, strerror(errno));
return -1;
}
@ -24,22 +24,22 @@ int main() {
close(fd_i2c_s);
return -1;
}
while(1) {
float humidity, temp;
humidity =0.0f; temp = 0.0f;
ret = aht1x_getEvent(fd_i2c_s, AHTX0_I2CADDR_DEFAULT, &humidity, &temp);
if (ret < 0) {
printf("[%12s|%4u] ErrNo(%d), failed to read data from AHT1x\n", __FILE_NAME__, __LINE__, ret);
return ret;
}
printf("Temperature: %2.3f degrees C\n", temp);
printf("Humidity : %2.3f %% rH\n", humidity);
printf("Temperature: %2.3f \n", temp);
printf("Humidity : %2.3f %%rH\n", humidity);
usleep(500000); // wait 500ms before next read
sleep(1); // wait 500ms before next read
}
close(fd_i2c_s);
return 0;
}
}

View File

@ -22,12 +22,12 @@ static int _i2c_read(uint8_t address, uint8_t *data, size_t length, uint8_t stop
printf("Failed to allocate memory for I2C read\n");
return -1;
}
memset(data_recv, 0, recv_lent);
data_msg = (i2c_recv_t *)data_recv;
data_buf = (char *)data_recv + sizeof(*data_msg);
data_msg->slave.addr = address;
data_msg->slave.fmt = I2C_ADDRFMT_7BIT;
data_msg->len = length;
@ -39,10 +39,12 @@ static int _i2c_read(uint8_t address, uint8_t *data, size_t length, uint8_t stop
return ret;
}
memcpy(data, data_buf, length);
return ret;
}
static int _i2c_write(uint8_t address, const uint8_t *data, size_t length, uint8_t stop)
static int _i2c_write(uint8_t address, const uint8_t *data, size_t length, uint8_t stop)
{
int ret = 0;
char *data_send = NULL;
@ -62,16 +64,16 @@ static int _i2c_write(uint8_t address, const uint8_t *data, size_t length, uint8
data_msg->slave.fmt = I2C_ADDRFMT_7BIT;
data_msg->len = length;
data_msg->stop = stop;
memcpy ((char *)data_send + sizeof(*data_msg), data, length);
ret = devctl(fd_i2c, DCMD_I2C_SEND, data_send, send_lent, NULL);
if (ret < 0) {
printf("[%12s|%4u] ErrNo(%d) %s, failed to write I2C data\n", __FILE_NAME__, __LINE__, errno, strerror(errno));
return ret;
}
return ret;
return ret;
}
/**
@ -105,7 +107,7 @@ static int aht1x_getStatus(uint8_t address)
*/
int aht1x_begin(int i2c_dev, uint8_t i2c_address)
{
int ret = 0;
int ret = 0;
uint8_t cmd[3] = {0};
if (i2c_dev < 0) {
@ -122,7 +124,7 @@ int aht1x_begin(int i2c_dev, uint8_t i2c_address)
}
usleep(20000); // 20ms delay
while (aht1x_getStatus(i2c_address) & AHTX0_STATUS_BUSY) {
usleep(10000);
}
@ -158,38 +160,36 @@ int aht1x_begin(int i2c_dev, uint8_t i2c_address)
int aht1x_getEvent(int i2c_dev, uint8_t i2c_address, float *_humidity, float *_temperature)
{
int ret = 0;
uint8_t retry = 0;
uint8_t data[6] = {0};
uint8_t cmd[3] = {AHTX0_CMD_TRIGGER, 0x33, 0};
// read the data and store it!
uint8_t cmd[3] = {AHTX0_CMD_TRIGGER, 0x33, 0};
ret = _i2c_write(i2c_address, cmd, 3, 1);
ret = _i2c_write(i2c_address, cmd, sizeof(cmd), 1);
if (ret < 0) {
printf("[%s|%4u] ErrNo(%d) %s, failed to write TRIGGER command\n", __FILE_NAME__, __LINE__, ret);
return ret;
}
while (aht1x_getStatus(i2c_address) & AHTX0_STATUS_BUSY) {
delay(10);
}
do {
memset(data, 0, sizeof(data));
uint8_t data[6];
ret = _i2c_read(i2c_address, data, 6, 1);
if (ret < 0) {
printf("[%s|%4u] ErrNo(%d) %s, failed to read date from I2C Address[%#X]\n", __FILE_NAME__, __LINE__, ret, i2c_address);
return ret;
}
uint32_t h = data[1];
h <<= 8;
h |= data[2];
h <<= 4;
h |= data[3] >> 4;
ret = _i2c_read(i2c_address, data, sizeof(data), 1);
if (ret < 0) {
printf("[%s|%4u] ErrNo(%d) %s, failed to read date from I2C Address[%#X]\n", __FILE_NAME__, __LINE__, ret, i2c_address);
return ret;
}
if (retry)
usleep(200000);
} while ((data[0] & AHTX0_STATUS_BUSY) && (retry++ < 10));
// printf("Raw data: %02X %02X %02X %02X %02X %02X\n", data[0], data[1], data[2], data[3], data[4], data[5]);
uint32_t h = (data[1] << 8 | data[2]) << 4 | data[3] >> 4;
*_humidity = ((float)h * 100) / 0x100000;
uint32_t tdata = data[3] & 0x0F;
tdata <<= 8;
tdata |= data[4];
tdata <<= 8;
tdata |= data[5];
uint32_t tdata = ((data[3] & 0x0F)) << 16 | (data[4] << 8) | data[5];
*_temperature = ((float)tdata * 200 / 0x100000) - 50;
return true;