Skip to content

Air8000T 硬件 I2C0 读取 VEML3328 寄存器始终返回 FF FF,但同总线 BME280 正常 #139

Description

@eorry-bit

OpenLuat Issue 草稿:Air8000T 硬件 I2C0 读取 VEML3328 始终返回 FF FF

标题

Air8000T 硬件 I2C0 读取 VEML3328 寄存器始终返回 FF FF,但同总线 BME280 正常

环境

  • 模块/核心板:Air8000T_A13
  • 芯片:EC718HM
  • 固件:LuatOS@Air8000T base 26.04 bsp V2034 32bit
  • ROM Build:Apr 28 2026 18:13:36
  • IO 电压:3.3 V
  • 测试接口:硬件 I2C0
  • I2C0 引脚:SCL=I2C0_SCL/PIN80,SDA=I2C0_SDA/PIN81
  • 传感器模块:BME280 + VEML3328/VEML3328SL 二合一模块
  • 供电:VCC=3.3 V,GND 共地
  • 同一条 I2C 总线:
    • BME280 地址:0x76
    • VEML3328 地址:0x10

启动日志:

[2026-05-18 12:59:43.116][000000000.007] am_service_init 1358:Air8000T_A13
[2026-05-18 12:59:43.119][000000000.007] am_get_chip_type 865:6bef6,1b,64,af,10,EC718HM
[2026-05-18 12:59:43.129][000000000.081] bsp_user_init_io 326:io volt 3.3v 21
[2026-05-18 12:59:43.161][000000000.232] I/main LuatOS@Air8000T base 26.04 bsp V2034 32bit
[2026-05-18 12:59:43.165][000000000.232] I/main ROM Build: Apr 28 2026 18:13:36

问题现象

Air8000T 使用硬件 I2C0 读取 VEML3328 时,地址 0x10 能 ACK,写配置也返回成功,但是读任何寄存器都返回 FF FF

同一条 I2C 总线上的 BME280 地址 0x76 可以正常读取,chip_id=0x60

同一个 BME280 + VEML3328 模块,在以下两种对照测试中都能正常读取 VEML3328:

  • Linux 主机通过 CH341 USB-I2C 读取。
  • Air8000T 使用软件 I2C 读取,SCL=GPIO21,SDA=GPIO20。

所以目前看起来,VEML3328 的 7-bit 地址、寄存器地址、大小端、供电、模块硬件都没有问题。问题更像是 Air8000T 硬件 I2C0/BSP 与 VEML3328 读事务之间的兼容性问题。

期望结果

读取 VEML3328 地址 0x10 的 ID 寄存器 0x0C,期望返回:

28 08

这是小端 word 0x0828

读取 BME280 地址 0x76 的 ID 寄存器 0xD0,期望返回:

60

Air8000T 硬件 I2C0 实际结果

硬件 I2C0 可以读取 BME280,但读取 VEML3328 始终是全 1:

W/user.i2c_diag hw-slow-default VEML-ID2 addr=0x10 reg=0x0C sendNoStop=true recv=FF FF transfer=true/FF FF readReg0=FF FF readReg1=FF FF
W/user.i2c_diag hw-slow-default VEML-ID1 addr=0x10 reg=0x0C sendNoStop=true recv=FF transfer=true/FF readReg0=FF readReg1=FF
W/user.i2c_diag hw-slow-default VEML-CONF addr=0x10 reg=0x00 sendNoStop=true recv=FF FF transfer=true/FF FF readReg0=FF FF readReg1=FF FF
W/user.i2c_diag hw-slow-default VEML-WAKE addr=0x10 reg=0x00 write=02 7F ok=true
W/user.i2c_diag hw-slow-default VEML-ID2-afterWake addr=0x10 reg=0x0C sendNoStop=true recv=FF FF transfer=true/FF FF readReg0=FF FF readReg1=FF FF
W/user.i2c_diag hw-slow-default BME280 addr=0x76 reg=0xD0 sendNoStop=true recv=60 transfer=true/60 readReg0=60 readReg1=60

慢速/快速 I2C、default/polling 模式都测试过,现象一致。

