使用i2从MCP23017读取引脚

2024-06-06 20:29:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我用的是MCP23017和我的覆盆子皮。。现在我想试着编程。。但我是新来的i2c的东西,所以想知道我正在做的是不是正确。。。我对datasheet中提到的读/写位感到困惑

我已经把A0引脚连接到Vcc,A1,A2引脚连接到地。。所以我想我的地址应该是0x21。。我已经启用了IOCON.镜子位到“1”,以便在端口A或端口B输入更改时都设置INTA/B。。。 现在我想通过读取INTCAP/Gpio引脚来清除可能发生的中断。 那么下面的命令是正确的吗-

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

我觉得这是不对的。。。 有人能就这件事给我提个建议吗。。在

提前谢谢你, 谨致问候, 纳米塔。在


Tags: 端口a2覆盆子地址a1编程i2ca0
1条回答
网友
1楼 · 发布于 2024-06-06 20:29:49

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

相关问题 更多 >