使用 Python 从 MCP23017 获取信息
Getting the info from MCP23017 with Python
我为我的 Raspberry Pi 买了一个 MCP23017 来增加 GPIO 引脚。
我目前已经安装了它,我正在尝试获取我拥有的额外引脚;左边是GPB0-GPB7,右边是GPA0-GPA7,听我的吩咐。
我需要将它们设置为输入引脚以读取 HIGH 和 LOW 状态,并向它们添加上拉电阻,但据我所知:
import smbus
import time
bus = smbus.SMBus(1) # As I'm using an newer RPi.
DEVICE = 0x20 # this is what it shows when I check it.
IODIRA = 0x00
GPIOA = 0x12
bus.write_byte_data(DEVICE,IODIRA,0xFF)
bus.write_byte_data(DEVICE,0x0C,0xff)
value = bus.read_byte_data(DEVICE,GPIOA)
当我尝试读取该值时,它给了我奇怪的数字,而且我几乎找不到任何关于十六进制数和二进制数的解释,这让我很失望。数据表对我来说似乎是中文..
非常感谢任何帮助!
此脚本将打开 GPIOA 和 GPIOB 的内部上拉电阻。然后它将每秒打印一次所有寄存器的值。当您更改输入时,您可以使用输出来观察寄存器值的变化。
import smbus
import time
DEVICE = 0x20
address_map = {
0x00: 'IODIRA', 0x01: 'IODIRB', 0x02: 'IPOLA', 0x03: 'IPOLB',
0x04: 'GPINTENA', 0x05: 'GPINTENB', 0x06: 'DEFVALA', 0x07: 'DEVFALB',
0x08: 'INTCONA', 0x09: 'INTCONB', 0x0a: 'IOCON', 0x0b: 'IOCON',
0x0c: 'GPPUA', 0x0d: 'GPPUB', 0x0e: 'INTFA', 0x0f: 'INTFB',
0x10: 'INTCAPA', 0x11: 'INTCAPB', 0x12: 'GPIOA', 0x13: 'GPIOB',
0x14: 'OLATA', 0x15: 'OLATB'
}
register_map = {value: key for key, value in address_map.iteritems()}
max_len = max(len(key) for key in register_map)
def print_values(bus):
print "-" * 20
for addr in address_map:
value = bus.read_byte_data(DEVICE, addr)
print "%-*s = 0x%02X" % (max_len, address_map[addr], value)
bus = smbus.SMBus(1)
bus.write_byte_data(DEVICE, register_map['GPPUA'], 0xFF)
bus.write_byte_data(DEVICE, register_map['GPPUB'], 0xFF)
counter = 0
try:
while True:
print_values(bus)
counter += 1
print "counter = %s" % counter
time.sleep(1.0)
except KeyboardInterrupt:
print "Keyboard interrupt"
示例输出
--------------------
IODIRA = 0xFF
IODIRB = 0xFF
IPOLA = 0x00
IPOLB = 0x00
GPINTENA = 0x00
GPINTENB = 0x00
DEFVALA = 0x00
DEVFALB = 0x00
INTCONA = 0x00
INTCONB = 0x00
IOCON = 0x00
IOCON = 0x00
GPPUA = 0xFF
GPPUB = 0xFF
INTFA = 0x00
INTFB = 0x00
INTCAPA = 0x00
INTCAPB = 0x00
GPIOA = 0xFF
GPIOB = 0xE9
OLATA = 0x00
OLATB = 0x00
counter = 3
我在 Adafruit LCD Keypad Kit 上使用 MCP23017,所以一些引脚被电路板拉低了。
了解端口值
每个端口有8个GPIO引脚。如果一个端口的所有引脚都被拉高,则该端口的十六进制值将为 0xFF。如果某个引脚被拉低,则该引脚的位将为零。例如,如果 GPA0 被拉低,GPIOA 寄存器的值为 0xFE:
1111 1110 = 0xFE
我为我的 Raspberry Pi 买了一个 MCP23017 来增加 GPIO 引脚。
我目前已经安装了它,我正在尝试获取我拥有的额外引脚;左边是GPB0-GPB7,右边是GPA0-GPA7,听我的吩咐。
我需要将它们设置为输入引脚以读取 HIGH 和 LOW 状态,并向它们添加上拉电阻,但据我所知:
import smbus
import time
bus = smbus.SMBus(1) # As I'm using an newer RPi.
DEVICE = 0x20 # this is what it shows when I check it.
IODIRA = 0x00
GPIOA = 0x12
bus.write_byte_data(DEVICE,IODIRA,0xFF)
bus.write_byte_data(DEVICE,0x0C,0xff)
value = bus.read_byte_data(DEVICE,GPIOA)
当我尝试读取该值时,它给了我奇怪的数字,而且我几乎找不到任何关于十六进制数和二进制数的解释,这让我很失望。数据表对我来说似乎是中文..
非常感谢任何帮助!
此脚本将打开 GPIOA 和 GPIOB 的内部上拉电阻。然后它将每秒打印一次所有寄存器的值。当您更改输入时,您可以使用输出来观察寄存器值的变化。
import smbus
import time
DEVICE = 0x20
address_map = {
0x00: 'IODIRA', 0x01: 'IODIRB', 0x02: 'IPOLA', 0x03: 'IPOLB',
0x04: 'GPINTENA', 0x05: 'GPINTENB', 0x06: 'DEFVALA', 0x07: 'DEVFALB',
0x08: 'INTCONA', 0x09: 'INTCONB', 0x0a: 'IOCON', 0x0b: 'IOCON',
0x0c: 'GPPUA', 0x0d: 'GPPUB', 0x0e: 'INTFA', 0x0f: 'INTFB',
0x10: 'INTCAPA', 0x11: 'INTCAPB', 0x12: 'GPIOA', 0x13: 'GPIOB',
0x14: 'OLATA', 0x15: 'OLATB'
}
register_map = {value: key for key, value in address_map.iteritems()}
max_len = max(len(key) for key in register_map)
def print_values(bus):
print "-" * 20
for addr in address_map:
value = bus.read_byte_data(DEVICE, addr)
print "%-*s = 0x%02X" % (max_len, address_map[addr], value)
bus = smbus.SMBus(1)
bus.write_byte_data(DEVICE, register_map['GPPUA'], 0xFF)
bus.write_byte_data(DEVICE, register_map['GPPUB'], 0xFF)
counter = 0
try:
while True:
print_values(bus)
counter += 1
print "counter = %s" % counter
time.sleep(1.0)
except KeyboardInterrupt:
print "Keyboard interrupt"
示例输出
--------------------
IODIRA = 0xFF
IODIRB = 0xFF
IPOLA = 0x00
IPOLB = 0x00
GPINTENA = 0x00
GPINTENB = 0x00
DEFVALA = 0x00
DEVFALB = 0x00
INTCONA = 0x00
INTCONB = 0x00
IOCON = 0x00
IOCON = 0x00
GPPUA = 0xFF
GPPUB = 0xFF
INTFA = 0x00
INTFB = 0x00
INTCAPA = 0x00
INTCAPB = 0x00
GPIOA = 0xFF
GPIOB = 0xE9
OLATA = 0x00
OLATB = 0x00
counter = 3
我在 Adafruit LCD Keypad Kit 上使用 MCP23017,所以一些引脚被电路板拉低了。
了解端口值
每个端口有8个GPIO引脚。如果一个端口的所有引脚都被拉高,则该端口的十六进制值将为 0xFF。如果某个引脚被拉低,则该引脚的位将为零。例如,如果 GPA0 被拉低,GPIOA 寄存器的值为 0xFE:
1111 1110 = 0xFE