Micropython:[Errno 19] ENODEV 但 i2c.scan() returns 正确地址

Micropython: [Errno 19] ENODEV but i2c.scan() returns proper address

我目前正在使用连接到 esp32 的 SRF-10 传感器。它由 5V 供电,我正在使用电平转换器将电压降至 3.3V,以便能够在 esp32 上使用它。 SCL 和 SDA 都具有数据表中推荐的 1.8K 上拉电阻。 我编写了以下脚本来尝试从传感器读取数据。我不完全确定它是否正确,但是当它到达第 16 行时,我收到一条错误消息,提示 [Errno 19] ENODEV。我能找到的一切都表明 i2c 连接工作不正常,但是当我 运行 i2c.scan() 它 returns 传感器地址时,我猜连接不是问题。 我的脚本如下:

from machine import I2C, Pin
import time

byte = bytearray(4)
#Distance units
unit_in = 0x50
unit_cm = 0x51
unit_us = 0x52

i2c = I2C(scl=Pin(21), sda=Pin(22))
address = i2c.scan()[0]
print(address)

#Sensor range
range_mm = 11008 // 43 - 1
i2c.writeto_mem(range_mm, address, bytearray(2)) #line 16

#Begin reading
i2c.writeto_mem(unit_cm, address, bytearray(0))

#Reading after measurement
data = i2c.readfrom_mem(4, address, 0)
print(data)

这是输出:

112
Traceback (most recent call last):
  File "main.py", line 22, in <module>
OSError: [Errno 19] ENODEV
MicroPython v1.12 on 2019-12-20; ESP32 module with ESP32
Type "help()" for more information.

我可能做错了什么?

i2c.writeto_mem 的正确使用需要以下参数顺序:

writeto_mem(addr, memaddr, buf, *, addrsize=8)

因此,在第16行尝试使用:

i2c.writeto_mem(address, range_mm, bytearray(2)) #line 16

参考:class I2C