From 8347ce25fa485f8512cb38bc1d837394aac9b154 Mon Sep 17 00:00:00 2001 From: gaoyang3513 Date: Wed, 18 Mar 2026 22:57:50 +0800 Subject: [PATCH] =?UTF-8?q?[Mod]=20AHT10=E9=A9=B1=E5=8A=A8=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96AHT10=E6=BA=90=E7=A0=81=20+1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 解决数据读取错误; 2. 添加重试机制; --- .editorconfig | 2 + src/drivers/i2c/aht10/aht10.c | 16 ++++---- src/drivers/i2c/aht10/aht10_util.c | 62 +++++++++++++++--------------- 3 files changed, 41 insertions(+), 39 deletions(-) diff --git a/.editorconfig b/.editorconfig index 52cf467..ca144a7 100644 --- a/.editorconfig +++ b/.editorconfig @@ -14,3 +14,5 @@ insert_final_newline = false [*.c] indent_size = 8 indent_style = tab +trim_trailing_whitespace = true +insert_final_newline = true diff --git a/src/drivers/i2c/aht10/aht10.c b/src/drivers/i2c/aht10/aht10.c index 4d11cc0..70aa289 100644 --- a/src/drivers/i2c/aht10/aht10.c +++ b/src/drivers/i2c/aht10/aht10.c @@ -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; -} \ No newline at end of file +} diff --git a/src/drivers/i2c/aht10/aht10_util.c b/src/drivers/i2c/aht10/aht10_util.c index 3d1e271..c2499e4 100644 --- a/src/drivers/i2c/aht10/aht10_util.c +++ b/src/drivers/i2c/aht10/aht10_util.c @@ -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;