Есть ли библиотека I2C

12

Есть ли простая библиотека для общения с I2C для C ++? Я нашел кое-что для Python и Java, но я хотел C ++. Я надеялся, что кто-то перенес библиотеку Arduino Wire, чтобы я мог использовать код, который я уже написал для Arduino.

Кевин
источник
1
Не согласен ... Я действительно спрашиваю, была ли библиотека проводов Arduino перенесена на Pi, чтобы я мог легко использовать код, написанный для Arduino на Pi. Похоже, что это не так, поэтому любая эквивалентная, простая в использовании библиотека была бы хороша. Однако, это также, кажется, не существует, поэтому я остаюсь с использованием кода i2c-dev.
Кевин

Ответы:

7

В пользовательском пространстве Linux есть заголовок i2c-dev. Я не могу вспомнить, поставляется ли этот заголовок с пакетом lm-sensor, или его нужно будет установить из исходного кода. Я бы проверил хранилище пакетов вашего дистрибутива. У xGoat есть хорошая статья, посвященная подготовке и использованию.

#include <linux/i2c-dev.h>
/*
  Including i2c-dev header will allow the following I2C SMBus functions
  - i2c_smbus_access
  - i2c_smbus_write_quick
  - i2c_smbus_read_byte
  - i2c_smbus_write_byte
  - i2c_smbus_read_byte_data
  - i2c_smbus_write_byte_data
  - i2c_smbus_read_word_data
  - i2c_smbus_write_word_data
  - i2c_smbus_process_call
  - i2c_smbus_read_block_data
  - i2c_smbus_write_block_data
  - i2c_smbus_read_i2c_block_data
  - i2c_smbus_write_i2c_block_data
  - i2c_smbus_block_process_call
*/

Хороший пример - исходный код i2c-tools ( скачать ) C. Я видел несколько простых C++библиотек, обертывающих эти функции. Я бы порекомендовал создать собственную библиотеку в соответствии с вашими потребностями. Другие отличные примеры можно найти на Github, например, эта библиотека I2CBus

emcconville
источник
5

Я только начал использовать библиотеку pigpio, и я очень впечатлен. Мне особенно нравится режим битового взрыва, поскольку он позволяет использовать любые два вывода GPIO в качестве интерфейса I2C, если они имеют подтягивающие резисторы. Если вы используете PI2, побитовые биты не сильно уступают, так как у вас 4 процессора. Хорошая вещь о командах bit bang состоит в том, что они берут список командных байтов «address, write, data, read, start, stop», так что вы можете выполнить несколько операций ввода-вывода за один вызов. Это единственное, что я обнаружил, что он надежно выполняет повторные стартовые транзакции, которые требуются многим устройствам, которые принимают номер регистра в начале команды чтения. Библиотека хорошо документирована и проста в использовании.

Ниже приведена тестовая программа, которая считывает регистры температуры на MAX31785. 4 устанавливает адрес со следующим байтом, 2 = начало, 7 = запись, за которой следуют счетчик байтов и байтов данных, 3 = стоп, 6 = чтение, за которым следует счетчик байтов. Вызов возвращает любые прочитанные байты данных вместе с количеством байтов.

#include <stdio.h>
#include <stdlib.h>
#include <pigpio.h>

#define MAX31785_TEMP_REG 0x8D
#define MAX31785_TEMP0 6
#define MAX31785_TEMP_INT 12
#define PAGE_REG_OFFSET 6  // Offset in CmdBuf of the page register write value


main( int argc, char *argv[])
{
    int  rcnt;
    char ReadBuf[256];
    char CmdBuf[] = {4, 0x52,  // Chip address
                       2, 7, 2, 0x00, MAX31785_TEMP0, 3,    // Write page register to select temperature sensor
                       2, 7, 1, MAX31785_TEMP_REG, 2, 6, 2, 3, // Read temperature register
                       0 // EOL
                       };

  if (gpioInitialise() < 0) return 1;

  // Open bit banging I2C on standard I2C pins
  if (bbI2COpen(2, 3, 100000)) return 1;

  while(1)
  {
    // Loop over the 7 temp sensors
      for(CmdBuf[PAGE_REG_OFFSET] = MAX31785_TEMP0; CmdBuf[PAGE_REG_OFFSET] <= MAX31785_TEMP_INT; CmdBuf[PAGE_REG_OFFSET]++)  
      {     
    // Read the temp reg for the current page
          rcnt = bbI2CZip(2, CmdBuf, sizeof(CmdBuf), ReadBuf, sizeof(ReadBuf));

          if(rcnt == 2)
            // Print out degrees C
            printf("%2.1f ", (short)(((ReadBuf[1] << 8) | ReadBuf[0]) + 50)/100.0 );
          else
            printf("Error: %d\n", rcnt);
      }

    printf("\n");
    fflush(stdout);
    sleep(1);
  }

  bbI2CClose(2);

  gpioTerminate();
}
crj11
источник
crj11, спасибо за размещение вашего примера кода. Это был лучший пример, который мне удалось найти и поставить меня на правильный путь. Единственная проблема, с которой я столкнулся, заключалась в том, что при использовании библиотеки pigpiod_if.h код должен запускаться как sudo, что было неприемлемо для моего проекта. Я смог переключиться на библиотеку pigpiod_if2.h и сделать несколько настроек, и она работала как чемпион.
Ричард Тил
2

Как упомянул emcconville, в пользовательском пространстве Linux есть заголовок i2c-dev ( #include <linux/i2c-dev.h>). Кроме того, вам нужно устройство для чтения символов. Это можно сделать, загрузив правильные модули. i2c_bcm2708для драйвера низкого уровня и i2c-devдля генерации символов для шин. Подать заявление ...

sudo modprobe -r i2c_bcm2708
sudo modprobe i2c_bcm2708 baudrate=32000

для загрузки их на лету. Подать заявление ...

sudo sh -c 'echo "i2c-dev" >> /etc/modules'
sudo sh -c 'echo "options i2c_bcm2708 baudrate=<your preferred baudrate>\n" > /etc/modprobe.d/custom.conf

и unblacklist i2c_bcm2708в , /etc/modprobe.d/raspi-blacklist.confчтобы сделать /dev/i2c-0и /dev/i2c-1показать на постоянной основе .

Отныне вы можете следовать подсказкам о том, как использовать I²C del maestro сам.

Я предпочитаю этот метод, потому что он платформенный. Вы можете использовать и linux/i2c-dev.hс другими устройствами, если существует драйвер I²C. WiringPi связан с RPI.

С уважением

ОБНОВИТЬ:

Эта информация устарела. Проверьте этот пост на использование деревьев устройств.

ManuelSchneid3r
источник
0

Есть WiringPi, который, я думаю, делает именно то, что вы хотите. Есть также оболочки для Pascal, Java, Python, Perl, TCL и Ruby. Кроме того, кто-то может захотеть изучить похожие ссылки:

  1. http://www.susa.net/wordpress/2012/06/raspberry-pi-pcf8563-real-time-clock-rtc/
  2. http://binerry.de/post/26685647322/raspberry-pi-and-i2c
  3. http://www.lazarus.freepascal.org/index.php?topic=17404.0
Avra
источник
Нет ... посмотри еще раз, он не делает i2c, только основные функции контактов. Проект несколько обманчиво назван. Ваша первая ссылка имеет хороший код на c, но не простую оболочку для i2c, как с Arduino. Мне, вероятно, придется написать это самому.
Кевин
3
WiringPi I2C библиотека: wiringpi.com/reference/i2c-library
Avra