我无法在Raspberry Pi 3上的Android Things中通过I2C总线获取数据。
我在RPi和DS18B20(温度传感器)上连接了Android Things。连接到RPi
并运行I2C地址扫描应用程序(https://github.com/dennisg/i2c-address-scanner),但找不到可用地址。
for (int address = 0; address < 256; address++) {
//auto-close the devices
try (final I2cDevice device = peripheralManagerService.openI2cDevice(BoardDefaults.getI2cBus(), address)) {
try {
device.readRegByte(TEST_REGISTER);
Log.i(TAG, String.format(Locale.US, "Trying: 0x%02X - SUCCESS", address));
} catch (final IOException e) {
Log.i(TAG, String.format(Locale.US, "Trying: 0x%02X - FAIL", address));
}
} catch (final IOException e) {
//in case the openI2cDevice(name, address) fails
}
}
如何通过I2C获取数据?
链接的测试项目似乎在几个方面使用I2C协议不力。
首先,它假设在特定的板上只有一条I2C总线。尽管现在是这样,但未来可能不会扩展到支持Android Things的额外SOM。
其次,它假定要从(0x00
)读取的寄存器地址。这可能适用于开发人员刚开始使用的任何设备,但大量I2C外围设备可能无法响应该地址。
您应该查看此设备的数据表。粗略检查后,似乎没有对应于0x00
的寄存器。此外,它有一个自定义的读取流,这将使使用上面的代码片段变得困难。在传感器上获取这些值的微控制器可能会将它们丢弃,并且不会返回任何信号。
重新阅读数据表可能会很有用。看起来传感器是"一根线",而不是I2C。虽然这两种协议可能相似,但使用内置readByte
方法可能会在数据传输中做出一些可能与外围协议不完全匹配的假设。
正如Nick Felker在他的回答中所写的那样,DS18B20有单线接口,你不能直接用Android Things将其连接到Raspberry Pi。您应该使用工业(例如DS2482-100)或基于自定义MCU的(如该项目中)1-Wire<->I2C转换器或其他(例如USB<->1-Wire、UART<-->1-Wire)转换器。