python - 使用Python从MCP23017获取信息

标签 python raspberry-pi gpio i2c

我为我的 Raspberry Pi 购买了 MCP23017 以增加 GPIO 引脚。

enter image description here

我目前已经安装了它,并且正在尝试获取我拥有的额外引脚;左边是 GPB0-GPB7,右边是 GPA0-GPA7 执行我的命令。

我需要将它们设置为输入引脚以读取高电平和低电平状态,并向它们添加上拉电阻,但据我所知:

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

关于python - 使用Python从MCP23017获取信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41266273/

相关文章:

python - Python 中的 Windows 路径

css - Raspberry- 重新格式化显示

android - 什么是 Android Things Raspberry Pi GPIO 最大频率?

python - 导入错误 : : Symbol not found: __PyErr_ReplaceException

python - 如何获取两个数据框列之间的交集项?

python - 无法访问主目录中的文件(Jupyter Notebook)

go - 使用 url 包更新 ThingSpeak 上的 channel

c++ - 线程会影响 Raspberry Pi 上的图像处理性能吗?

python - 使用 Python 通过 GPIO 对 Raspberry Pi 进行 LED 控制

python - RPi 在启动时运行 GPIO 脚本