I2C协议下读取错误ADC通道的异常现象及正常行为咨询
问题背景
我通过I2C协议读取接入ADC通道1的光传感器数据,使用的代码为:
data = i2cbus.read_i2c_block_data(address, register, 2)
原本预期的三种结果:
- 通道存在且被使用:得到连贯有效数值
- 通道存在但未被使用:因静电噪声得到较低数值
- 通道不存在:触发错误
实际测试结果(ADC共4个通道,仅通道1在使用):
- 通道1和2:数据为
[0, 18] - 通道3:数据为
[0, 19] - 通道4及更高编号通道:数据为
[111, 21]
异常现象原因分析
ADC通道配置未生效
多数I2C ADC需要先写入通道选择寄存器,指定要读取的通道后再执行读取操作。如果跳过这一步直接调用read_i2c_block_data,读取的可能是ADC默认通道的缓存数据,而非目标通道的实时转换结果,这就会导致所有通道返回数值高度一致。未使用通道的浮空干扰
未使用的ADC通道(2、3)若处于浮空状态,不会只产生低数值噪声。PCB布线的信号耦合、环境电磁干扰会让通道读取到带有固定偏移的不稳定数值,[0,18]和[0,19]这类接近的数值,大概率是浮空通道耦合到了通道1的信号或电源噪声。无效通道的默认返回机制
对于不存在的通道(4及更高),并非所有ADC都会触发I2C错误。部分芯片会返回寄存器默认值、上次转换的残留数据,或者固定的错误标识值,[111,21]就属于这类芯片对无效请求的标准返回结果。数据字节解析逻辑错误
读取的2字节数据需要确认是高8位+低8位的组合格式,还是包含状态位的混合格式。如果错误地将状态位当成数据位解析,也会出现看似异常的固定数值。
正常行为的判定标准
已使用通道(通道1)
应读取到随光照强度变化的连贯数值:光照增强时数值上升,光照减弱时数值下降,且数值波动在合理范围内(无跳变)。未使用但存在的通道(2、3)
- 浮空状态:读取到随机波动的噪声数值
- 接地状态:读取到接近0的稳定数值
- 接参考电压:读取到接近满量程的稳定数值
不存在的通道
不同芯片行为不同:部分会返回I2C NACK错误,部分会返回固定错误码,还有部分会返回最后一次有效转换的数据,具体需查阅对应ADC的数据手册确认。
内容的提问来源于stack exchange,提问作者Eliot Janvier

