简体   繁体   English

Android Things - I2C2 已在使用中(代码 16)

[英]Android Things - I2C2 is already in use (code 16)

I am trying to connect ADS1015 ADC with my Pico Pro Maker.我正在尝试将 ADS1015 ADC 与我的 Pico Pro Maker 连接。 Unfortunately, I got folowing error:不幸的是,我遇到了以下错误:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.cililing.harvbox.thingsapp, PID: 1855
    java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:448)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 
     Caused by: com.google.android.things.pio.PioException: android.os.ServiceSpecificException: I2C2 is already in use (code 16)
        at com.google.android.things.pio.I2cDeviceImpl.<init>(I2cDeviceImpl.java:43)
        at com.google.android.things.pio.PeripheralManager.openI2cDevice(PeripheralManager.java:246)
        at com.google.android.things.contrib.driver.adc.ads1xxx.Ads1xxx.<init>(Ads1xxx.java:200)
        at com.google.android.things.contrib.driver.adc.ads1xxx.Ads1xxx.<init>(Ads1xxx.java:187)
        at com.cililing.harvbox.thingsapp.thingscontroller.controllers.ADS1015ControllerImpl.<init>(ADS1015Controller.kt:12)
        at com.cililing.harvbox.thingsapp.ui.MainActivity$i2CController$2.invoke(MainActivity.kt:40)
        at com.cililing.harvbox.thingsapp.ui.MainActivity$i2CController$2.invoke(MainActivity.kt:33)
        at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
        at com.cililing.harvbox.thingsapp.ui.MainActivity.getI2CController(Unknown Source:25)
        at com.cililing.harvbox.thingsapp.ui.MainActivity.access$getI2CController$p(MainActivity.kt:33)
        at com.cililing.harvbox.thingsapp.ui.MainActivity$i2cLogger$1.run(MainActivity.kt:47)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 
     Caused by: android.os.ServiceSpecificException: I2C2 is already in use (code 16)
        at android.os.Parcel.readException(Parcel.java:2027)
        at android.os.Parcel.readException(Parcel.java:1959)
        at com.google.android.things.pio.IPeripheralManagerClient$Stub$Proxy.OpenI2cDevice(IPeripheralManagerClient.java:1243)
        at com.google.android.things.pio.I2cDeviceImpl.<init>(I2cDeviceImpl.java:41)
        at com.google.android.things.pio.PeripheralManager.openI2cDevice(PeripheralManager.java:246) 
        at com.google.android.things.contrib.driver.adc.ads1xxx.Ads1xxx.<init>(Ads1xxx.java:200) 
        at com.google.android.things.contrib.driver.adc.ads1xxx.Ads1xxx.<init>(Ads1xxx.java:187) 
        at com.cililing.harvbox.thingsapp.thingscontroller.controllers.ADS1015ControllerImpl.<init>(ADS1015Controller.kt:12) 
        at com.cililing.harvbox.thingsapp.ui.MainActivity$i2CController$2.invoke(MainActivity.kt:40) 
        at com.cililing.harvbox.thingsapp.ui.MainActivity$i2CController$2.invoke(MainActivity.kt:33) 
        at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74) 
        at com.cililing.harvbox.thingsapp.ui.MainActivity.getI2CController(Unknown Source:25) 
        at com.cililing.harvbox.thingsapp.ui.MainActivity.access$getI2CController$p(MainActivity.kt:33) 
        at com.cililing.harvbox.thingsapp.ui.MainActivity$i2cLogger$1.run(MainActivity.kt:47) 
        at android.os.Handler.handleCallback(Handler.java:790) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6494) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 

I am using following driver: https://github.com/androidthings/contrib-drivers/tree/master/adc我正在使用以下驱动程序: https : //github.com/androidthings/contrib-drivers/tree/master/adc

What I've already done:我已经做了什么:

  • uninstall all apps卸载所有应用
  • reinstall whole AndroidThings重新安装整个 AndroidThings
  • I tired both, I2C1 and I2C2我累了,I2C1 和 I2C2
  • try to read value on new app (only example from library).尝试读取新应用程序的值(仅来自库的示例)。

I have no idea what can I do more.我不知道我还能做些什么。 I am pretty sure that device is connected properly (scl-scl, sda-sda, addr-gnd, a0-other_analog_output) to main board and error is actually kind of strange, as I am sure that none other app uses those pins.我很确定设备已正确连接(scl-scl、sda-sda、addr-gnd、a0-other_analog_output)到主板,错误实际上有点奇怪,因为我确信没有其他应用程序使用这些引脚。

code responsible for connecting with peripheral:负责连接外设的代码:

class ADS1015ControllerImpl(val i2cName: String,
                            val range: Int) : ADS1015Controller {

    private val instance: Ads1xxx = Ads1xxx(i2cName, Ads1xxx.Configuration.ADS1015)
    init {
        instance.inputRange = range
    }

    override fun read(channel: Int, logger: (Int) -> Unit) {
        logger.invoke(
                instance.readSingleEndedInput(channel)
        )
    }

    override fun release() {
        instance.close()
    }
}

The error message I2C2 is already in use (code 16) means you are trying to open more than one connection to the same I2C bus without closing the previous instance. 错误消息I2C2 is already in use (code 16)意味着您尝试打开一个至同一I2C总线的多个连接,而没有关闭前一个实例。 The code to open the I2C connection lives within the Ads1xxx constructor. 打开I2C连接的代码位于Ads1xxx构造函数中。 You must either manage a single instance of this class in your code, or be certain that you call close() on the current Ads1xxx before initializing another one. 您必须在代码中管理该类的单个实例,或者确定在初始化另一个Ads1xxx之前对当前Ads1xxx调用close()

Based on the stack trace, it also looks like this device is being initialized by a lazy load when the value it first accessed, so it's possible that this constructor is not getting invoked at the point you expected, causing things to come out of order. 基于堆栈跟踪,它看上去也像是在第一次访问它的值时由延迟加载初始化了该设备,因此有可能在您期望的时间点未调用此构造函数,从而导致事务混乱。

In fact, the problem was a badly soldered plug.事实上,问题是插头焊接不良。 :) :)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM