You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32读取TMF8001 14字节出厂校准数据异常求助

ESP32读取TMF8001出厂校准数据全为0的问题

我在使用ESP32读取TMF8001的14字节出厂校准数据时遇到问题,读出的数据全为0。以下是TMF8X0X datasheet指定的操作步骤:

  1. 向TMF8X0X发送命令S 41 W 10 0A P,启动出厂校准序列;
  2. 可等待中断触发,或轮询寄存器0x1E直至返回0x0A(命令S 41 W 1e Sr 41 R A N P),最长等待2秒;
  3. 读取并存储14字节出厂校准数据(命令S 41 W 20 Sr 41 R A A A A A A A A A A A A A N P)。

我的ESP32代码实现如下:

//Factory calibration 
i2c_master_start(meas_read17_cmd);
i2c_master_write_byte(meas_read17_cmd, (0x41 << 1) | WRITE_BIT, ACK_CHECK_EN);
i2c_master_write_byte(meas_read17_cmd, 0x10, ACK_CHECK_EN);
i2c_master_write_byte(meas_read17_cmd, 0x0A, ACK_CHECK_EN);
i2c_master_stop(meas_read17_cmd);
ret = i2c_master_cmd_begin(i2c_num, meas_read17_cmd, 1000/portTICK_PERIOD_MS);
i2c_cmd_link_delete(meas_read17_cmd);
printf("TOF ret 17: %02x\n", ret);  

vTaskDelay(5000/portTICK_PERIOD_MS); // wait 100ms for measurement to complete

//Polling 0x1E register until it reads back 0x0A
i2c_master_start(meas_read20_cmd);
i2c_master_write_byte(meas_read20_cmd, (0x41 << 1) | WRITE_BIT, ACK_CHECK_EN);
i2c_master_write_byte(meas_read20_cmd, 0x1E, ACK_CHECK_EN);
i2c_master_start(meas_read20_cmd);
i2c_master_write_byte(meas_read20_cmd, (0x41 << 1) | READ_BIT, ACK_CHECK_EN);
i2c_master_read_byte(meas_read20_cmd, poll_register_2, NACK_VAL);
i2c_master_stop(meas_read20_cmd);
ret = i2c_master_cmd_begin(i2c_num, meas_read20_cmd, 1000/portTICK_PERIOD_MS);
i2c_cmd_link_delete(meas_read20_cmd);
printf("TOF ret 20: %02x\n", ret);    

vTaskDelay(100/portTICK_PERIOD_MS); // wait 100ms for measurement to complete

//Read back and store 14 bytes of factory calibration
i2c_master_start(meas_read19_cmd);
i2c_master_write_byte(meas_read19_cmd, (0x41 << 1) | WRITE_BIT, ACK_CHECK_EN);
i2c_master_write_byte(meas_read19_cmd, 0x20, ACK_CHECK_EN);
i2c_master_start(meas_read19_cmd);
i2c_master_write_byte(meas_read19_cmd, (0x41 << 1) | READ_BIT, ACK_CHECK_EN);
i2c_master_read_byte(meas_read19_cmd, reg4_1, ACK_VAL);
i2c_master_read_byte(meas_read19_cmd, reg4_2, ACK_VAL);
i2c_master_read_byte(meas_read19_cmd, reg4_3, ACK_VAL);
i2c_master_read_byte(meas_read19_cmd, reg4_4, ACK_VAL);
i2c_master_read_byte(meas_read19_cmd, reg4_5, ACK_VAL);
i2c_master_read_byte(meas_read19_cmd, reg4_6, ACK_VAL);
i2c_master_read_byte(meas_read19_cmd, reg4_7, ACK_VAL);
i2c_master_read_byte(meas_read19_cmd, reg4_8, ACK_VAL);
i2c_master_read_byte(meas_read19_cmd, reg4_9, ACK_VAL);
i2c_master_read_byte(meas_read19_cmd, reg4_10, ACK_VAL);
i2c_master_read_byte(meas_read19_cmd, reg4_11, ACK_VAL);
i2c_master_read_byte(meas_read19_cmd, reg4_12, ACK_VAL);
i2c_master_read_byte(meas_read19_cmd, reg4_13, ACK_VAL);
i2c_master_read_byte(meas_read19_cmd, reg4_14, NACK_VAL);
i2c_master_stop(meas_read19_cmd);
ret = i2c_master_cmd_begin(i2c_num, meas_read19_cmd, 1000/portTICK_PERIOD_MS);
i2c_cmd_link_delete(meas_read19_cmd);
printf("TOF ret 19: %02x\n", ret);    

vTaskDelay(100/portTICK_PERIOD_MS); // wait 100ms for measurement to complete

终端输出显示读取到的校准数据全为0:

BOOT 14: c0
TOF POLL REGISTER 1 (EXP 0x41): 41
TOF POLL REGISTER 2 (EXP 0x0A): 00
REG4_1: 00
REG4_2: 00
REG4_3: 00
REG4_4: 00
REG4_5: 00
REG4_6: 00
REG4_7: 00
REG4_8: 00
REG4_9: 00
REG4_10: 00
REG4_11: 00
REG4_12: 00
REG4_13: 00
REG4_14: 00

恳请各位提供技术帮助,谢谢!

内容的提问来源于stack exchange,提问作者Carlos Orozco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 22:18:10