Pierwsze kroki z Raspberry Pi: obsługa magistrali I2C na przykładzie LED RGB
Zapis przez I2C
Spróbujmy teraz z linii poleceń zaświecić diodę modułu KAmodRGB, w pierwszej kolejności musimy zapisać rejestry MODE1, MODE2 i LEDOUT wartościami odpowiednio: 0x00, 0x00, 0xFF (jeśli jesteś ciekawy skąd te wartości to odsyłam do dokumentacji układu PCA9633), następnie zapisać wartości jasności do rejestrów PWMx, w poniższym przykładzie zaświecamy wszystkie składowe z maksymalną jasnością.
pi@raspberrypi /usr/lib $ sudo i2cset -y 1 0x07 0x00 0x00 pi@raspberrypi /usr/lib $ sudo i2cset -y 1 0x07 0x01 0x00 pi@raspberrypi /usr/lib $ sudo i2cset -y 1 0x07 0x08 0xff pi@raspberrypi /usr/lib $ sudo i2cset -y 1 0x07 0x02 0xff pi@raspberrypi /usr/lib $ sudo i2cset -y 1 0x07 0x03 0xff pi@raspberrypi /usr/lib $ sudo i2cset -y 1 0x07 0x04 0xff pi@raspberrypi /usr/lib $ sudo i2cset -y 1 0x07 0x05 0xff
Pierwsze dwa parametry mają analogiczne działanie jak w i2cdetect, kolejne trzy parametry to: adres urządzenia I2C, adres rejestru oraz wartość do zapisania w rejestrze.
Odczyt przez I2C
Teraz spróbujemy odczytać rejestry z modułu. Z linii poleceń umożliwia nam to polecenie i2cget:
pi@raspberrypi ~ $ sudo i2cget -y 1 0x07 0x0 0x00 pi@raspberrypi ~ $ sudo i2cget -y 1 0x07 0x1 0x00 pi@raspberrypi ~ $ sudo i2cget -y 1 0x07 0x2 0xff pi@raspberrypi ~ $ sudo i2cget -y 1 0x07 0x3 0xff pi@raspberrypi ~ $ sudo i2cget -y 1 0x07 0x4 0xff pi@raspberrypi ~ $ sudo i2cget -y 1 0x07 0x5 0xff pi@raspberrypi ~ $ sudo i2cget -y 1 0x07 0x6 0xff pi@raspberrypi ~ $ sudo i2cget -y 1 0x07 0x7 0x00 pi@raspberrypi ~ $ sudo i2cget -y 1 0x07 0x8 0xff
Dostęp do interfejsu I2C w języku C
Poniżej znajduje się przykładowy program, który płynnie zmienia kolor świecenia diody modułu KAmodRGB.
#include #include <linux/i2c-dev.h> #include int main() { int KAmodRGB; unsigned char buf[2], r, g, b, a; KAmodRGB = open("/dev/i2c-1", O_RDWR); if (KAmodRGB < 0) { printf("I2C open failed!\n"); return 1; } if (ioctl(KAmodRGB, I2C_SLAVE, 0x07) < 0) { printf("I2C set address failed!\n"); return 1; } r = 0; g = 255; b = 128; a = 128; while (1) { buf[0] = 2; buf[1] = r; if (write(KAmodRGB, buf, 2) != 2) { printf("I2C write failed!\n"); return 1; } buf[0] = 3; buf[1] = g; if (write(KAmodRGB, buf, 2) != 2) { printf("I2C write failed!\n"); return 1; } buf[0] = 4; buf[1] = b; if (write(KAmodRGB, buf, 2) != 2) { printf("I2C write failed!\n"); return 1; } buf[0] = 5; buf[1] = a; if (write(KAmodRGB, buf, 2) != 2) { printf("I2C write failed!\n"); return 1; } printf("r=%d, g=%d, b=%d, a=%d\n", r, g, b, a); usleep(20000); r++; g--; b++; a--; } }
Aby zainicjalizować interfejs wywołujemy funkcję open(„/dev/i2c-1”, O_RDWR), następnie ustawiamy adres urządzenia slave wywołaniem ioctl(KAmodRGB, I2C_SLAVE, 0x07). O ile wszystko się powiodło, możemy już komunikować się przez interfejs, w przykładowym programie co 200 ms zmieniam kolor świecenia diody modułu KAmodRGB, w tym celu wywołaniem write(KAmodRGB, buf, 2) wysyłam 2 bajty z tablicy buf z czego pierwszy bajt to adres rejestru a drugi – jego nowa wartość.