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