Я не могу получить данные по шине I2C в Android Things

Я не могу получить данные по шине I2C в Android Things на Raspberry Pi 3.

Я подключаю Android Things на RPi и DS18B20(датчик температуры). Подключиться к 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?

2 ответа

Решение

Как писал Nick Felker в своем ответе, DS18B20 имеет интерфейс 1-Wire, и вы не можете напрямую подключить его к Raspberry Pi с Android Things. Вы должны использовать промышленный (например, DS2482-100) или нестандартный на базе MCU (как в этом проекте) 1-Wire <-> I2C-преобразователь или другой (например, USB <-> 1-Wire, UART<-> 1-Wire) преобразователи.

Похоже, что связанный тестовый проект плохо использует протокол I2C несколькими способами.

Во-первых, предполагается, что на конкретной плате имеется только одна шина I2C. Хотя сейчас это действительно так, в будущем это может не распространиться на дополнительные SOM, которые поддерживают Android-вещи.

Во-вторых, предполагается, что адрес регистра для чтения (0x00). Это могло бы работать для любого устройства, с которого разработчик начал, но большое количество периферийных устройств I2C может не отвечать на этот адрес.

Вы должны взглянуть на таблицу данных для этого устройства. После беглого осмотра кажется, что не существует регистра, соответствующего 0x00, Кроме того, он имеет пользовательский поток чтения, который затруднит использование приведенного выше фрагмента. Микроконтроллер, получающий эти значения на ваш датчик, вероятно, выбрасывает их и не возвращает сигнал.

Может быть полезно прочитать таблицу еще раз. Похоже, датчик "однопроводный" вместо I2C. Хотя эти два протокола могут быть похожими, с использованием встроенного readByte Метод может сделать некоторые предположения при передаче данных, которые могут не полностью соответствовать периферийному протоколу.

Другие вопросы по тегам