Czy istnieje biblioteka I2C?


12

Czy istnieje prosta biblioteka do rozmowy z I2C dla C ++? Znalazłem trochę rzeczy dla Pythona i Javy, ale chciałem C ++. Miałem nadzieję, że ktoś przeniósł bibliotekę Arduino Wire, abym mógł użyć kodu, który już napisałem dla Arduino.



1
Nie zgadzam się ... Naprawdę pytam, czy biblioteka okablowania Arduino została przeniesiona do Pi, więc mogę łatwo używać kodu napisanego dla Arduino na Pi. Wydaje się, że tak nie jest, więc każda równoważna, łatwa w użyciu biblioteka byłaby miła. Jednak wydaje się, że również nie istnieje, więc pozostało mi użycie kodu i2c-dev.
kevin,

Odpowiedzi:


7

W przestrzeni użytkownika Linuksa znajduje się nagłówek i2c-dev. Nie pamiętam, czy ten nagłówek jest dostarczany z pakietem czujników lm, czy też będzie musiał zostać zainstalowany ze źródła. Sprawdziłbym repozytorium paczek twojej dystrybucji. xGoat ma fajny artykuł na temat przygotowania i użytkowania.

#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
*/

Kod źródłowy narzędzi i2c ( pobieranie ) jest dobrym przykładem C. Widziałem kilka prostych C++bibliotek pakujących te funkcje. Poleciłbym stworzyć własną bibliotekę dostosowaną do twoich potrzeb. Inne świetne przykłady można znaleźć na Github, takie jak biblioteka I2CBus


5

Właśnie zacząłem korzystać z biblioteki pigpio i jestem pod dużym wrażeniem. Szczególnie podoba mi się tryb bit bang, ponieważ pozwala na użycie dowolnych dwóch pinów GPIO jako interfejsu I2C, o ile mają one rezystory pullup. Jeśli używasz PI2, nie ma dużej wady bit banging, ponieważ masz 4 procesory. Dobrą rzeczą w poleceniach bit bang jest to, że pobierają listę bajtów poleceń „adres, zapis, dane, odczyt, start, stop”, aby można było uruchomić wiele operacji we / wy za pomocą jednego wywołania. To jedyna rzecz, którą znalazłem, która niezawodnie uruchamia powtarzające się transakcje uruchamiania, które są wymagane przez wiele urządzeń, które pobierają numer rejestru na początku polecenia odczytu. Biblioteka jest dobrze udokumentowana i łatwa w użyciu.

Poniżej znajduje się program testowy, który odczytuje rejestry temperatury na MAX31785. 4 ustawia adres z następnym bajtem, 2 = start, 7 = zapis, po którym następuje liczba bajtów i bajty danych, 3 = stop, 6 = odczyt, po którym następuje liczba bajtów. Wywołanie zwraca wszystkie odczytane bajty wraz z liczbą bajtów.

#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, Dziękujemy za opublikowanie przykładowego kodu. To był najlepszy przykład, jaki udało mi się znaleźć i postawić na właściwej drodze. Jedyny problem, jaki miałem z tym, to użycie biblioteki pigpiod_if.h, aby kod działał jako sudo, co nie było możliwe w moim projekcie. Byłem w stanie przełączyć się na bibliotekę pigpiod_if2.h i wprowadzić kilka poprawek, które działały jak mistrz.
Richard Teel,

2

Jak wspomniano przez emcconville, w przestrzeni użytkownika Linuksa ( #include <linux/i2c-dev.h>) znajduje się nagłówek i2c-dev . Ponadto potrzebujesz urządzenia postaci do odczytu. Można to zrobić, ładując odpowiednie moduły. i2c_bcm2708dla niskopoziomowego sterownika i i2c-devdo generowania znaków dla autobusów. Zastosować ...

sudo modprobe -r i2c_bcm2708
sudo modprobe i2c_bcm2708 baudrate=32000

do ładowania ich w locie. Zastosować ...

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

i odblokuj i2c_bcm2708na, /etc/modprobe.d/raspi-blacklist.confaby tworzyć /dev/i2c-0i /dev/i2c-1wyświetlać się na stałe.

Odtąd możesz podążać za wskazówkami, jak sam korzystać z I²C del maestro.

Wolę tę metodę, ponieważ jest ona platformaagnostyczna. Możesz używać także linux/i2c-dev.hz innymi urządzeniami, o ile istnieje sterownik I²C. WiringPi jest związany z rPi.

pozdrowienia

AKTUALIZACJA:

Ta informacja jest nieaktualna. Sprawdź ten post pod kątem korzystania z drzew urządzeń.


0

Istnieje WiringPi, które moim zdaniem robi dokładnie to, czego chcesz. Istnieją również opakowania dla Pascal, Java, Python, Perl, TCL i Ruby. Dodatkowo ktoś może chcieć odkryć podobne linki:

  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

Nie ... spójrz jeszcze raz, to nie robi i2c, tylko podstawowe funkcje pinów. Projekt jest nieco myląco nazwany. Twój pierwszy link ma fajny kod c, ale nie jest prostym narzędziem do robienia i2c jak w Arduino. Prawdopodobnie będę musiał to napisać sam.
kevin

3
Biblioteka WiringPi I2C: wiringpi.com/reference/i2c-library
avra
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.