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ść.

Dominik Bednarski porównuje STM32MP1 i OpenSTLinux oraz Raspberry Pi 5
Technologie End of Life i bezpieczeństwo sieci – wyzwania Europy związane z tzw. długiem technologicznym
Najczęstsze błędy firm przy wyborze dostawcy energii i jak ich uniknąć 



