Чи є бібліотека I2C


12

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



1
Не погоджуюсь ... Мені дуже цікаво, чи бібліотека електропроводки Arduino перенесена на Pi, щоб я міг легко використовувати код, написаний для Arduino на Pi. Здається, це не так, тому будь-яка еквівалентна, проста у користуванні бібліотека була б непоганою. Однак цього, здається, не існує, тому мені залишається використовувати код i2c-dev.
кевін

Відповіді:


7

У просторі користувача Linux є заголовок i2c-dev. Я не можу пригадати, чи цей заголовок поставляється з пакетом lm-датчиків, чи його потрібно буде встановити з джерела. Я перевірив сховище пакунків вашого дистрибутива. 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-інструментів ( завантаження ) є хорошими прикладами в C. Я бачив кілька простих C++бібліотек, які виконують ці функції. Я рекомендую створити власну бібліотеку відповідно до ваших потреб. Інші чудові приклади можна знайти на Github, як ця бібліотека I2CBus


5

Я щойно почав користуватися бібліотекою pigpio, і я дуже вражений. Особливо мені подобається режим біт-баг, оскільки він дозволяє використовувати будь-які два штифти GPIO як інтерфейс I2C, якщо у них є резистори. Якщо ви використовуєте PI2, то біт стукань не має великого мінусу, оскільки у вас є 4 процесора. Приємна річ у командах біт-баг полягає в тому, що вони беруть список байтів команд "адреса, запис, дані, читання, запуск, зупинка", щоб ви могли запускати декілька вводу-виводу з одного виклику. Єдине, що я виявив, що надійно виконує операції з повторним запуском, які вимагаються багатьма пристроями, які приймають номер реєстру на початку команди read. Бібліотека добре документована та проста у користуванні.

Нижче наводиться тестова програма, яка зчитує регістри температури на 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, Дякуємо за публікацію прикладу коду. Це був найкращий приклад, який я зміг знайти і поставити мене на правильний шлях. Єдиною проблемою у мене було використання бібліотеки pigpiod_if.h, що вимагає виконання коду як sudo, що не було прийнятним для мого проекту. Мені вдалося переключитися на бібліотеку pigpiod_if2.h і зробити декілька твік, і вона пробігала, як чемпіон.
Річард Тіл

2

Як зазначає emcconville, у користувальному просторі Linux ( #include <linux/i2c-dev.h>) є заголовок i2c-dev . Крім того, вам потрібен персональний пристрій для читання. Це можна зробити, завантаживши правильні модулі. 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. ПроводкаPi прив’язана до rPi.

З повагою

ОНОВЛЕННЯ:

Ця інформація застаріла. Перевірте цю публікацію щодо використання дерев пристроїв.


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

Ні ... подивіться ще раз, це не робить i2c, а лише основні функції штифтів. Проект дещо оманливо названий. У вашому першому посиланні є якийсь гарний код c, але не простий пакунок, який можна зробити i2c, як у Arduino. Мені, мабуть, доведеться це написати самостійно.
кевін

3
WiringPi I2C library: wiringpi.com/reference/i2c-library
avra
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.