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.
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.
Odpowiedzi:
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
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();
}
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_bcm2708
dla niskopoziomowego sterownika i i2c-dev
do 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_bcm2708
na, /etc/modprobe.d/raspi-blacklist.conf
aby tworzyć /dev/i2c-0
i /dev/i2c-1
wyś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.h
z innymi urządzeniami, o ile istnieje sterownik I²C. WiringPi jest związany z rPi.
pozdrowienia
Ta informacja jest nieaktualna. Sprawdź ten post pod kątem korzystania z drzew urządzeń.
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: