You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Raspberry Pi Pico与KX134加速度计通信异常:可Ping通但程序无法识别

解决Raspberry Pi Pico与KX134加速度计I2C通信:Ping通但库无法识别连接的问题

问题根源

你遇到的核心问题有两个:

  • 手动初始化了指定SDA/SCL的I2C总线,但创建KX13X设备对象时未传入该总线实例,库默认使用系统默认I2C总线,导致总线不匹配
  • Qwiic_KX13X库的connected属性并非仅检查I2C地址可达,而是会验证设备的WHO_AM_I寄存器返回值是否匹配库预设的设备型号(KX132与KX134的WHO_AM_I值不同)

修复步骤及代码修改

1. 传递自定义I2C总线给设备对象

创建QwiicKX13XCore实例时,必须将你初始化的my_bus作为参数传入,否则库会使用默认总线,和你ping的不是同一个总线。

2. 验证并匹配WHO_AM_I寄存器值

KX134的WHO_AM_I寄存器(地址0x0F)默认返回0x38,而库默认可能优先检查KX132的0x39。可先手动读取该寄存器确认,再在初始化时指定设备类型。

修改后的完整代码

import qwiic_i2c
import qwiic_kx13x
import time
import sys

# 初始化指定SDA/SCL的I2C总线
my_bus = qwiic_i2c.get_i2c_driver(sda=4, scl=5, freq=100000)

# 确认设备可达并读取WHO_AM_I寄存器
ping_result = my_bus.ping(0x1F)
print("Device is connected via I2C:", ping_result)

# 读取WHO_AM_I寄存器验证设备型号(KX134应为0x38)
try:
    who_am_i = my_bus.read_byte(0x1F, 0x0F)
    print(f"WHO_AM_I register value: 0x{who_am_i:02X}")
except Exception as e:
    print(f"Failed to read WHO_AM_I: {e}", file=sys.stderr)

def runExample():
    print("\nSparkFun KX13X Accelerometer Example 1\n")

    # 初始化KX134:传入自定义总线+指定地址
    myKx = qwiic_kx13x.QwiicKX13XCore(address=0x1F, bus=my_bus)
    
    # 手动验证连接(替代库的connected属性,避免型号检测问题)
    try:
        who_am_i = myKx.read_byte(myKx.KX13X_WHO_AM_I)
        if who_am_i == myKx.KX134_WHOAMI:
            print("KX134 device detected successfully")
        else:
            print(f"Unexpected WHO_AM_I value: 0x{who_am_i:02X}, expecting 0x{myKx.KX134_WHOAMI:02X}", file=sys.stderr)
            return
    except Exception as e:
        print("Failed to communicate with device: ", e, file=sys.stderr)
        return

    # 初始化设备,明确指定KX134型号
    if myKx.begin(myKx.KX134):
        print("Device initialized successfully.")
    else:
        print("Failed to initialize device", file=sys.stderr)
        return

    # 配置基础设置
    myKx.initialize(myKx.BASIC_SETTINGS)

    while True:
        # 获取加速度数据
        if myKx.get_accel_data():
            print(f"X: {myKx.kx134_accel.x:.2f}g Y: {myKx.kx134_accel.y:.2f}g Z: {myKx.kx134_accel.z:.2f}g")
        else:
            print("Failed to read accel data", file=sys.stderr)
        
        time.sleep(0.02)

if __name__ == '__main__':
    try:
        runExample()
    except (KeyboardInterrupt, SystemExit):
        print("\nEnding Example 1")
        sys.exit(0)

关键改动说明

  • 创建QwiicKX13XCore时添加bus=my_bus参数,确保使用你指定SDA/SCL的总线
  • 替换库自带的connected检查,改为手动读取WHO_AM_I寄存器并匹配KX134的预设值(0x38)
  • 调用begin()时明确传入myKx.KX134参数,指定设备型号,避免库自动检测错误

内容的提问来源于stack exchange,提问作者llcoder1001

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 07:57:34