Documente Academic
Documente Profesional
Documente Cultură
1. Tema proiectului
sau
SI = 1;
snt instrucii valide.
Pentru interfaa cu dispozitivele de intrare-ieire presupunem c snt disponibile
dou funcii de bibliotec care au urmtoarele prototipuri:
unsigned char citeste(void);
void scrie(unsigned char);
Interfaa serial I2C (notat SIO1) permite conectarea microcontrolerului 80C552 la o
magistral I2C care utilizeaz doar dou linii, SDA (linia de date) i SCL (linia de ceas),
pentru transferul informaiei ntre dispozitivele conectate la magistral. Principalele
caracteristici ale acesteia snt :
transfer bidirecional ntre dispozitive master i sclav
magistral multimaster, fr un master central
este adresat prin octetul SLA+W de un master transmitor. n continuare bitul SI este
setat i un numr de stri snt posibile (codul lor este n registrul S1STA). n modul sclav
receptor se poate ajunge i din modul master dac SIO1 pierde arbitrarea pentru acces
la magistral (vezi starile 68H i 78H).
Dac bitul AA este resetat n timpul unui transfer, SIO1 va returna un bit
NOT_ACK dup urmtorul octet de date; n continuare SIO1 nu i va mai recunoate
propria adres sau adresa general. Totui, magistrala este monitorizat i revenirea la
recunoaterea adreselor poate fi fcut prin setarea bitului AA (bitul AA poate fi, deci,
folosit pentru izolarea temporar de magistral).
break;
case 0x50://tasta a fost receptionata; ACK returnat
key=S1DAT;
AA=0;
STA=0;
STO=0;
break;
case 0x58://tasta a fost receptionata; NOT_ACK returnat
STA=1;
STO=0;
break;
}
SI=0;//resetare SI
}
}
}
void main()
{
lcd_InitDisplay();//initializarea afisajului LCD
initializare();//initializarea valorilor variabile
while(1)
{
master_send();//se trimite la slave
master_receive();//se receptioneaza de la slave
}
}
CR1=0;
CR2=0;
}
//trimitere tasta incrementata
void slave_send()
{
S1ADR=slv<<1; //adresa slave
while (1)
{
if (SI) //testare SI
{
switch(S1STA) //aici se analizeaza starea curenta
{
case 0x0: //eroare de comunicatie pe bus
lcd_Write(1, "*"); //se afiseaza caracterul *
break;
case 0xA8: //SLA+R receptionat; ACK receptionat
S1DAT=key; //data transmisa
STO=0;
AA=1;
break;
case 0xB0: //arbitrare pierduta
break;
case 0xB8: //data transmisa; ACK este receptionat de la master
S1DAT=key;
STO=0;
AA=1;
break;
case 0xC0: //data transmisa; NOT_ACK receptionat
STA=0;
STO=0;
AA=1;
break;