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,期望返回:
这是小端 word 0x0828。
读取 BME280 地址 0x76 的 ID 寄存器 0xD0,期望返回:
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 寄存器读取相关的兼容性问题。
重点想确认:
i2c.send(id, addr, reg, 0) + i2c.recv(id, addr, len) 在 Air8000T 硬件 I2C0 上是否会生成 VEML3328 兼容的 repeated-start 事务?
i2c.readReg(id, addr, reg, len, 0) 在 Air8000T 硬件 I2C0 上是否应当与上述行为一致?
- 是否有已知的 I2C0 BSP 问题,或者针对必须 repeated-start 读取的从设备有规避方法?
- 是否有更新的 Air8000T LuatOS/BSP 版本已经修复类似问题?
i2c.xfer() 已确认可以调用并返回成功,但 VEML3328 仍读到 FF FF,请协助确认底层硬件 I2C0 事务/时序是否仍存在兼容性问题。
OpenLuat Issue 草稿:Air8000T 硬件 I2C0 读取 VEML3328 始终返回 FF FF
标题
Air8000T 硬件 I2C0 读取 VEML3328 寄存器始终返回 FF FF,但同总线 BME280 正常
环境
启动日志:
问题现象
Air8000T 使用硬件 I2C0 读取 VEML3328 时,地址
0x10能 ACK,写配置也返回成功,但是读任何寄存器都返回FF FF。同一条 I2C 总线上的 BME280 地址
0x76可以正常读取,chip_id=0x60。同一个 BME280 + VEML3328 模块,在以下两种对照测试中都能正常读取 VEML3328:
所以目前看起来,VEML3328 的 7-bit 地址、寄存器地址、大小端、供电、模块硬件都没有问题。问题更像是 Air8000T 硬件 I2C0/BSP 与 VEML3328 读事务之间的兼容性问题。
期望结果
读取 VEML3328 地址
0x10的 ID 寄存器0x0C,期望返回:这是小端 word
0x0828。读取 BME280 地址
0x76的 ID 寄存器0xD0,期望返回:Air8000T 硬件 I2C0 实际结果
硬件 I2C0 可以读取 BME280,但读取 VEML3328 始终是全 1:
慢速/快速 I2C、default/polling 模式都测试过,现象一致。
补充测试:
i2c.xfer()在当前 Air8000T core 中存在,并且可以启动/完成,但读取 VEML3328 仍然返回FF FF;同样的xfer读取 BME280 返回60:对照测试 1:CH341 USB-I2C 可以正常读取两个传感器
同一个传感器模块,接到 Linux 主机 CH341 USB-I2C 后,BME280 和 VEML3328 都可以正常读取:
对照测试 2:Air8000T 软件 I2C 可以正常读取两个传感器
使用 Air8000T 软件 I2C,SCL=GPIO21,SDA=GPIO20,同一个模块可以正常读取:
补充说明:VEML3328 在软件 I2C 下,使用
stop=0/ repeated-start 风格读取可以成功;使用stop=1会返回FF FF。BME280 两种方式都可以正常读。最小复现代码
硬件 I2C0 复现逻辑如下:
本地完整复现脚本:
air8000-firmware/src/main_air8000_devboard_i2c1.luaair8000-firmware/src/main_air8000_devboard_soft_i2c.luatools/ch341par_env_probe.c初步判断
目前不像 Lua 应用层或 VEML3328 驱动逻辑问题,原因:
0x10正确。0x0C正确。0x0828正确。怀疑点集中在 Air8000T 硬件 I2C0/BSP 对这类从设备读事务的处理:
FF FF。希望协助确认
请帮忙确认 Air8000T 的 I2C0 BSP/驱动是否存在与 VEML3328/VEML3328SL 寄存器读取相关的兼容性问题。
重点想确认:
i2c.send(id, addr, reg, 0) + i2c.recv(id, addr, len)在 Air8000T 硬件 I2C0 上是否会生成 VEML3328 兼容的 repeated-start 事务?i2c.readReg(id, addr, reg, len, 0)在 Air8000T 硬件 I2C0 上是否应当与上述行为一致?i2c.xfer()已确认可以调用并返回成功,但 VEML3328 仍读到FF FF,请协助确认底层硬件 I2C0 事务/时序是否仍存在兼容性问题。