0

我在使用 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)
  • 设备将默认配置字节作为第三个字节发送。
  • 设备不会在第四个字节上重复配置字节。

图片: 数据表图表与示波器 - 读取 4 个字节


我也尝试过

  • 我确实尝试了另一个 MCP3424 IC 以排除它出现故障的可能性。
  • 我查看了一些 Python 库,发现人们正在使用 smbus_i2c_read_block_data 方法。(显然是因为没有方法可以在不先发送命令(或寄存器)字节的情况下仅读取 n 字节)。我也尝试过使用i2c_smbus_read_i2c_block_data()“i2c-utils.h”中的方法,使用 0x00 作为命令代码(也是 treid 配置字节)。
    但这只会给出空响应(仍然设备发送 ACK 位。):

图片: 示波器 - i2c_read_block_data

非常感激你的帮助!干杯,罗马

4

1 回答 1

0

解决方案

I2C 地址 1101000 被内核配置阻止。它显示为UU带有 i2c-detect 的 probin 时。(可能是为 RTC 保留的?)

将地址更改为 1101011 解决了问题,并且设备按预期运行。

于 2021-07-02T17:27:31.950 回答