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
相关产品推荐
相关产品推荐