补充测试:i2c.xfer() 在当前 Air8000T core 中存在,并且可以启动/完成,但读取 VEML3328 仍然返回 FF FF;同样的 xfer 读取 BME280 返回 60

W/user.xfer_probe api i2c.xfer=function i2c.transfer=function i2c.readReg=function zbuff=userdata zbuff.create=function rtos=V2034
W/user.xfer_probe setup I2C0=1 SCL=I2C0_SCL/PIN80 SDA=I2C0_SDA/PIN81
W/user.xfer_probe VEML-ID xfer addr=0x10 reg=0x0C start=true wait=true devid=0 succ=true err=0 data=FF FF
W/user.xfer_probe VEML-ID transfer addr=0x10 reg=0x0C ok=true result=true data=FF FF
W/user.xfer_probe VEML-ID sendrecv addr=0x10 reg=0x0C send=true/true recv=true data=FF FF
W/user.xfer_probe BME280-ID xfer addr=0x76 reg=0xD0 start=true wait=true devid=0 succ=true err=0 data=60
W/user.xfer_probe BME280-ID transfer addr=0x76 reg=0xD0 ok=true result=true data=60
W/user.xfer_probe BME280-ID sendrecv addr=0x76 reg=0xD0 send=true/true recv=true data=60

对照测试 1:CH341 USB-I2C 可以正常读取两个传感器

同一个传感器模块,接到 Linux 主机 CH341 USB-I2C 后,BME280 和 VEML3328 都可以正常读取:

address_mode=addr<<1
BME280 chip_id=0x60
BME280 raw temp=545792 press=340608 hum=29267 bytes=53 28 00 85 40 00 72 53
BME280 temperature=31.29 C
BME280 pressure=1004.46 hPa
BME280 humidity=57.88 %RH
VEML3328 id=0x0828 raw=28 08 conf=0x7f02 wake=0x7f02
VEML3328 clear=43603 raw=53 aa
VEML3328 red  =0 raw=00 00
VEML3328 green=21759 raw=ff 54
VEML3328 blue =0 raw=00 00
VEML3328 ir   =131 raw=83 00
VEML3328 lux_approx=4177.73

对照测试 2:Air8000T 软件 I2C 可以正常读取两个传感器

使用 Air8000T 软件 I2C,SCL=GPIO21,SDA=GPIO20,同一个模块可以正常读取:

W/user.soft_i2c_test soft-gpio21-20-d20 setup soft I2C SCL=GPIO21 SDA=GPIO20 delay=20us VCC=3V3 GND=GND
W/user.soft_i2c_test soft-gpio21-20-d20 probe addr=0x10 ok=true result=true
W/user.soft_i2c_test soft-gpio21-20-d20 probe addr=0x76 ok=true result=true
W/user.soft_i2c_test soft-gpio21-20-d20 VEML-ID addr=0x10 reg=0x0C sendrecv0=ok/28 08 sendrecv1=ok/FF FF readReg0=ok/28 08 readReg1=ok/FF FF
W/user.soft_i2c_test soft-gpio21-20-d20 VEML-ID-word=0x0828 expected raw=28 08
W/user.soft_i2c_test soft-gpio21-20-d20 VEML-ID-afterWake addr=0x10 reg=0x0C sendrecv0=ok/28 08 sendrecv1=ok/FF FF readReg0=ok/28 08 readReg1=ok/FF FF
W/user.soft_i2c_test soft-gpio21-20-d20 VEML-CLEAR addr=0x10 reg=0x04 sendrecv0=ok/76 00 sendrecv1=ok/FF FF readReg0=ok/76 00 readReg1=ok/FF FF
W/user.soft_i2c_test soft-gpio21-20-d20 VEML clear=118
W/user.soft_i2c_test soft-gpio21-20-d20 VEML-GREEN addr=0x10 reg=0x06 sendrecv0=ok/32 00 sendrecv1=ok/FF FF readReg0=ok/32 00 readReg1=ok/FF FF
W/user.soft_i2c_test soft-gpio21-20-d20 VEML green=50
W/user.soft_i2c_test soft-gpio21-20-d20 VEML-IR addr=0x10 reg=0x08 sendrecv0=ok/17 00 sendrecv1=ok/FF FF readReg0=ok/17 00 readReg1=ok/FF FF
W/user.soft_i2c_test soft-gpio21-20-d20 VEML ir=23
W/user.soft_i2c_test soft-gpio21-20-d20 BME280-ID addr=0x76 reg=0xD0 sendrecv0=ok/60 sendrecv1=ok/60 readReg0=ok/60 readReg1=ok/60

