问题描述
我在使用 MCP3424 ADC 时遇到了一些困难。 (datasheet)
设置
设备通过 I2C (100kB/s) 连接,地址为“1101000”(A1 和 A2 连接到 GND)。
我可以根据第 21 页的时序图与设备通信并写入配置字节。
重置
根据第 25 页,建议通过通用地址调用重置设备一次。
这看起来像是在工作,因为设备确实发送了 ACK 位(第 9 位保持低电平):
图片: Oscilloscope - General call RESET
写入配置字节
等待>300us(再次上电)后,我写了同样被确认的配置字节:
默认配置寄存器字节(第 18 页):
RDY | C1 | C0 | O/C | S1 | S0 | G1 | G0 |
---|---|---|---|---|---|---|---|
0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
- RDY 位不相关(参见转换模式)
- 选择了频道 0
- 转换模式是连续的(-> 设置 RDY 位无效)
- 分辨率为 12 位
- 增益 = 1
现在我想从通道 2 读取一个测试,所以配置字节是:01010000
图片: Datasheet diagram vs Oscilloscope - Write config byte
从设备读取数据
根据第 24 页的时序图,当使用 12 到 16 位分辨率时,必须读取至少 3 个字节。第一个和第二个字节(地址字节之后)是实际值,第三个字节是配置寄存器,只要提供时钟并且主机不发送 NAK 就重复:
问题
当我读取 4 个字节时:
- 我没有得到有效的原始电压值(CH3 上的 VDD)
- 设备将默认配置字节作为第三个字节发送。
- 设备不会在第四个字节上重复配置字节。
图片: Datasheet diagram vs Oscilloscope - Read 4 bytes
我也试过
- 我确实尝试了另一个 MCP3424 IC,以排除它出现故障的可能性。
- 我查看了一些 Python 库,发现有人在使用 smbus_i2c_read_block_data 方法。 (显然是因为没有方法可以在不首先发送命令(或寄存器)字节的情况下读取 n 字节)。
我也尝试使用“i2c-utils.h”中的
i2c_smbus_read_i2c_block_data()
方法 使用 0x00 作为命令代码(也是 treid 配置字节)。
但这只会给出空响应(仍然设备发送 ACK 位。):
图片: Oscilloscope - i2c_read_block_data
非常感谢您的帮助! 干杯,罗马
解决方法
解决方案
I2C 地址 1101000 被内核配置阻止。
当使用 i2c-detect 进行探测时,它显示为 UU
。 (可能是为 RTC 保留的?)
将地址更改为 1101011 解决了问题,并且设备按预期运行。