使用i2c从MCP23017读取引脚

时间:2015-04-08 08:36:49

标签: python i2c

我正在使用我的覆盆子pi的MCP23017 ..现在我想尝试编程..但我是新的i2c的东西所以想知道我在做什么是对的...我很困惑关于datasheet

中提到的读/写位

我已将A0引脚连接到Vcc,A1,A2引脚连接到地..所以我猜我的地址是0x21 ..我已经启用了IOCON.MIRROR位到' 1'这样,如果端口A或端口B输入发生变化,则设置INTA / B ... 现在我想通过读取INTCAP / Gpio引脚来清除可能发生的中断。 以下命令是正确的 -

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

我觉得这不对...... 有人可以就此提出建议..

提前谢谢你, 亲切的问候, Namita。

1 个答案:

答案 0 :(得分:0)

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