Nano Hash - криптовалюты, майнинг, программирование

TCA9548a (мультиплексор I2C) интеграция C++

У меня есть 4 лазерных датчика расстояния VL680 для использования с Raspberry. Это датчик, совместимый с шиной I2C, но мы не можем изменить адрес. Итак, я использую мультиплексор I2C платы Adafruit TCA9548a. Я могу запустить только один VL680 непосредственно на моей шине I2C, но он не будет работать через мультиплексор. Таблица данных не ясна, и я нахожу только код для Arduino или плохой пример Python.

А вот и я :

char filename[20];
const int adapter_nr = 1;
snprintf(filename, 19, "/dev/i2c-%d", adapter_nr);
file = open(filename, O_RDWR);
if (file < 0) 
{
    printf("Unable to connect reach I2C bus \n");
    exit(EXIT_FAILURE);
}

// multiplex address
const int addr = 0x70;

if(ioctl(file, I2C_SLAVE, addr) < 0) 
{
    printf("Fail to reach multiplex laser \n");
    exit(EXIT_FAILURE);
}

char buf[10];
buf[0] = 0x01; // to select channel 0
write(file, buf, 1);
I2C_init();

doTheSameAsOneOnlyVL680();
...

Я не знаю, как мне поступить, и ничего не помогает. Это способ выбора канала? Как тогда писать и читать?

void I2C_init()
{   
    const int addr = 0x29;

    if(ioctl(file, I2C_SLAVE, addr) < 0) 
    {
        printf("Fail to reach laser \n");
        exit(EXIT_FAILURE);
    }

    if(read_byte(file, 0x000) != 0xB4)
    {
        printf("Problem with VL6180X\n");
        //exit(EXIT_FAILURE);
    }

    int setup = read_byte(file, 0x016);

    if(setup == 1)
    {
        printf("Init all registers \n");
        write_byte(file, 0x0207, 0x01);
                ...

    }
    else
    {
        printf("Fail \n");
    }

    set_scaling(file, 1);
}

  • Совершенно не связан с вашей проблемой, но размер, который вы передаете функции snprintf, равен включая терминатор. Поэтому вы можете пройти, например. sizeof filename вместо использования магического числа. Кроме того, если вы программируете на C++, почему бы вам не использовать std::string? 18.04.2019

Ответы:


1

Когда ioctl(file, I2C_SLAVE, addr) запускается, вы говорите "По I2C обратитесь к мультиплексору".

Затем, с

buf[0] = 0x01; // to select channel 0 write(file, buf, 10);

вы заставляете мультиплексор подключать VL680, который подключен к первому порту мультиплексора, к шине I2C.

После того, как вы поговорили с мультиплексором с

write(file, buf, 10);

и прежде чем говорить с датчиком расстояния с

doTheSameAsOneOnlyVL680();

вам нужно запустить некоторый код, чтобы сказать "На I2C поговорите с датчиком расстояния".

Что-то вроде:

if(ioctl(file, I2C_SLAVE, vl680Addr) < 0) 
{
    printf("Fail to reach distance sensor \n");
    exit(EXIT_FAILURE);
}

, где vl680Addr — адрес (его необходимо указать) лазерного датчика расстояния VL680,

18.04.2019
  • Спасибо за Ваш ответ. Я думаю, что мы в правильном направлении. Я могу подключиться к датчикам, потому что ioctl не показывает ошибок. Но я не могу читать/писать в сенсорные регистры. Вот код инициализации каждого датчика (первый шаг doTheSameAsOneOnlyVL680). Я отредактировал свой вопрос. 18.04.2019
  • Я изменяю свой файл функции I2C_init() на файл2 для теста, и там говорится, что невозможно достичь лазера... У меня плохой выбор канала. 18.04.2019
  • Я не понимаю... без мультиплексора вы можете писать/читать на/с одного датчика? Если нет, я думаю, вам нужно заставить это работать, прежде чем подключать больше датчиков. 18.04.2019
  • Да. Я могу легко. 19.04.2019
  • Может попробовать I2C_SLAVE_FORCE вместо I2C_SLAVE 19.04.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..