MCP3424 ADC 问题:不保存配置字节/不按照数据表读取 设置重置写入配置字节从设备读取数据我也试过

问题描述

我在使用 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 解决了问题,并且设备按预期运行。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...