ESP32读取TMF8001 14字节出厂校准数据异常求助
ESP32读取TMF8001出厂校准数据全为0的问题
我在使用ESP32读取TMF8001的14字节出厂校准数据时遇到问题,读出的数据全为0。以下是TMF8X0X datasheet指定的操作步骤:
- 向TMF8X0X发送命令
S 41 W 10 0A P,启动出厂校准序列; - 可等待中断触发,或轮询寄存器0x1E直至返回0x0A(命令
S 41 W 1e Sr 41 R A N P),最长等待2秒; - 读取并存储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
相关产品推荐
相关产品推荐

