LinkedIn YouTube Facebook
Szukaj

Wstecz
SoM / SBC

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