Magistrala I2C 10 id 276712 Nieznany

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

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

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


Wyszukiwarka

Podobne podstrony:
P 10 id 343561 Nieznany
dodawanie do 10 4 id 138940 Nieznany
ldm rozmaite 10 id 264068 Nieznany
Dubiel LP01 MRS 10 id 144167 Nieznany
I CSK 305 10 1 id 208211 Nieznany
IMG 10 id 211085 Nieznany
na5 pieszak 03 02 10 1 id 43624 Nieznany
img 10 id 211004 Nieznany
cwicz 10 F id 124010 Nieznany
IMG 10 id 210949 Nieznany
Chemia 10 3 id 111757 Nieznany
IMG 10 id 210983 Nieznany
BiolMol 10 id 87436 Nieznany
egzamin09 10 id 153651 Nieznany
ETI Semestr 5 inz 10 10 id 1644 Nieznany
DrgAE Wym 10 id 141914 Nieznany
dodawanie do 10 3 id 138939 Nieznany

więcej podobnych podstron