Documente Academic
Documente Profesional
Documente Cultură
1. Tema proiectului
Se consider o structur hardware constnd din dou sisteme de dezvoltare echipate cu
microcontrolere de tip 80C552. Acest tip de microcontroler integreaz n cip facilitile
hardware necesare pentru a comunica pe o magistral serial n standard I2C. Acest hardware
are structura unui automat cu stri finite, exploatabil prin intermediul unor registre ale
microcontrolerului. Modul de exploatare este descris pe larg n paragraful 2.
Se cere s se lege ntre ele dou sisteme, unul care funcioneaz ca master i unul care
funcioneaz ca sclav. Pentru fiecare dintre sisteme se va scrie un program, n limbaj C, care
s permit comunicaia ntre cele dou sisteme astfel:
1. La nceputul rulrii aplicaiei (dup reset), fiecare modul iniializeaz interfaa
I2C.
2. Dup iniializare, sistemul master intr n modul transmitor i transmite ctre
sclav dou iruri de octei. Aceste iruri snt preluate din memorie, unde se
presupune c au fost declarate prin program, ca constante. Sistemul sclav va
recepiona aceste iruri de octei i le va memora ntr-un buffer. Transmisia celor
dou iruri se va face ca o operaie indivizibil, prin generarea unui start repetat
dup transmiterea primului ir.
3. Dup terminarea transmisiei de ctre master, acesta va trece n mod receptor, iar
sclavul va trece n mod transmitor. Acum sistemul sclav va transmite dou iruri
de octei, iar sistemul master le va recepiona, deasemenea cu start repetat.
Apariia unei erori de magistral va avea ca efect abandonarea operaiei curente (de
transmitere, respectiv de recepie) i ncercarea de reluare a ei. Deoarece n sistem exist un
singur master, apariia unei stri de pierdere a arbitrrii va fi tratat la fel ca o eroare.
Deasemenea, absena semnalului de acknoledge de la sclav va fi tratat ca eroare. ncercarea
de repetare a transferului se va face de trei ori, dup care se va aborta ntreaga sesiune de
comunicaie.
n paragraful 3 se dau indicaii de programare.
R
SDA
SC L
P1.7
P1.6
Alte
dispozitive
8xC552
Alte
dispozitive
Semnal ACK
de la Receptor
Conditia de STO P
SDA
S
MSB
R/W
Adresa SLAVE
Bit
directie
SCL
S
9
ACK
Conditia de
START
3-8
9
ACK
P/S
Masterul este ntotdeauna cel care iniiaz un transfer pe magistral, indiferent de sensul
transferului. El genereaz impulsurile de ceas, pe linia SCL, i condiiile de START (S),
STOP (P) sau START repetat, pe linia SDA. O condiie de START repetat ncheie un
transfer, dar masterul nu cedeaz magistrala, ci o pstreaz i pentru urmtorul trasnsfer.
2.2 Moduri de lucru
Interfaa SIO1 poate opera n patru moduri:
Modul master transmitor
Primul octet transmis de master conine adresa de sclav (pe 7 bii) i bitul de sens al
transferului R/W\=0 (se transmite W). Notm acest octet SLA+W. Urmeaz un numr de
octei de date, sclavul returnnd bitul ACK dup fiecare octet recepionat. START i STOP
indic nceputul i sfritul unui transfer.
Modul master receptor
Primul octet transmis de master contine adresa de sclav (pe 7 bii) i bitul de sens al
transferului R/W\=1 (se transmite R). Notm acest octet SLA+R. Urmeaz un numr de octei
de date transmii de sclav, masterul returnnd bitul ACK dup fiecare octet recepionat.
START i STOP indic inceputul i sfritul unui transfer.
Modul sclav receptor
Primul octet recepionat este SLA+W. Dac adresa recepionat coincide cu cea
proprie, sclavul intr n legatur cu masterul, recepioneaz octeii de date transmii de acesta
i returneaz un ACK dup fiecare octet. START i STOP snt recunoscui ca nceput i
sfrit de transfer.
Modul sclav transmitor
Primul octet recepionat este SLA+R. Dac adresa recepionat coincide cu cea
proprie, sclavul intr n legtura cu masterul, transmite octeii de date iar masterul returneaza
un ACK dup fiecare octet. START i STOP snt recunoscui ca nceput i sfrit de transfer.
2.3 Registrele de lucru
Registrul de control S1CON
Structura registrului S1CON este urmtoarea.
S1CON
CR2
ENS1
STA
STO
SI
AA
CR1
unde :
CR2, CR1, CR0 - stabilesc rata de transfer (se nscriu doar n modul master)
ENS1 - bitul de validare al interfeei SIO1
STA - bitul de START
STO - bitul de STOP
SI - fanionul de ntrerupere/polling
AA - fanionul de confirmare
CR0
Tabelul urmtor prezint ratele de transfer pentru frecvenele de oscilaie de 6MHz, 12MHz
i 16MHz.
Frecventa biti ( kHz ) la Fosc
CR2
CR1
CR0
6 MHz
12 MHz
16 MHz
0
0
0
23
47
63
0
0
1
27
54
71
0
1
0
31
63
83
0
1
1
37
75
100
1
0
0
6.25
12.5
17
1
0
1
50
100
1
1
0
100
Registrul de stare S1STA
Este un registru SFR pe 8 bii, care poate fi doar citit. Cei mai semnificativi 5 bii
conin codul binar al strii n care se afl SIO1, iar cei mai puin semnificativi 3 bii snt zero.
Exist 26 de stri posibile ale circuitului (din care una, codificat F8H, nu conine informaii
relevante). La intrarea n oricare din celelalte 25 de stari, bitul SI este setat.
Registrul de adres S1ADR
Este un registru SFR pe 8 bii care poate fi citit sau nscris. Coninutul sau este fr
importan cnd SIO1 este n modul master. n modul sclav cei 7 bii mai semnificativi
trebuie ncrcai cu adresa proprie a microcontrolerului.
Dac bitul cel mai puin semnificativ, notat GC este setat, microcontrolerul va
recunoate pe lnga adresa proprie i o adres general, codat cu 0.
Registrul de date S1DAT
Este un registru SFR pe 8 bii i conine octetul de date care va fi transmis sau care
tocmai a fost recepionat pe linia serial. Data ramne stabil n acest registru att timp ct
SIO1 este ntr-o stare definit i bitul SI este setat.
3. Indicaii de programare
ntr-o aplicaie, lucrul cu interfaa serial I2C ( SIO1 ) se poate realiza, n principiu, n
dou moduri :
prin interogare (polling) cu ntreruperea serial SIO1 invalidat. n acest caz se testeaz
prin program bitul SI pentru a detecta momentul n care interfaa ajunge ntr-o stare definit
(codul strii se citete din registrul S1STA).
prin ntreruperi. n acest caz programatorul trebuie s scrie o subrutin de tratare a
ntreruperii la care se ajunge automat (prin mecanisme hardware) atunci cnd bitul SI este
setat.
n principiu, un program pentru interfaa serial I2C ar trebui s cuprind o funcie de
iniializare a interfeei, cte o funcie pentru implementarea fiecrui mod de lucru i o funcie de
ntrerupere (dac se lucreaz cu ntreruperi).
Funcia de iniializare trebuie s realizeze programarea S1CON (validare, rata de
transfer, etc).
Funcia care implementeaz un mod de lucru trebuie s realizeze un automat secvenial
cu un numr finit de stri. Ea va cuprinde o bucl de ateptare, n care se testeaz fanionul SI
pn cnd acesta este setat prin hardware, eveniment ce indic trecerea ntr-o nou stare. n
continuare, aciunea ntreprins depinde de codul strii curente din S1STA.
Funcia de tratare a ntreruperii trebuie s realizeze, n principiu, aceleai aciuni
prezentate anterior, adic implementarea modurilor de lucru, cu diferena c nu se mai face
testarea bitului SI, deoarece aceast funcie este apelat automat atunci cnd se schimb starea i
SI este setat.
De regul, aplicaiile pentru microcontrolere se dezvolt, la nivel software, pe un
calculator PC pe care ruleaz un crosscompilator. Acesta genereaz cod obiect care va fi
transportat pe sistemul int, fie printr-o cale de comunicaie serial (RS232), fie prin
nscriere n EPROM.
Compilatorul C pentru microcontrolerul 80552 recunoate numele registrelor SFR i
ale biilor din aceste registre. Ele snt asimilate unor variabile predefinite i pot aprea n
expresii i n instrucii de atribuire. De exemplu:
x = S1STA; sau
while(~SI); sau
SI = 1;
snt instrucii valide.
SLA
08H
DATA
18H
28H
SLA
cu un START REPETAT
10H
A/
adresa slave
20H
A/
octet de date
La modul
MST/REC
30H
A sau
A/
Alti MST
continua
38H
in continuare ca SLAVE
68H
A sau
A/
Alti MST
continua
38H
Alti MST
continua
78H
80H
La starile corespunzatoare
in modul SLAVE
De la MASTER la SLAVE
De la SLAVE la MASTER
SLA
08H
DATA
DATA
40H
50H
DATA
A/
58H
SLA
cu un START REPETAT
10H
A/
adresa slave
La modul
MST/TRX
48H
A sau
A/
Alti MST
continua
38H
in continuare ca SLAVE
68H
Alti MST
continua
38H
Alti MST
continua
78H
80H
La starile corespunzatoare
in modul SLAVE
De la MASTER la SLAVE
De la SLAVE la MASTER
SLA
DATA
60H
DATA
80H
P sau
S
80H
A 0H
A/
P sau
S
este NO T_ACK
88H
Arbitrare pierduta ca
MASTER si adresare
ca SLAVE
A/
68H
Receptie adresa
generala (ADR_GEN)
Adresa
generala
70H
DATA
90H
DATA
P sau
S
90H
A 0H
A/
P sau
S
98H
78H
De la MASTER la SLAVE
De la SLAVE la MASTER
SLA
08H
A 8h
DATA
DATA
DATA
B8H
A/
P sau
S
C 0H
A
Ultimul octet de date transmis
Comuta in modul SLAVE neadresabil
( bitul AA in S1CON este "0" )
De la MASTER la SLAVE
De la SLAVE la MASTER
C 8H
18H
20H
28H
30H
38H
STAREA
MAGISTRALEI I2C
SI A INTERFETEI
SIO1
START a fost
transmis
START REP. a fost
transmis
SLA+W a fost
transmis; ACK a
fost receptionat
SLA+W a fost
transmis;
NOT_ACK a fost
receptionat
Arbitrare pierduta
in SLA+R/W sau
octetii de date
Incarca
DATA
Nu
Nu
1
0
0
1
0
0
X
X
Nu
Incarca
DATA
Nu
Nu
1
0
0
1
0
0
X
X
Nu
Incarca
DATA
Nu
Nu
1
0
0
1
0
0
X
X
Nu
Incarca
DATA
Nu
Nu
1
0
0
1
0
0
X
X
Nu
Nu
Nu
URMATOAREA ACTIUNE A
INTERFETEI SIO1
SLA+W va fi transmis
ACK va fi receptionat
Identic anterior
SLA+W va fi transmis
SIO1 va comuta in modul
MST/REC
DATA va fi transmisa
ACK va fi receptionat
START REP. va fi transmis
STOP va fi transmis
Fanionul STO va fi sters
STOP urmat de un START
vor fi transmise
Fanionul STO va fi sters
DATA va fi transmisa
ACK va fi receptionat
START REP. va fi transmis
STOP va fi transmis
Fanionul STO va fi sters
STOP urmat de un START
vor fi transmise
Fanionul STO va fi sters
DATA va fi transmisa
ACK va fi receptionat
START REP. va fi transmis
STOP va fi transmis
Fanionul STO va fi sters
STOP urmat de un START
vor fi transmise
Fanionul STO va fi sters
DATA va fi transmisa
ACK va fi receptionat
START REP. va fi transmis
STOP va fi transmis
Fanionul STO va fi sters
STOP urmat de un START
vor fi transmise
Fanionul STO va fi sters
Magistrala I2C va fi cedata
SIO1 va intra in modul sclav
neadresabil
START va fi transmis cind
magistrala devine libera
STAREA
MAGISTRALEI I2C
SI A INTERFETEI
SIO1
START a fost
transmis
START REP. a fost
transmis
Incarca
SLA+R
Incarca
SLA+R
Incarca
SLA+W
Nu
Nu
Nu
1
0
0
0
0
0
X
0
Nu
SLA+R a fost
transmis;
NOT_ACK a fost
receptionat
Nu
Nu
1
0
0
1
0
0
X
X
Nu
DATA a fost
receptionata; ACK
a fost returnat
Citeste
DATA
Citeste
DATA
Citeste
DATA
Citeste
DATA
Citeste
DATA
38H
Arbitrare pierduta
in NOT_ACK
40H
SLA+R a fost
transmis; ACK a
fost receptionat
48H
50H
58H
DATA a fost
receptionata;
NOT_ACK a fost
returnat
URMATOAREA ACTIUNE A
INTERFETEI SIO1
SLA+R va fi transmis
ACK va fi receptionat
Identic anterior
SLA+W va fi transmis
SIO1 va comuta in modul
MST/TRX
Magistrala I2C va fi cedata
SIO1 va intra in modul sclav
START va fi transmis cind
magistrala devine libera
DATA a fost receptionata
NOT_ACK va fi returnat
DATA a fost receptionata
ACK va fi returnat
START REP. va fi transmis
STOP va fi transmis
Fanionul STO va fi sters
STOP urmat de un START
vor fi transmise
Fanionul STO va fi sters
DATA a fost receptionata
NOT_ACK va fi returnat
DATA a fost receptionata
ACK va fi returnat
START REP. va fi transmis
STOP va fi transmis
Fanionul STO va fi sters
STOP urmat de un START
vor fi transmise
Fanionul STO va fi sters
68H
70H
78H
80H
88H
90H
STAREA
MAGISTRALEI I2C
SI A INTERFETEI
SIO1
SLA+W proprie a
fost receptionata;
ACK a fost
returnat
Arbitrare pierduta
in SLA+R/W ca
master; SLA+W
proprie a fost
receptionta; ACK
returnat
ADR_GEN a fost
receptionata; ACK
a fost returnat
Arbitrare pierduta
in SLA+R/W ca
master; ADR_GEN
a fost receptionta;
ACK returnat
Anterior adresat
cu SLA proprie;
DATA a fost
receptionata; ACK
a fost returnat
Anterior adresat
cu SLA proprie;
DATA a fost
receptionata;
NOT_ACK a fost
returnat
Anterior adresat
cu ADR_GEN;
DATA a fost
receptionata; ACK
a fost returnat
URMATOAREA ACTIUNE A
INTERFETEI SIO1
Nu
DATA va fi receptionata
NOT_ACK va fi returnat
DATA va fi receptionata
ACK va fi returnat
DATA va fi receptionata
NOT_ACK va fi returnat
DATA va fi receptionata
ACK va fi returnat
Nu
Nu
Nu
Nu
Nu
Nu
Nu
Citeste
DATA
Citeste
DATA
Citeste
DATA
Comuta in modul
SLV_N_ADR; nu recunoaste
SLA proprie sau ADR_GEN
Citeste
DATA
Citeste
DATA
Citeste
DATA
Citeste
DATA
Citeste
DATA
Comuta in modul
SLV_N_ADR; recunoaste
SLA proprie; ADR_GEN este
recunoscuta daca
S1ADR.0=1
Comuta in modul
SLV_N_ADR; nu recunoaste
SLA proprie sau ADR_GEN
START va fi generat cind
magistrala devine libera
Comuta in modul
SLV_N_ADR; recunoaste
SLA proprie; ADR_GEN este
recunoscuta daca
S1ADR.0=1
START va fi generat cind
magistrala devine libera
DATA va fi receptionata si
NOT_ACK va fi returnat
DATA va fi receptionata si
ACK va fi returnat
DATA va fi receptionata
NOT_ACK va fi returnat
DATA va fi receptionata
ACK va fi returnat
DATA va fi receptionata
NOT_ACK va fi returnat
DATA va fi receptionata
ACK va fi returnat
si
si
si
si
si
si
si
si
DATA va fi receptionata si
NOT_ACK va fi returnat
DATA va fi receptionata si
ACK va fi returnat
98H
A0H
Anterior adresat
cu ADR_GEN;
DATA a fost
receptionata;
NOT_ACK a fost
returnat
STOP sau START
REP. au fost
receptionati
Identic cu
starea
88H
0
0
1
1
0
0
0
0
0
0
0
0
0
1
0
1
Nu
Nu
Nu
Nu
0
0
1
1
0
0
0
0
0
0
0
0
0
1
0
1
B0H
B8H
C0H
C8H
STAREA
MAGISTRALEI I2C
SI A INTERFETEI
SIO1
SLA+R proprie a
fost receptionata;
ACK a fost
returnat
Arbitrare pierduta
in SLA+R/W ca
master; SLA+R
proprie a fost
receptionta; ACK
returnat
DATA in S1DAT a
fost transmisa;
ACK a fost
receptionat
DATA in S1DAT a
fost transmisa;
NOT_ACK a fost
receptionat
Ultima DATA in
S1DAT a fost
transmisa; ACK a
fost receptionat
Citeste
DATA
Citeste
DATA
Nu
Nu
Nu
Nu
Nu
Nu
Nu
Nu
0
0
1
1
0
0
0
0
0
0
0
0
0
1
0
1
URMATOAREA ACTIUNE A
INTERFETEI SIO1
Ultima DATA va fi transmisa
si ACK va fi receptionat
DATA va fi transmisa si ACK
va fi receptionat
Ultima DATA va fi transmisa
si ACK va fi receptionat
DATA va fi transmisa si ACK
va fi receptionat