J. U
łasiewicz Magistrale wewnętrzne 1
Port szeregowy
1 Magistrala I2C
1.1 Opis magistrali
Magistrala wprowadzona przez firm
ę Philips i przeznaczona do
komunikacji wewn
ątrz urządzeń elektronicznych. Typowo stosowana do
łączenia mikrokontrolera z takimi urządzeniami jak wyświetlacze,
pami
ęci EEPROM, zegary RTC, przetworniki AD i DA, klawiatury. Jest to
magistrala szeregowa.
Najwa
żniejsze własności magistrali I
2
C:
•
Magistrala 2 przewodowa w sk
ład której wchodzą sygnały: dane –
SDA – (serial data line), zegar - SCL – (serial Clock)
•
Ka
żdy dołączony do magistrali układ ma unikalny adres.
Adresowanie 7 bitowe (128 urz
ądzeń) lub 10 bitowe (1024
urz
ądzeń). Rodzaj transmisji master – slave
•
Magistrala dopuszcza istnienie wielu uk
ładów typu Master.
Stosowany jest arbitra
ż.
•
Magistrala jest szeregowa, dwukierunkowa, zorientowana na
transmisje 8 bitowe.
•
Szybko
ści magistrali: standard mode - do 100kbit/s, fast-mode - do
400 kbit/s, high-speed mode - do 3.4 Mbit/s.
•
Liczba do
łączonych urządzeń ograniczona pojemnością – do 400 pF.
•
Wbudowane uk
łady zapobiegające przepięciom.
•
Zasi
ęg do kilku metrów
Inne w
łasności:
•
Ma
łe zużycie mocy
•
Odporno
ść na zakłócenia
•
Szeroki zakres napi
ęć zasilania
•
Szeroki zakres temperatur pracy
PDF created with pdfFactory trial version
J. U
łasiewicz Magistrale wewnętrzne 2
Port szeregowy
Definicje:
Termin I2C
Znaczenie
Nadajnik
Wysy
ła dane na magistralę I2C
Odbiornik
Odbiera dane z magistrali I2C
MASTER
Inicjalizuje transmisje, generuje sygna
ł zegarowy i
ko
ńczy transakcje
SLAVE
Urz
ądzenie które jest adresowane przez MASTER
Multi MASTER Wi
ęcej niż jeden MASTER próbuje objąć magistralę
Arbitra
ż
Zapewnia
że tylko jeden MASTER obejmie kontrolę nad
magistral
ą w sytuacji gdy więcej jednostek próbuje objąć
magistral
ę. Zapewnia że komunikat pozostanie
prawid
łowy
SDA
SCL
Mikrokontroler
Wy
świetlacz
LCD
Pami
ęć
EEPROM
Przetwornik AD
We/wy
Zegar czasu
rzeczywistego
RTC
rezystor
v
v
Vcc
rezystor
v
Vcc
v
Rys. 1-1 Przy
łączanie urządzeń do magistrali I2C
PDF created with pdfFactory trial version
J. U
łasiewicz Magistrale wewnętrzne 3
Port szeregowy
1.2 Warstwa fizyczna
Standard I2C wykorzystuje dwie dwukierunkowe linie: danych SDA i
zegara SCL.
U
żyty jest standard logiki dodatniej a więc wysokiemu poziomowi
napi
ęcia odpowiada logiczna 1 a niskiemu logiczne 0. Magistrala
pod
łączona jest do napięcia +5V poprzez rezystor. Linie te są typu
otwarty kolektor ze s
łabą 1 i mocnym 0. Znaczy to że gdy jeden z
uk
ładów wystawi jedynkę a drugi 0 na magistrali będzie 0.
1
1.3 Warstwa
łącza danych
Przesy
łania danych
Zmiana danych mo
że nastąpić gdy zegar SCL jest w poziome LOW. W
czasie gdy zegar jest w stanie HIGH dane musza by
ć stabilne.
1
Rysunki pochodz
ą z THE I 2C-BUS SPECIFICATION VERSION 2.1 JANUARY 2000
PDF created with pdfFactory trial version
J. U
łasiewicz Magistrale wewnętrzne 4
Port szeregowy
Warunek startu i stopu
W czasie transmisji zdefiniowane s
ą znaczniki startu i stopu transmisji.
Znacznik startu polega na tym
że w czasie wysokiego poziomu zegara
nast
ępuje zmiana linii sygnałowej z HIGH na LOW.
Znacznik stopu wyst
ąpi gdy w czasie wysokiego poziomu zegara
nast
ępuje zmiana linii sygnałowej SDA z LOW na HIGH.
Wykrywanie kolizji
Magistrala pozwala na wykrywanie kolizji. Ka
żde urządzenie
wystawiaj
ące jedynkę jednocześnie sprawdza, czy na magistrali
rzeczywi
ście pojawił się stan wysoki. Jeżeli tak nie, oznacza to, iż inne
urz
ądzenie nadaje w tym samym czasie zero i urządzenie zaprzestaje
nadawania.
Format danych
Przesy
łane są dane 8 bitowe począwszy od najstarszego do
najm
łodszego bitu. Liczba przesłanych bajtów nie jest ograniczona.
Je
żeli SLAVE nie może odebrać bądź wysłać bajtów gdyż zajęty jest
innymi czynno
ściami może zasygnalizować to stronie MASTER poprzez
przytrzymanie linii SCL zegara w stanie LOW. Transmisja si
ę wznowi
gdy SLAVE zwolni sygna
ł SCL.
Potwierdzanie danych
Ka
żdy odebrany bajt musi być potwierdzony przez odbiornik. Odbywa się
to poprzez wystawienie sygna
łu LOW w czasie gdy dziewiąty impuls
zegarowy jest w poziomie HIGH.
PDF created with pdfFactory trial version
J. U
łasiewicz Magistrale wewnętrzne 5
Port szeregowy
Adresowanie
Pocz
ątkowo standard zakładał 7-bitową przestrzeń adresową, co dawało
mo
żliwość zaadresowania do 128 urządzeń. Po wysłaniu znacznika
stopu wysy
łany jest 7 bitowy adres urządzenia SLAVE a następnie bit
kierunku. Warto
ść LOW tego bitu oznacza transmisję od mastera do
slave’a (zapis), podczas gdy warto
ść HIGH kierunek przeciwny (odczyt).
Rys. 1-2 Adresowanie 7 bitowe
Cz
ęść adresów jest zarezerwowana, pozostawiając do dyspozycji 112
warto
ści. Jednym z zarezerwowanych adresów jest adres 0, który
powoduje wys
łanie danych do wszystkich urządzeń podłączonych do
magistrali.
Adresowanie 10 bitowe
Wersja 1.0 magistrali pozwala na adresowanie 10-bitowe. W takim
przypadku pierwszy przesy
łany bajt zawiera 5 z góry ustalonych bitów
(11110XX) oraz dwa najstarsze bity adresu 10-bitowego oznaczone jako
XX. Drugi bajt zawiera pozosta
łe 8 bitów adresu. Potem następuje
normalna transmisja danych.
Rys. 1-3 Adresowanie 10 bitowe
PDF created with pdfFactory trial version
J. U
łasiewicz Magistrale wewnętrzne 6
Port szeregowy
Oznaczenie D
ługość
S
1
Bit startu
P
1
Bit Stopu
Rd/Wr
1
Bit Odczyt (Rd) / Zapis (Wr) Rd = 1, Wr = 0
A, NA
1
Addr
7 lub 10
Adres 7 bitowy, mo
że być rozszerzony do 10
Comm
8
Polecenie (Command)
Data
8
Dane
Count
8
Licznik zawieraj
ący długość bloku danych
[ …]
Dane przesy
łane przez urządzenie I2C (Slave)
do kontrolera (Master)
Tab. 1-1 Symbole opisu transmisji I2C
Przesy
łanie danych
Po pierwszym bajcie (po drugim gdy wyst
ępuje adresowanie 10 bitowe)
przesy
łane zostają dane. Może być dowolna liczba bajtów danych. Po
zako
ńczeniu przesyłania MASTER generuje warunek stopu.
Wyst
ępują trzy główne tryby pracy magistrali:
•
MASTER pisze do SLAVE
•
MASTER czyta ze SLAVE
•
Tryb mieszany – kierunek zmienia si
ę w czasie transmisji.
PDF created with pdfFactory trial version
J. U
łasiewicz Magistrale wewnętrzne 7
Port szeregowy
MASTER pisze do SLAVE
Rys. 1-4 MASTER pisze do SLAVE
Funkcja: i2c_master_send.
S Addr Wr [A] Data [A] Data [A] ... [A] Data [A] P
MASTER czyta dane przesy
łane ze SLAVE
Rys. 1-5 MASTER czyta dane przesy
łane ze SLAVE
Tryb mieszany
S Addr Rd [A] [Data] A [Data] A ... A [Data] NA P
Rys. 1-6 Kierunek transmisji mo
że się zmieniać w trakcie pojedynczej
transakcji
S Addr Rd [A] [Data] NA S Addr Wr [A] Data [A] P
PDF created with pdfFactory trial version
J. U
łasiewicz Magistrale wewnętrzne 8
Port szeregowy
Arbitra
ż
W systemie I2C mo
że dojść do sytuacji, w której więcej niż jedno
urz
ądzenie zechce przejąć kontrolę nad łączem. Zdefiniowano więc
specjaln
ą procedurę arbitrażową, która wyłania jedno urządzenie
MASTER spo
śród urządzeń rywalizujących o sterowanie transmisją.
Arbitra
ż wykorzystuje dwie własności magistrali. Po pierwsze jednostka
wystawiaj
ąca określony poziom na linii SDA może sprawdzić czy stan
ten zosta
ł rzeczywiście osiągnięty. Po drugie magistrala implementuje
s
łabą jedynkę i mocne zero. Tak więc gdy dwa rywalizujące urządzenia
MASTER wystawiaj
ą swój adres na magistrale, zwycięża to o niższym
adresie, gdy
ż zero jest mocniejsze niż jeden. Widzące to urządzenie o
wy
ższym adresie musi wycofać się z rywalizacji
PDF created with pdfFactory trial version
J. U
łasiewicz Magistrale wewnętrzne 9
Port szeregowy
1.4 Interfejs I2C w mikrokontrolerze
Stan linii SDA i SCL mo
że być monitorowany przez porty procesora.
Zajmuje to jednak du
żo czasu i lepiej gdy procesor wyposażony jest w
kontroler magistrali I2C który wysy
ła i odbiera bajty.
Komunikacja z kontrolerem odbywa si
ę poprzez rejestry widoczne w
przestrzeni pami
ęci lub we/wy.
Jednostka steruj
ąca I2C składa się z:
•
Interfejsu do 2 przewodowej magistrali I2C
•
2 rejestrów przesuwnych 8 bitowych do konwersji danych z postaci
równoleg
łej na szeregową i odwrotnie
•
Zestawu rejestrów statusowych i steruj
ących
Kontroler programuje si
ę poprzez wpis do rejestru sterującego ICR.
Status dost
ępny jest w rejestrze statusowym ISR. Dane odebrane należy
odczyta
ć z rejestru danych IDBR, tam też wpisuje się dane do
wysy
łania. Konwersja z postaci równoległej na szeregową i odwrotnie
odbywa si
ę poprzez rejestry przesuwne.
Przerwania generowane s
ą gdy:
•
Bufor odbiorczy jest pe
łny
•
Bufor nadawczy jest pusty
•
Wybrany zostanie adres SLAVE jednostki
•
Nieudanego arbitra
żu
•
B
łędu magistrali
PDF created with pdfFactory trial version
J. U
łasiewicz Magistrale wewnętrzne 10
Port szeregowy
SDA SCL
IDBR / odczyt
Uklad steruj
ący
Rejestr steruj
ący
ICR
Rejestr statusu
ISR
IMBR
IDBR / zapis
rejestr przesuwny
rejestr przesuwny
Rejestr adresu
SLAVE
WR
RD
RD
WR
interfejs
magistrali
v
v
Magistrala wewn
ętrzna
Magistrala I2C
INT
przerwanie
WR
Rys. 1-7
Jednostka steruj
ąca I2C kontrolera
PXA255 (Xscale)
Skrót
Nazwa rejestru
Opis
IMBR
Rejestr monitorowania
stanu magistrali
Bit 0 – stan SDA
Bit1 – stan SCL
IDBR
Rejestr danych
Dane wysy
łane i odbierane zawarte
s
ą w bitach 0 - 7
ICR
Rejestr steruj
ący
Zawiera definicje trybu pracy
ISR
Rejestr statusu
Zawiera znaczniki odebrania bajtu,
wys
łania bajtu, warunku stopu, błędu
magistrali, itp.
ISAR
Rejestr adresu SLAVE
Gdy jednostka pracuje jako SLAVE
rejestr ten zawiera adres jednostki
Tab. 1-2 Rejestry jednostki steruj
ące I2C na przykładzie procesora PXA255
(Xscale)
PDF created with pdfFactory trial version
J. U
łasiewicz Magistrale wewnętrzne 11
Port szeregowy
1.5 Uk
ład PCF8574 – ekspander wejść / wyjść dwustanowych
PCF8574 – 8 wej
ść wyjść dwustanowych
•
Uk
ład rozszerza magistralę I2C do 8 wejść wyjść dwustanowych.
•
Ka
żde z we/wy może być adresowane indywidualnie
Binarny adres urz
ądzenia zależy od ustawienia pinów A2,A1,A0 które
mog
ą być dołączone do masy lub napięcia zasilania:
Adres = 0 1 0 0 A2 A1 A0
Daje to adresy urz
ądzenia od 32 do 38.
PDF created with pdfFactory trial version
J. U
łasiewicz Magistrale wewnętrzne 12
Port szeregowy
Rys. 1-8 Zastosowanie uk
ładu PCF8574
PDF created with pdfFactory trial version
J. U
łasiewicz Magistrale wewnętrzne 13
Port szeregowy
1.6 Uk
ład PCF8591 - przetwornik AD/DA z I2C
Uk
ład PCF8591 jest 4 kanałowym 8 bitowym przetwornikiem AD i 1
kana
łowym przetwornikiem DA z interfejsem I2C.
W
łasności:
•
Pojedyncze napi
ęcie zasilania 2.5 – 6V
•
Interfejs szeregowy I2C
•
Trzy wej
ścia adresowe – 8 układów
•
Cz
ęstotliwość próbkowania zgodna z szybkością magistrali
•
4 wej
ścia AC niesymetryczne lub 2 różnicowe
•
Konwersja 8 bitowa metod
ą sukcesywnej aproksymacji
•
1 kana
ł 8 bitowego przetwornika DA
1.6.1 Budowa
Rys. 1-9 Budowa uk
ładu PCF8591
1.6.2 Adresowanie
Urz
ądzenie uaktywnia się po przesłaniu prowidłowego adresu. Zależy on
od polaryzacji wej
ść A0, A1, A2. Gdy są na poziomie 0 to adres wynosi
1001000. W praktyce podaje sie przesuni
ęty o 1 pozycję w prawo.
PDF created with pdfFactory trial version
J. U
łasiewicz Magistrale wewnętrzne 14
Port szeregowy
Rys. 1-10 Adresowanie uk
ładu
1.6.3 Sterowanie uk
ładem
Drugi bajt przes
łany do urządzenia traktowany jest jako słowo sterujące.
Znaczenie bitów definiuje poni
ższy rysunek.
PDF created with pdfFactory trial version
J. U
łasiewicz Magistrale wewnętrzne 15
Port szeregowy
Przyk
ładowo gdy wyślemy słowo sterujące 01000100 = 0x44 to będą
odczytywane kana
ły AD 0,1,2,3 w trybie autoinkrementacji i aktywne
b
ędzie wyjście DA.
Slowo steruj
ące
0
1
0
0
0
0
0
0
Adres
0
Warto
ść 1
Adres / bit zap-od.
Warto
ść DA
Rys. 1-11 Zapis warto
ści wyjściowej na przetwornik DA
Slowo steruj
ące
0
1
0
0
0
1
0
0
Adres
0
Warto
ść 1
Adres / bit zap-od.
Warto
ść AD - kan 0
Warto
ść 2
Warto
ść AD - kan 1
Warto
ść 3
Warto
ść AD - kan 2
Warto
ść 4
Warto
ść AD - kan 3
kierunek
zapis
zapis 0x44
odczyt
odczyt
odczyt
odczyt
Warto
ść 0
status
odczyt
Rys. 1-12 Odczyt warto
ści zmierzonej z przetwornika AD
PDF created with pdfFactory trial version
J. U
łasiewicz Magistrale wewnętrzne 16
Port szeregowy
1.7 Instalacja i konfiguracja sterowników
Sprz
ętowy kontroler I2C obsługiwany jest zazwyczaj przez jądro systemu
Linux. Aby tak si
ę stało należy zainstalować odpowiednie moduły
sterownika.
Obecnie dystrybucja Raspbian zawiera sterownik I2C ale jest on
nieaktywny. Aby aktywowa
ć go należy zakomentować linię w pliku
/etc/modprobe.d/raspi-blacklist.conf
sudo nano /etc/modprobe.d/raspi-blacklist.conf
Nast
ępnie należy poddać edycji plik /etc/modules i dodać tam w
nowej linii wpis i2c-dev
$sudo nano /etc/modules
Nast
ępnie instalujemy pakiet i2c-tools:
sudo apt-get install i2c-tools
(ew. sudo apt-get install libi2c-dev )
Dalej dodajemy u
żytkownika pi do grupy i2c
sudo adduser pi i2c
Po uruchomieniu sprawdzamy czy s
ą jakieś urządzenia i2c pisząc:
sudo i2cdetect -y 0
sudo i2cdetect -y 1
Powinna pojawi
ć się tabelka jak niżej:
PDF created with pdfFactory trial version
J. U
łasiewicz Magistrale wewnętrzne 17
Port szeregowy
Rys. 1-13 Tabela wykrytych urz
ądzeń i2c – zainstalowany układ PCF8591 pod
adresem 0x48
Nast
ępnie można zainstalować moduł smbus dla Pythona:
sudo apt-get install python-smbus
Pakiet i2c-tools zawiera nast
ępujące programy użytkowe:
•
i2cset [-y] i2cbus chip-address data-address value
[mode] [mask]
•
i2cget [-y] i2cbus chip-address [data-address
[mode]]
•
i2cdetect [-y] [-a] [-q|-r] i2cbus
Po aktywacji sterownika powinny one by
ć widoczne w katalogu /dev
jako: /dev/i2c-0, /dev/i2c-1 itd. Numery 0,1, oznaczaj
ą kolejne kanały.
Kana
ły I2C można również testować wyświetlając katalog:
/sys/class/i2c-dev/
PDF created with pdfFactory trial version
J. U
łasiewicz Magistrale wewnętrzne 18
Port szeregowy
1.8 Programowanie urz
ądzeń I2C
Zasady programowania urz
ądzeń I2C:
1. W
łączyć pliki nagłówkowe: <linux/i2c-dev.h>
2. Otworzy
ć urządzenie: fh = open("/dev/i2c-1",O_RDWR);
3. Poinformowa
ć sterownik z którym urządzeniem będziemy się
komunikowa
ć: ioctl(fh, I2C_SLAVE, PCF8591_ADR)
4. U
żyć funkcji read, write do wysyłania i odbierania bajtów
PDF created with pdfFactory trial version
J. U
łasiewicz Magistrale wewnętrzne 19
Port szeregowy
// Program dla Raspberry pi - sterowanie ukladem PCF8574
// P0,P1,P2,P4 - dolaczone diody LED do masy przez rezystor 1k
// P4,P5,P6,P7 - dolaczone do 5V przez rezystor 10 k,
// wylacznik DIP switch zwiera piny do masy
// Kompilacja gcc pcf8574.c -o pcf
#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/i2c-dev.h>
#include <linux/i2c.h>
#define PCF8574_ADR 0x20
int main(int argc, char *argv[]){
int i, kroki,fh,res;
char c;
if(argc <2) kroki = 50;
if(argc == 2) kroki = atoi(argv[1]);
fh = open("/dev/i2c-1",O_RDWR);
if (fh < 0) {
fprintf(stderr, "I2C file error!\n"); exit(1);
}
printf("Uchwyt %d\n",fh);
if (ioctl(fh, I2C_SLAVE, PCF8574_ADR) < 0) {
fprintf(stderr, "I2C adress error!\n");
exit(1);
}
for(i=0;i<kroki;i++) {
c = i;
res = write(fh,&c,1);
printf("zapis %02x, res %d",c,res);
res = read(fh,&c,1);
printf(" odczyt %02x, res %d\n",c,res);
usleep(100000);
}
close(fh);
return 0;
}
Przyk
ład 1-1 Program sterowania diodami LED układu PCF8574
PDF created with pdfFactory trial version
J. U
łasiewicz Magistrale wewnętrzne 20
Port szeregowy
#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/i2c-dev.h>
#define PCF8591_ADR 0x48
#define PCF8591_DAC_ENABLE 0x40
int write_dac(int fh,char DAC_value);
int read_adca(int fh,int val[4]);
int main(int argc, char *argv[]){
int fh;
int i, kroki,chan,res;
int aval[4];
fh = open("/dev/i2c-1",O_RDWR);
if (fh < 0) {
fprintf(stderr, "I2C file error!\n"); exit(1);
}
printf("Uchwyt %d\n",fh);
if (ioctl(fh, I2C_SLAVE, PCF8591_ADR) < 0) {
fprintf(stderr, "I2C adress error!\n");
exit(1);
}
val = 0x00;
write_dac(fh,val);
printf("\n");
for(i=0;i<kroki;i++) {
read_adca(fh,aval);
printf(" %02d %02d %02d %02d \n",
aval[0],aval[1],aval[2],aval[3]);
val = (val+10) % 256;
write_dac(fh,val);
usleep(500000);
}
close(fh);
return 0;
}
int write_dac (int fh, char value){
int res;
char buf[2];
buf[0] = PCF8591_DAC_ENABLE;
buf[1] = value;
res = write(fh, buf, 2);
if(res < 0) { perror("write"); return -1;}
printf (" DAC: %3d ",value);
return res;
}
PDF created with pdfFactory trial version
J. U
łasiewicz Magistrale wewnętrzne 21
Port szeregowy
int read_adca(int fh, int val[4]){
char vbuf[4];
int res,i;
vbuf[0] = 0x44;
// Polecenie odczytu 4 kan z autoinkrementacja
res = write(fh, vbuf, 1);
if(res < 0) { perror("write"); return -1;}
// Bajt odrzucany
res = read(fh, vbuf, 1);
if(res < 0) { perror("read"); return -1;}
// Odczyt 4 kanalow
res = read(fh, vbuf, 4);
if(res < 0) { perror("read"); return -1;}
for(i=0;i<4;i++) val[i] = vbuf[i];
return res;
}
Przyk
ład 1-2 Program sterowania przetwornikami AD/DA układu PCF8591
PDF created with pdfFactory trial version
J. U
łasiewicz Magistrale wewnętrzne 22
Port szeregowy
1.9 Biblioteka i2c_smbus
Nie wszystkie transakcje I2C dadz
ą się wyrazić poprzez użycie funkcji
read, write. W takim przypadku nale
ży użyć funkcji interfejsowych
biblioteki i2c_smbus.
function
description
parameters
return
value
SMBus Access
write_quick(addr)
Quick
transaction.
int addr
long
read_byte(addr)
Read Byte
transaction.
int addr
long
write_byte(addr,val)
Write Byte
transaction.
int addr,char
val
long
read_byte_data(addr,cmd)
Read Byte Data
transaction.
int addr,char
cmd
long
write_byte_data(addr,cmd,val)
Write Byte Data
transaction.
int addr,char
cmd,char val
long
read_word_data(addr,cmd)
Read Word Data
transaction.
int addr,char
cmd
long
write_word_data(addr,cmd,val)
Write Word Data
transaction.
int addr,char
cmd,int val
long
process_call(addr,cmd,val)
Process Call
transaction.
int addr,char
cmd,int val
long
read_block_data(addr,cmd)
Read Block Data
transaction.
int addr,char
cmd
long[]
write_block_data(addr,cmd,vals
)
Write Block Data
transaction.
int addr,char
cmd,long[]
None
block_process_call(addr,cmd,va
ls)
Block Process
Call transaction.
int addr,char
cmd,long[]
long[]
I2C Access
read_i2c_block_data(addr,cmd)
Block Read
transaction.
int
addr,char
cmd
long[]
write_i2c_block_data(addr,cmd,vals)
Block Write
transaction.
int
addr,char
cmd,long[]
None
PDF created with pdfFactory trial version
J. U
łasiewicz Magistrale wewnętrzne 23
Port szeregowy
#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/i2c-dev.h>
#define PCF8574_ADR 0x20
int main(int argc, char *argv[]){
int i, kroki,fh,res;
char c;
if(argc <2) kroki = 50;
if(argc == 2) kroki = atoi(argv[1]);
fh = open("/dev/i2c-1",O_RDWR);
if (fh < 0) {
fprintf(stderr, "I2C file error!\n"); exit(1);
}
printf("Uchwyt %d\n",fh);
if (ioctl(fh, I2C_SLAVE, PCF8574_ADR) < 0) {
fprintf(stderr, "I2C adress error!\n");
exit(1);
}
for(i=0;i<kroki;i++) {
c = i;
res = i2c_smbus_write_byte(fh,c);
printf("zapis %02x, res %d",c,res);
res = i2c_smbus_read_byte(fh);
printf(" odczyt %02x, \n",res);
usleep(100000);
}
close(fh);
return 0;
}
Przyk
ład 1-3 Program sterowania diodami LED układu PCF8574 – użyte funkcje
biblioteki i2c_smbus.
Uwaga!
Aby program da
ł się skompilować należy użyć:
sudo apt-get install libi2c-dev
Odczyt bajtu z urz
ądzenia I2C
__s32 i2c_smbus_read_byte(int file)
S Addr Rd [A] [Data] NA P
PDF created with pdfFactory trial version
J. U
łasiewicz Magistrale wewnętrzne 24
Port szeregowy
Zapis bajtu do urz
ądzenia I2C
__s32 i2c_smbus_write_byte(int file, __u8 value)
S Addr Wr [A] Data [A] P
PDF created with pdfFactory trial version
J. U
łasiewicz Magistrale wewnętrzne 25
Port szeregowy
Literatura
[1] THE I 2C-BUS SPECIFICATION VERSION 2.1 JANUARY 2000
[2]
[3] Embedded Systems Academy
http://www.esacademy.com/en/library/technical-articles-and-
documents/miscellaneous/i2c-bus/
[4] Witryna xGoat – Using I2C from user space in Linux
https://xgoat.com/wp/2007/11/11/using-i2c-from-userspace-in-linux/
PDF created with pdfFactory trial version