EC800MCNGB的I2C无法使用

EC800M QuecPython I2C 调试总结

原始问题

JN_yangpin.py 启动后 I2C 传感器读取全部失败。

未修复(根因)

machine.I2C.read/write 在所有已测固件上均不可用。测试了 3 个固件版本、60+ 组参数组合、4 路 I2C 通道、8 种 buffer 类型:

测试路径 结果
5 位置参数 read(addr, reg, 1, buf, 2) 'dalay' argument required
6 位置参数 read(addr, reg, 1, buf, 2, 0) buffer protocol required
全关键词 read(addr, reg, databuf=..., datasize=...) buffer protocol required
2 参数 write(addr, buf) 'regaddr_len' required
5 参数 write(addr, reg, 1, buf, 1) buffer protocol required
AT 命令 I2C 无响应

根因:固件 I2C Python 绑定层存在参数分发缺陷——read 需要的 dalay 参数会触发 bytearray 的 buffer protocol 检查失败,形成死锁。

已正常工作

  • GPIO / 防拆检测 :white_check_mark:
  • GNSS 定位 :white_check_mark:
  • MQTT 云通信 :white_check_mark:

解决方案

联系移远 FAE,提供测试文件 i2c_test.py 和固件版本号,要求 I2C 寄存器读取可工作的固件。

根据当前测试现象,建议先按固件/接口适配问题处理,不建议继续扩大参数组合测试。

建议提交给移远技术支持时附带以下信息,便于定位:

  1. 模组完整型号:EC800MCNGB
  2. 当前固件版本号
  3. QuecPython 版本信息
  4. 最小复现脚本:i2c_test.py
  5. I2C 外设地址、寄存器地址、读写长度
  6. 硬件连接信息:SCL/SDA 引脚、上拉电阻、电压域、示波器或逻辑分析仪波形
  7. 报错日志:如 dalay argument requiredbuffer protocol required

从描述看,GPIO、GNSS、MQTT 均正常,问题集中在 QuecPython machine.I2C.read/write 调用链路。若多版本固件、多个 I2C 通道、不同 buffer 类型均复现,建议由 FAE 确认该型号当前固件是否支持对应 I2C 寄存器读写接口,并提供可用固件或接口调用方式。

如需由工程师进一步处理,建议上传最小复现脚本和固件版本信息。

本回答仅供参考。若问题已解决,可标记为 :white_check_mark:解决方案 ;若仍有疑问,请等待官方技术人员回复,最终请以专业解答为准。

  1. 模组型号: EC800MCNGB
  2. 已测固件:
    • EC800MCNGBR06A01M08_OCPU_QPY_BETA0102
    • EC800MCNLER06A05M08_OCPU_QPY
  3. 复现脚本: /usr/i2c_test.py
  4. I2C 设备: CW2015 (0x62)、BMI270 (0x68)
  5. 引脚: SDA=66, SCL=67(模块专用 I2C 引脚)
  6. 核心报错: 5 位读→dalay required,6 位读/全关键词→buffer protocol

其他功能(GNSS、MQTT、GPIO)全部正常。

70+ 次测试、3 个固件。这是最后的死锁路径:

read(addr, databuf=buf, regaddr_len=1, regaddr=0x02, dalay=0)  → 'datasize' required
read(addr, databuf=buf, regaddr_len=1, regaddr=0x02, dalay=0, datasize=2) → buffer protocol

唯一能接受所有参数的路径,补全最后一个参数就崩。

能提供下你测试的脚本嘛,还有QPYCOM的报错截图


“”"

EC800M QuecPython I2C 最小复现脚本

固件: EC800MCNLER06A05M08_OCPU_QPY

模组: EC800MCNGB

I2C 外设: CW2015 (0x62), BMI270 (0x68)

引脚: SDA=66, SCL=67 (硬件 I2C1)

“”"

from machine import I2C

i2c = I2C(I2C.I2C1, fastmode=False)

addr = 0x62

reg = 0x02

buf = bytearray(4)

print(“===== EC800 I2C Signature Test =====\n”)

# 1. 5参数位置调用 read(addr, reg, regaddr_len, buf, size)

try:

i2c.read(addr, reg, 1, buf, 2)

print("READ(5-pos) OK:", list(buf\[:2\]))

except Exception as e:

print("READ(5-pos) FAIL:", e)

# 2. 全关键词调用 read(addr, reg, regaddr_len, databuf, datasize)

try:

i2c.read(addr, reg, regaddr_len=1, databuf=buf, datasize=2)

print("READ(keyword) OK:", list(buf\[:2\]))

except Exception as e:

print("READ(keyword) FAIL:", e)

# 3. write buffer-only write(addr, bytearray)

try:

i2c.write(addr, bytearray(\[0x02, 0x00\]))

print("WRITE(buffer) OK")

except Exception as e:

print("WRITE(buffer) FAIL:", e)

# 4. write register-mode write(addr, reg, bytearray)

try:

i2c.write(addr, reg, bytearray(\[0x00\]))

print("WRITE(reg+buf) OK")

except Exception as e:

print("WRITE(reg+buf) FAIL:", e)

print(“\n===== End =====”)


@7777777 EC800M中PIN66/67对应I2C0接口. 请切换试试.
有示波器或者逻辑分析仪, 可以先抓取下引脚上是否有波形输出确认下.

附件: class I2C – I2C通信 - QuecPython

I2C0之前就测试过了 没区别 示波器抓不出波形 能给一个最新的固件 然后给个测试demo我去试一下吗

006_Grey_IIC.py (3.5 KB)
006_Grey_IIC_EC800E.py (3.4 KB)
@7777777 附件为之前测试AHT10温湿度传感器脚本. 请查收验证. 固件版本直接使用官网发布版本既可. IIC为基础功能. 无需特殊固件版本.
注: 若无AHT10传感器可以先示波器查看是否有地址数据的波形. 由于没有应答ACK, 后面会没数据. 但地址波形会有一下.