使用 i2c 从 MCP23017 读取引脚

Reading pins from MCP23017 using i2c

我正在将 MCP23017 与我的 raspberry pi 一起使用。现在我想尝试对其进行编程。但是我是 i2c 方面的新手,所以想知道我所做的是否正确。 .. 我对 datasheet

中提到的 read/write 位感到困惑

我已将我的 A0 引脚连接到 Vcc,将 A1、A2 引脚连接到地。所以我猜我的地址将是 0x21。我已将 IOCON.MIRROR 位启用为“1”,以便 INTA/B 如果端口 A 或端口 B 输入改变... 现在我想清除可能通过读取 INTCAP/Gpio 引脚发生的中断。 以下命令是否正确执行此操作 -

subprocess.call('i2cget', '-y', '0', '0x21', '0x12')

我感觉不对... 有人可以就此给我建议吗..

提前谢谢你, 亲切的问候, 纳米塔.

根据你对A0、A1、A2申请的等级,设备地址确实是0x21。让我解释... read/write 位只是 8 位中的最后一位,它构成了某个设备的完整地址字节。对于 MCP 设备,您始终必须提供地址的前 7 位并查看数据表,您会看到地址可以是 0x20(十六进制:0010.0000)和 0x27(十六进制:0010.0111)之间的任何值。接下来,需要一个额外的位来指定方向:读 (1) 或写 (0)。 此额外位由命令 i2cget(= 读取,因此将添加 1)或命令 i2cset(= 写入,因此将添加 0)隐式添加。 所以,最后,初始地址为 0x20 的 MCP23017 的完整 i2c 地址在写入时将为 0x0100.0000(初始地址向左移动一位位置,写入位为 0,将添加到右边)并且当你从它读取时将是 0x0100.0001(与写入相同的原理)。 也就是说,您的下一个问题是:设备重置后,所有引脚都设置为输入,因此如果您想从设备的引脚读取内容,这很好。接下来,复位后,bank 位也为 0,这意味着操作端口 A 和端口 B 的寄存器彼此相邻。在您的情况下也可以。最后,您正在读取寄存器 0x​​12,即 GPIOA。还可以。唯一可以阻止你读出某些东西的是 I2C 总线号,因为你没有指定你正在使用哪个 Raspberry Pi 。较旧的 RPi 使用总线 0,较新的 RPi 使用总线 1。 您必须检查的其他事项:您是否正确设置了导致生成中断的寄存器?如果是这样,只要输入引脚发生变化,INTA/B 引脚就会断言,直到您读取引脚的内容或其对应的 INT 寄存器内容。对于其余部分,我没有发现您的命令设置有任何问题(不是 python 部分,而是组成的字符串)。 您是否直接在命令行上尝试了 bare i2cget 命令以查看它是否正常工作?您可以做的另一个测试...