background image

  

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 

www.pdffactory.com

background image

  

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 

www.pdffactory.com

background image

  

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 

www.pdffactory.com

background image

  

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 

www.pdffactory.com

background image

  

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 

www.pdffactory.com

background image

  

J. U

łasiewicz      Magistrale wewnętrzne 6 

 
Port szeregowy 

 
 
Oznaczenie  D

ługość   

Bit startu 

Bit Stopu 

Rd/Wr 

Bit  Odczyt (Rd) / Zapis (Wr)  Rd = 1, Wr = 0 

A, NA 

 

Addr 

7 lub 10 

Adres 7 bitowy, mo

że być rozszerzony do 10 

Comm 

Polecenie (Command) 

Data 

Dane  

Count 

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 

www.pdffactory.com

background image

  

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 

www.pdffactory.com

background image

  

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 

www.pdffactory.com

background image

  

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 

www.pdffactory.com

background image

  

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 

www.pdffactory.com

background image

  

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 

www.pdffactory.com

background image

  

J. U

łasiewicz      Magistrale wewnętrzne 12 

 
Port szeregowy 

 

Rys. 1-8 Zastosowanie uk

ładu PCF8574 

 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

  

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 

www.pdffactory.com

background image

  

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 

www.pdffactory.com

background image

  

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 

www.pdffactory.com

background image

  

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 

www.pdffactory.com

background image

  

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 

www.pdffactory.com

background image

  

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 

www.pdffactory.com

background image

  

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 

www.pdffactory.com

background image

  

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 

www.pdffactory.com

background image

  

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 

www.pdffactory.com

background image

  

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 

www.pdffactory.com

background image

  

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 

www.pdffactory.com

background image

  

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 

www.pdffactory.com

background image

  

J. U

łasiewicz      Magistrale wewnętrzne 25 

 
Port szeregowy 

Literatura 
[1] THE I 2C-BUS SPECIFICATION VERSION 2.1 JANUARY 2000 
[2

http://www.lm-sensors.nu/

 

[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 

www.pdffactory.com