补充说明:VEML3328 在软件 I2C 下,使用 stop=0 / repeated-start 风格读取可以成功;使用 stop=1 会返回 FF FF。BME280 两种方式都可以正常读。

最小复现代码

硬件 I2C0 复现逻辑如下:

local I2C_ID = 0
local VEML_ADDR = 0x10
local VEML_REG_ID = 0x0C
local BME280_ADDR = 0x76
local BME280_REG_ID = 0xD0

i2c.setup(I2C_ID, i2c.SLOW)

-- VEML3328 ID。期望 28 08,硬件 I2C0 实际返回 FF FF。
i2c.send(I2C_ID, VEML_ADDR, VEML_REG_ID, 0)
local veml_id = i2c.recv(I2C_ID, VEML_ADDR, 2)
log.info("test", "VEML ID", veml_id:toHex())

-- BME280 ID。期望/实际都是 60。
i2c.send(I2C_ID, BME280_ADDR, BME280_REG_ID, 0)
local bme_id = i2c.recv(I2C_ID, BME280_ADDR, 1)
log.info("test", "BME280 ID", bme_id:toHex())

本地完整复现脚本:

  • 硬件 I2C0 测试:air8000-firmware/src/main_air8000_devboard_i2c1.lua
  • 软件 I2C 对照测试:air8000-firmware/src/main_air8000_devboard_soft_i2c.lua
  • CH341 Linux 对照测试:tools/ch341par_env_probe.c

初步判断

目前不像 Lua 应用层或 VEML3328 驱动逻辑问题,原因:

  • VEML3328 地址 0x10 正确。
  • VEML3328 ID 寄存器 0x0C 正确。
  • VEML3328 ID 小端解析为 0x0828 正确。
  • 同一个模块用 CH341 USB-I2C 可以正常读。
  • 同一个模块用 Air8000T 软件 I2C 可以正常读。
  • 同一条硬件 I2C0 总线上的 BME280 可以正常读,说明供电、GND、基本连线是有效的。

怀疑点集中在 Air8000T 硬件 I2C0/BSP 对这类从设备读事务的处理:

  • 写 8-bit 寄存器地址后 repeated-start 读是否正确;
  • STOP/no-STOP 行为是否正确;
  • 读阶段 ACK/NACK 时序;
  • VEML3328 对 RX 采样/时序更敏感,硬件 I2C0 是否不兼容;
  • I2C0 pin mux/open-drain/pull-up 相关行为;
  • 硬件 I2C0 返回成功,但实际 SDA 读阶段保持高电平,所以读到 FF FF

希望协助确认

请帮忙确认 Air8000T 的 I2C0 BSP/驱动是否存在与 VEML3328/VEML3328SL 寄存器读取相关的兼容性问题。

重点想确认:

  1. i2c.send(id, addr, reg, 0) + i2c.recv(id, addr, len) 在 Air8000T 硬件 I2C0 上是否会生成 VEML3328 兼容的 repeated-start 事务?
  2. i2c.readReg(id, addr, reg, len, 0) 在 Air8000T 硬件 I2C0 上是否应当与上述行为一致?
  3. 是否有已知的 I2C0 BSP 问题,或者针对必须 repeated-start 读取的从设备有规避方法?
  4. 是否有更新的 Air8000T LuatOS/BSP 版本已经修复类似问题?
  5. i2c.xfer() 已确认可以调用并返回成功,但 VEML3328 仍读到 FF FF,请协助确认底层硬件 I2C0 事务/时序是否仍存在兼容性问题。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions