【发布时间】:2021-02-25 00:51:48
【问题描述】:
我正在尝试在 ESP32 TTGO T-display 上运行以下代码,从 loboris 运行 micropython。 (它是 esp32 预装了 TTGO Display 的显示驱动程序)我通过 i2c 连接了一个 GY-906 温度传感器进行测试。 i2c.scan() 在 0x5a [80] 上发现它没有问题,就像它应该的那样,但是当我请求温度数据时,响应总是 0xFF 而不是正确的温度读数。
当我在 WeMos D1 上运行完全相同的代码时(唯一的区别是引脚号),我得到了返回的温度数据。我附上了两个逻辑分析仪的屏幕截图,希望有人能告诉我我需要做些什么不同的事情。两者都直接从 3.3、gnd 和 2 个 i2c 引脚接线。
我尝试过的方法:在 SDA、SLC(10k、1k、100)上添加上拉电阻。切换到不同的 i2c 引脚。结果似乎是一样的。我错过了什么?我不知道的地方应该有一个电阻器吗?其他硬件?截图让我觉得GY906正在响应,只是响应值错误。
主代码
import temp_sensor
Pin = machine.Pin
I2C = machine.I2C
i2c = machine.I2C(0, scl=Pin(22), sda=Pin(21), freq=100000)
temp1 = temp_sensor.Temp.init(i2c)
print(temp1.read_object_temp())
time.sleep(1)
print(temp1.read_object_temp())
time.sleep(1)
print(temp1.read_object_temp())
time.sleep(1)
print(temp1.read_object_temp())
temp_sensor.py
import mlx90614 ##From https://github.com/mcauser/micropython-mlx90614
class Temp():
def init(i2c):
try:
sensor = mlx90614.MLX90614(i2c)
except:
print('couldnt connect to an i2c temp sensor')
sensor = False
else:
print('temp found')
#return sensor
finally:
return sensor
【问题讨论】:
-
缺少一个我没有复制进去的导入机器、显示器、时间。它就在那里。
-
我试过减慢 i2c 时钟并加快它的速度。它没有帮助。 50k一直到400k。 WeMos 在大多数速度下都可以工作。
-
在工作单元上,整个 I2C 事务的写入和读取部分通过重复的 START 条件连接。在非工作单元上,写事务通过 STOP 条件结束,不久之后,读事务有一个完全独立的 START。一些 I2C 设备根本无法处理以这种方式拆分的事务 - 我在此传感器的数据表中找不到任何明确的声明,但示例事务都使用了重复的 START。
-
也就是说,我不确定您可以采取哪些措施来影响 I2C 事务的执行方式。我猜你的那个单元上有一个过时或有问题的模块 - 但它可能是
machine.I2C或mlx90614有问题。 -
@jasonharper 谢谢。我认为 loboris 的预编译图像中的 machine.I2C 无法正常工作。我用标准的 esp32 图像(esp32 v1.13)重新刷新了非工作设备,它读取温度很好。所以 mlx90614.py 和 i2c 硬件和引脚看起来都很好。我正在使用我需要的显示库(我使用该图像的原因)编译新版本的固件。会回来报告的。
标签: i2c micropython