+3 голосов

Используя штатные средства Linux пытаюсь заставить плату одновременно работать с 2мя IIC  устройствами. Работа с отдельным устройством для меня не проблема, но с 2мя возникли сложности:

#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <i2c-dev.h>


//Открытие порта
if(( fd = open("/dev/i2c-1", O_RDWR)) < 0) qDebug()<<("Error failed to open I2C bus /dev/i2c-1.\n");
  


//Открытие устройства
if( ioctl( fd, I2C_SLAVE, _address) != 0) qDebug()<<"Error can't find BNO055 at address [0x%02X].\n", _address;

//Запись
void BMP280::writeByte(uint8_t address, uint8_t subAddress, uint8_t data)
{

   //if(write(fd, &address, 1) != 1) qDebug()<<"Error: I2C write failure for register"<<subAddress << "readBytes BMP280";

    uint8_t buf[3] = { address , subAddress, data };

   if(write(fd, &buf, 3) != 3) qDebug()<<"Error: I2C write failure for register"<<subAddress << "writeByte BMP280";

}


//Чтение
void BMP280::readBytes(uint8_t address, uint8_t subAddress, uint8_t count, uint8_t * dest)
{

    //if(write(fd, &address, 1) != 1) qDebug()<<"Error: I2C write failure for register"<<subAddress << "readBytes BMP280";

    uint8_t buf[2] = { address, subAddress };


    if(write(fd, &buf, 2) != 2) qDebug()<<"Error: I2C write failure for register"<<subAddress << "readBytes BMP280";


    if(read(fd, dest, count) != count) qDebug()<<"Error: I2C read failure for register data "<<subAddress << "readBytes BMP280";

}

Проблема возникает в функции ioctl( fd, I2C_SLAVE, _address) данная функция принимает адрес только одного устройства и добавляет его при каждом обращении к шине I2C. Таким образом я могу работать только с одним устройством адрес которого в ней указан. Есть ли какой-то альтернативный способ чтения/записи?

(19 баллов) 5

1 Ответ

+3 голосов
Прежде, чем обратиться к SLAVE устройству, MASTER выставляет адрес этого устройства и далее идет команда - чтение или запись регистра SLAVE устройства. После идет NACK. Как только SLAVE устройство будет готово отдать данные, оно опускает шину данных, после чего MASTER может тактировать шину и забирать данные со SLAVE устройства. Отсюда вывод: на каждый сеанс работы со SLAVE устройством необходимо помнить его адрес, иначе будет бардак.
(2.2 тыс. баллов) 4 19 52
На данный момент я использую следующую реализацию:
Добро пожаловать на Бредборд! Сайт вопросов и ответов на тему Arduino, Raspberry Pi и хоббийной электроники в целом. Цель Бредборда — быть максимально полезным. Поэтому мы строго следим за соблюдением правил, боремся с холиворами и оффтопиком.
  1. parovoZZ

    102 балл(ов)

  2. Un_ka

    66 балл(ов)

  3. sser

    38 балл(ов)

  4. Тигрыч

    10 балл(ов)

  5. Kiprais

    9 балл(ов)

  6. N08I40K

    8 балл(ов)

Награды месяца
1-е место: Raspberry Pi 3 Model A+
2-е место: Raspberry Pi Zero W
3-е место: Raspberry Pi Zero

...