【问题标题】:Trouble using I2C in CircuitPython (working MicroPython example)在 CircuitPython 中使用 I2C 时遇到问题(工作中的 MicroPython 示例)
【发布时间】:2021-12-16 14:21:11
【问题描述】:

我正在尝试编写一些代码以在 Pi Pico 上运行,以与 SNES Mini 控制器接口并提供正常的游戏手柄输出(HID 设备样式)。

所以我在意识到 MicroPython(在 Pico 上)不能做任何类型的 HID 设备之前完成了以下 MicroPython 代码:

import machine
import time

GAMEPAD_ADDR = 0x52
FREQ_MOD = 3

i2c = machine.I2C(0, scl=machine.Pin(
    17), sda=machine.Pin(16), freq=int(100000 * FREQ_MOD))

i2c.writeto_mem(GAMEPAD_ADDR, 0x40, b'\x00')
time.sleep(0.05)


def reconnect():
    i2c.writeto_mem(GAMEPAD_ADDR, 0x40, b'\x00')
    time.sleep(0.05 / FREQ_MOD)


while True:
    i2c.writeto(GAMEPAD_ADDR, b'\x00')
    time.sleep(0.05 / FREQ_MOD)
    data = i2c.readfrom(GAMEPAD_ADDR, 6)

    if (data[1] == 255):
        reconnect()
    else:
        dataA = 0x17 + (0x17 ^ data[4])
        dataB = 0x17 + (0x17 ^ data[5])

        if not (dataB & ~0b11111110):
            print("UP")
        if not (dataB & ~0b11111101):
            print("LEFT")
        if not (dataA & ~0b10111111):
            print("DOWN")
        if not (dataA & ~0b01111111):
            print("RIGHT")
        if not (dataA & ~0b11011111):
            print("L")
        if not (dataA & ~0b11111101):
            print("R")
        if not (dataB & ~0b11101111):
            print("A")
        if not (dataB & ~0b10111111):
            print("B")
        if not (dataB & ~0b11011111):
            print("Y")
        if not (dataB & ~0b11110111):
            print("X")
        if not (dataA & ~0b11101111):
            print("SELECT")
        if not (dataA & ~0b11111011):
            print("START")

这不是很整洁,但它可以工作,(reconnect 位有点奇怪,不知道为什么它会断开连接并再次需要设置字节),它会打印出正在按下的任何键。

到目前为止,我已经获得了以下 CircuitPython 代码:

import time
import board
import busio
from adafruit_bus_device.i2c_device import I2CDevice

FREQ_MOD = 3

i2c = busio.I2C(board.GP17, board.GP16, frequency=30000)

while not i2c.try_lock():
    pass

time.sleep(0.01)

print([hex(x) for x in i2c.scan()])

time.sleep(0.01)
data = bytearray(6)

i2c.writeto(0x52, bytes([0x40, 0x00]))
time.sleep(0.01)

while True:
    i2c.writeto_then_readfrom(0x52, bytes([0x00]), data, out_start=0)
    print(data)
    time.sleep(1)

i2c.deinit()

但我无法正确进行设置,所以它一直在读取bytearray(b'\xff\xff\xff\xff\xff\xff')

我想我只需要相当于 MicroPython 的 i2c.writeto_mem(0x52, 0x40, b'\x00') 的 CircuitPython,然后我应该没问题。

也可能是writeto_then_readfrom 不等同于在 MicroPython 中所做的。

谢谢

【问题讨论】:

    标签: i2c micropython raspberry-pi-pico adafruit-circuitpython


    【解决方案1】:

    发布后立即解决 - writeto_then_readfrom 不是我想要使用的。

    while True:
        i2c.writeto(0x52, bytes([0x00]))
        time.sleep(0.01)
        i2c.readfrom_into(0x52, data)
        print(data)
        time.sleep(1)
    

    这使 CircuitPython 的行为方式与 MicroPython 相同(但似乎没有随机断开连接,这很好)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-15
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      • 2021-11-04
      • 2023-03-27
      • 2021-12-07
      • 1970-01-01
      相关资源
      最近更新 更多