Sunteți pe pagina 1din 87

Arhitecturi de sisteme incorporate

Microcontrolere si sisteme
integrate

Microchip AVR 8 biți


Comunicația serială (generalități)
• RS-232, RS422/485, U(S)ART si comunicația
serială asincronă
• SPI, TWI (I2C), USI, comunicația serială sincronă
1
Un exemplu de sistem incorporat (un controler pentru o
“mașină” de vânzare) care, pentru a comunica cu alte
sisteme incorporate utilizează, printre altele, mai multe tipuri
de comunicație serială:
- 3 conexiuni de comunicație punct la punct (RS-232)
- 1 conexiune de comunicație multipunct (RS-485)
Ambele standarde menționate , RS-232 si RS-485, sunt
utilizate in comunicațiile seriale de date, asincrone sau
sincrone.

2
EIA RS-232C(F) – este un standard electric si
mecanic
Electric el specifică niște nivele logice (logic levels), in logică negativă (unde
nivelul de “1” este mai negativ decât cel de “0”).
Mecanic el specifică tipul de conector utilizat si pinii acestora asociați unor semnale.

Așa arată, ca tensiune, o comunicație serială asincronă cu nivele logice RS-232

Nivelul “0” sau L se cheamă


“Space” si este pozitiv ≥ 3V
Regiune nedeterminata,
nu avem un nivel logic RS-232

Nivelul “1” sau H se cheamă


“Mark si este negativ ≤ - 3V

Primul bit de date serializat este cel mai puțin semnificativ (LSB)
Caracterul ASCII (7 biti) emis este ‘A’ adică 0x41 3
RS-232 este un standard cu semnalizare
“asimetrică” (la fel ca la porțile obișnuite), pentru
legături punct la punct
- Ecartul (diferența) mare intre cele doua nivele RS-232 (H si L) asigură
margini mari de zgomot si deci potențial imunitate mare la perturbații
- Exista circuite emițătoare E (drivers, transmitters) RS-232 si receptoare
R (receivers) RS-232
- Exista si circuite care conțin si emițătoare si receptoare (transceivers)
- Si unele si altele sunt circuite inversoare, iar emițătoarele trebuie să aibă
un sistem de surse de alimentare bipolare (V+ si -V) prin raportare fata
de masa circuitului
- Pentru o legătură de date unidirecțională avem nevoie de un emițător si un receptor
- Pentru o legătură de date bidirecțională avem nevoie de 2 emițătoare si 2
receptoare
- Este o legătură punct la punct: putem avea doar o singură ieşire
conectată la o linie de semnal (si una sau mai multe intrări): două ieşiri RS-
232 NU pot fi legate împreună!

4
Cum se folosește RS-232 (conexiunea fizica)
Emițătorul si Receptorul sunt
întotdeauna inversoare, lucru de care
trebuie ținut cont dacă utilizăm o altă
soluție hardware, decât cea a unor circuite
standard (gen MAX232, ca mai jos),
pentru realizarea E(mitătorului) sau
RS-232 R(eceptorului).
E R Cele 2 sisteme conectate trebuie să aibă
TTL o masă comună GND (al 3-lea fir)!
TTL

GND

RS-232
R E
RS-232
TTL TTL

GND TTL/CMOS
5
RS-485 / RS-422 sunt standarde cu semnalizare
“diferențială”, pentru legături punct la punct (RS-422) sau
multipunct (RS-485): sunt standarde electrice, nu si
mecanice
- RS-422 si RS-485 au in comun aceleași nivele logice
diferențiale
-Pentru aceste standarde nu exista si o specificație mecanica
(conector, pini, ca la RS-232)
- Semnalizarea diferențială oferă potențial imunitate mare la
perturbații (la zgomot electromagnetic de mod comun)
- Avem circuite emițătoare (drivers, transmitters) RS-485 (422)
si receptoare (receivers) RS-485 (422) sau, similar RS-232,
transceivere (transceivers)
- Toate au intrări/ieşiri diferențiale si nu necesită un sistem de
surse de alimentare bipolare
-Pentru o legătură de date unidirecțională avem nevoie de un driver si
un receptor (si 2 fire)
-Pentru o legătură de date bidirecțională avem nevoie de 2 drivere 6si
2 receptoare (si 4 fire)
Standardul RS-422/RS-485: nivelele logice
Principial nu este nevoie
Contează tensiunea intre
de o masă comună intre D si R
cele 2 linii de semnal
dar in realitate de cele mai multe
RS-485!
ori ea există sau trebuie să existe TTL
Zgomotul care apare
pe mod comun este
RS-485 rejectat

TTL TTL

Driverele/emițătoarele si
receptoarele au două borne
TTL de ieșire respectiv intrare
borna inversoare: -, B, o
borna neinversoare: +, A, “ ”

VA - VB < -0.2V => "1"


Emitător Receptor VA - VB > 0.2V => "0"
7
0.2V este si marginea de zgomot!
Standardul RS-422/RS-485: nivelele logice -2

Vin+

Vin-

In figura de mai sus este reprezentat potențialul bornelor Vin+ si Vin-


A fost emis si este recepționat octetul 0xD3 (exemplul este din wikipedia).
Formatul cadrului de biți utilizat pentru comunicația asincrona este :
-1 bit de start,
-8 biți de date,
-1 bit de stop
- fără bit de paritate 8
RS-485 / RS-422, cum se realizează
conexiunea fizică
Pereche fire torsadate

Semnalizare diferențială, legătură punct la punct cu 4 fire, bidirecțională, full-duplex

Semnalizare diferențială, legătura multipunct cu 2 fire, suport half-duplex 9


RS-485 se folosește de obicei pentru implementarea unei
rețele (magistrale) half-duplex
•O topologie tipică este prezentată mai jos
•Există mai multe noduri conectate la o singura pereche de fire , fiecare
având asociat un transceiver (S- emițător, R-receptor).
• Tipic, la un moment dat, doar un nod emite (are ieșirea S activată,
“vorbește”) restul doar recepționează(R “ascultă”): este o configurație tipică
Master-Slave, in care un singur nod poate fi Master (single Master)

Fiecare nod poate fi si producător de Resursa comună folosită pentru


date (in emisie) si consumator de date transmiterea de date sunt cele 2 fire:
(la recepție) avem o magistrală serială (serial bus)
10
Standardele RS-232 si RS-
422/485
• Sunt standarde care specifică un nivel/strat fizic (physical
layer) de comunicatia (serială) de datelor
– Specifică nivelele de tensiune (nivelele logice) si eventual
caracteristicile mecanice ale conexiunilor fizice (conector, pini, etc.)
si
– Tipic, dar nu obligatoriu, pentru utilizarea acestor standarde, datele
sunt transferate ca o serie de biți, o înșiruire de nivele logice, care se
modifică in timp
– Ne putem imagina si un protocol paralel de transfer al datelor, in
pachete de biți disponibili simultan nu secvențial, care sa utilizeze
doar nivelele logice RS-232 sau RS-422/485, nu si conexiunea sau
comunicația seriala
• Codificarea datelor si interpretarea lor este realizată de
software cu suportul unui hardware specific

11
Principiul comunicației seriale asincrone
• Este numită asincronă deoarece nu există un semnal de
ceas explicit, ceasul urmând a fi regenerat intern, pe baza unei
temporizări riguroase
• Datele sunt transmise organizate in cadre de biţi (bit frames)
• Fiecare cadru are un bit de start, mai mulți biți de date,
opțional un bit de paritate pară sau impară si unul sau mai mulți
biți de stop
• Linia de emisie este adusă in “1” si/sau “0”, pe durata unor
intervale de timp succesive bine determinate, fiecare din aceste
intervale de timp (numite si timpi de bit) fiind alocat unor anume
biți dintr-un cadru de biți
• Pe baza cunoașterii poziției predeterminate a acestor biți,
receptorul monitorizează aceste date, “asamblând” valorile de
“1” sau “0” detectate in fiecare interval de timp, intr-un
“container” de dimensiuni corespunzătoare (de cele mai multe
ori un octet)
– Receptorul si emițătorul trebuie să utilizeze ceasuri riguros
“identice” ca frecvență pentru avea intervale de timp “identice” le
emisie si recepție si a putea interpreta corect datele recepționate
12
Comunicația serială asincronă- nivele
logice si formatul cadrului de biți
• Nivelul inactiv (idle) al liniei de emisie este “1” (o să-i corespundă un
mark ca nivel RS-232)
• Emiţătorul semnalează începutul unui cadru printr-o tranzitie din “1”
in “0” (o să-i corespundă un space ca nivel RS-232) pe TxD, adică cu
un bit de start (start bit)
• La intervale de timp regulate (date de rata baud/viteza de transmisie)
emiţătorul oferă biţii de date (data bits), începând cu cel mai puţin
semnificativ (LSB)
• Unul sau doi biţi de stop (stop bit) semnalează sfârşitul cadrului
(linia de emisie revine in “1”), procesul putând fi reluat

TxD

Biţii de date sunt serializaţi începând


Nivelele reprezentate sunt cele (LV)TTL, cu cel mai puţin semnificativ bit: LSB, 0
aşa cum se văd ele pe un pin TxD-ul al MCU. in figura alăturată (unde avem 8 biţi de
Ele trebuie translatate in nivele de un emiţător date)
RS-232 si apoi din nou in TTL cu un receptor 13
RS-232, ajungând la RxD-ul MCU2
Circuite/module dedicate pentru realizarea
comunicației seriale asincrone (si sincrone): U(S)ART
• U(S)ART = Universal Synchronous and Asynchronous serial
Receiver and Transmitter
• Utilizate de sistemele de calcul care trebuie sa realizeze si
sarcini de comunicație seriala
• Inițial au existat niște circuite periferice de sine stătătoare (de
exemplu circuitul 16C550(2) care este doar un UART care
există –într-o forma sau alta- intr-un chipset PC)
• Aceste circuite există acum ca un periferic integrat (un sub-
sistem) la majoritatea microcontrolerelor (chiar dacă nu se
numește așa: de exemplu la MCU NXP/Freescale el se
numește SCI - Serial Communication Interface)
• Este un dispozitiv I/O “standard” care realizează o conversie
de date de tip serie-paralel (la recepție) si paralel-serie (la
emisie)
– El asigură serviciile de bază pentru implementarea unui protocol
serial de comunicație asincron si/sau sincron.
• El este un dispozitiv programabil la care se pot programa caracteristici
cum ar fi: viteza de comunicație(rata baud), organizarea cadrului de biţi,
semnalizare/control erori de comunicație
14
AVR 8 biți: sub-sistemul U(S)ART
• UART sau USART este acum un dispozitiv cvasi-standard
de I/O serială pentru microcontrolerele AVR 8 biți
• Colocvial este numit si port serial
• Toate variantele ATMega, XMEGA ca si unele ATTiny au
ca periferic integrat cel puțin un UART
– Semnalele lor de intrare/ieşire, TxD, RxD si eventual XCK sunt
însă compatibile TTL (sau LVTTL)!
– Pentru interfața cu un dispozitiv RS-232 standard (de exemplu
portul serial al unui PC ) este necesară o adaptare/translație
de nivele (LV)TTL <-> RS-232, realizata cu ajutorul unor
circuite externe de interfață specifice (de exemplu MAX-232)

Observație: Variantele XMEGA au si două circuite USART, care


pe lângă modurile I/O bazate pe interogare si întreruperi suportă
si un mod I/O DMA (cu acces direct la memorie, fără intervenția
unității centrale)

15
AVR 8 biți: componentele U(S)ART-ului

Pentru orice circuit U(S)ART există trei componente


esențiale:
• Emițătorul (transmitter)
– Gestionează generarea fluxului serial de biți pentru
fiecare octet care se dorește emis (are ca sarcină
serializarea unui cadru de biti)
• Receptorul (receiver)
– Gestionează recepția fluxului serial de biți si asamblarea
lor intr-un octet (are ca sarcină de-serializarea unui cadru
de biti)
• Generatorul de ceas (clock generator)
– Generează semnalul de ceas pentru modurile de lucru
sincrone si asincrone (are ca sarcină implementarea
dimensiunii timp a transferului serial al cadrului de biți)

16
AVR 8 biți: conexiunile externe ale
U(S)ART
• Un U(S)ART utilizează doi pini (in modul asincron) pentru
emisie -TxD si recepție- RxD sau trei pini când mai există
încă un pin XCK pentru semnalul de ceas pentru modul
sincron.
– Pinii utilizați (si porturile aferente) sunt diferiți funcție de varianta
de AVR
– Pentru un Atmega 16 sau ATtiny 2313 avem TxD = PD1 si
RxD=PD0
– Dar la un ATMega169 avem RxD=PE1 si TxD=PE0 !
• Acești pini ai portului serial nu mai pot fi utilizați ca I/O de
uz general atâta timp cat ei sunt utilizați pentru comunicația
serială (emisia si recepția este activata)
• Implicit, după un Reset, U(S)ART-ul este configurat in mod
asincron cu emisia si recepția inactive (ele trebuie activate
de utilizator)
• Nu vom discuta aici despre comunicația serială sincronă
(comunicație de tip master-slave), in care se utilizează un
semnal de ceas explicit (pinul XCK – eXternal cloCk)
17
AVR 8 biți: conexiunile externe ale U(S)ART-ului,
exemple

ATmega16
18
AVR 8 biti
U(S)ART-
schema bloc
• Cele 3
registre de
stare si
control,
registrele de
date,
registrul de
ceas si
conexiunile
externe
19
AVR 8 biți U(S)ART: generatorul de
ceas
Rata Baud este specificata Circuit pentru crearea
ca un parametru in UBRR semnalului de ceas pentru
emisie si recepție

Semnal Un semnal extern de ceas este utilizat doar pentru


de ceas comunicația sincrona; dispozitivul care este master
va pune semnal de ceas pe XCK, dispozitivul slave va
asculta semnalul de ceas pe XCK

20
AVR 8 biti U(S)ART: emiţătorul

Pentru pornirea emisiei Registru de deplasare


este necesara “plasarea” paralel-serie, către TxD
unui octet in UDR

Un octet poate sta in “coada” in


Ceas UDR (Transmit) in timp ce alt
octet este serializat (este in
registrul de deplasare )
21
AVR 8 biți U(S)ART: receptorul
Registru de deplasare
Citire octet din UDR când serie-paralel, de la RxD
receptorul indică că este gata

Pana la doi octeţi pot sta “in coadă”


aşteptând să fie citiţi, in timp ce un al
Ceas
treilea este deserializat

22
AVR 8 biti UART : recepția asincronă a
datelor
• Deoarece nu există un semnal explicit de ceas UART-ul trebuie sa includă
subsisteme de refacere a semnalului de ceas (clock recovery) si
reconstruire a datelor (data recovery) pentru a putea realiza recepția
asincronă a datelor seriale.
• Receptorul UART este mai complicat decât emiţătorul!
• Circuitul de refacere a ceasului (clock recovery) este utilizat pentru
sincronizarea ceasului generat intern cu cadrele de biti asincrone care sosesc
pe pinul RxD.
• Circuitul de reconstruire a datelor eșantionează si filtrează trece jos fiecare bit
care sosește, îmbunătățind astfel imunitatea la zgomot a receptorului
• Domeniul de incertitudine in care este posibilă recepția asincronă a datelor
depinde precizia semnalului de ceas generat intern, de rata baud utilizată, de
dimensiunea cadrului ca număr de biți si de cât de des sosesc cadrele de biți
• Există cerințe stricte legate de egalitatea celor frecvențelor de ceas
utilizate la emisie si la recepție, precum si de stabilitatea lor (timp,
temperatura): cerințele sunt cu atât mai stricte cu cat viteza de
comunicație este mai mare 23
AVR 8 biti UART: recepția asincronă a
datelor -2
• Circuitul de refacere a ceasului sincronizează ceasul intern cu
cadrele de biți recepționate serial.
• In figura următoare este ilustrat procesul de eșantionare si
identificare a bitului de start al unui cadru de biți ce va fi
recepționat.
• Există de fapt o mașină secvențială care testează starea intrării si ia decizii
• Rata de eșantionare este de 16 ori rata baud pentru modul “normal” (U2X=0) si
de 8 ori rata baud pentru modul “viteza dublă” (U2X=1).
• “Viteza dublă” duce la dublarea ratei baud, prin reducerea numărului de
eșantioane testate per bit; de exemplu dacă pentru UBRR=23 avem o rată baud
de 9600 Bds cu U2X=0, la același UBRR, dar cu U2X=1 vom avea 19200 Bds

24
AVR 8 biți U(S)ART: registrele de stare
si control
• Pentru majoritatea variantelor de AVR există trei
registre de stare si control a căror denumire
poate fi eventual ușor diferită (a se consulta foaia
de catalog):
– Registrul UCSRA – USART Control and Status
Register A
• Conține in majoritate biți de stare, dar exista si doi biți
control
– Registrul UCSRB – USART Control and Status
Register B
• Conține in majoritate biti de control, dar exista si doi biţi de
date
– Registrul UCSRC – USART Control and Status
Register C
• Conține numai biţi de control

25
AVR 8 biți U(S)ART: seriile Tiny si Mega
modernizate

In foile de catalog ale variantelor modernizate apare o nouă schemă bloc care ilustrează
funcționalitățile disponibile - aceleași ca la variantele clasice.
Exista însă si unele noi cum ar fi:
- suport pentru comutarea sensului la RS-485 half duplex (pin XDIR)
- implementarea unui slave LIN bus (suport pentru un cadru de biti Break)
- implementare unui mod de comunicare in infrarosu (IRCOM- InfraRed COmmunication Mode )
compatibil IrDA1.4
- integrarea cu Event System
Există acum 15 registre de comandă, stare si date asociate sistemului.
26
Denumirile unora din registre s-au modificat, deci obligatoriu trebuie consultată foaia de catalog.
AVR 8 biți U(S)ART: structura
registrelor de stare si control

27
AVR 8 biți U(S)ART: registrul de date UDR
• Din punct de vedere al utilizatorului/
programatorului există un singur registru de
date, de 8 biti (dar fizic există două registre
buffer separate RXB si TXB) :
• Registrul UDR – USART Data Register
– Daca este accesat in scriere avem emisie: UDR=
data;
– Daca este accesat in citire avem eventual
recepție: data =UDR;

28
AVR 8 biti U(S)ART: iniţializarea
UART-ului
• Etapele utilizării unui UART sunt cel puțin următoarele:
– Se stabilește (se programează) rata baud dorită, funcție de
frecventa ceasului sistem utilizat
– Se stabilește formatul cadrului de biţi serial
– Se activează recepția si/sau emisia, eventual se activează si
întreruperile aferente
– Apoi se poate realiza emisia si recepția de octeți (“caractere”)
• Operațiile de emisie si recepție propriu-zise pot fi bazate
pe:
– interogarea (polling) unor indicatoare (biți de stare) din
registrele de stare ale UART-ului (într-o buclă de așteptare)
așteptând schimbarea stării lor sau
– utilizarea sistemul de întreruperi si a întreruperilor generate
de schimbarea de stare a acestor indicatoare
– Utilizarea DMA, numai la XMEGA
• ATENTIE: aceiași “inițializare” trebuie realizată si la
partenerul de “conversație” al USART-ului: trebuie să
avem riguros aceiași rată baud si același format al
cadrului
29
Viteza de comunicație serială asincronă: rata
Baud
• Rata baud reprezintă, exprimat colocvial (provenind dintr-o
traducere ad-literam), viteza cu care sunt transmişi/recepţionaţi biții:
rata Baud, RB: din engleza unde rate = “ceva” /timp , adică viteză
• Este exprimată in biți per secundă (bps) sau Bauds (Bds)
• In acest context si aici 1Baud=1bps, dar in alt context acest lucru
nu este neapărat adevărat
• Există un set de valori de rate Baud standard:
110, 150, 300, 600, 900, 1200, 2400, 4800, 9600, 14400, 19200,
38400, 57800..

Inversul ratei Baud adică intervalul de timp alocat unui bit, cat “durează
bitul”, este timpul de bit (bit time) Tbit=1/RB [sec].
De ex. dacă RB=9600Bd, Tbit=1/9600=104usec
Știind numărul total tuturor biților se poate calcula cat durează in total
emisia si/sau recepția unui caracter 30
AVR 8 biți UART: parametrul rată Baud (viteza
de comunicație)
• Reprezintă valoarea care va fi programată in perechea de
registre UBRR generatorului de ceas, compusa dint un octet
superior (UBRRH) si unul inferior (UBBRL)
• Pentru determinare lui se poate consulta tabela din foaia de
catalog sau se utilizează formula dată in aceiași foaie de catalog
• Valoarea UBRR (parametru rate baud) este un număr in
domeniul de la 0 la 4095
– fosc este frecvența ceasului sistem (oscilatorului de ceas)

– Din tabelele de pe slide-urile următoare (foi de catalog):


• 2400 Baud cu ceas de 4 MHz , prb = 103
• 9600 Baud cu ceas de 1MHz, prb = 6 (nu e însă si bine deoarece
abaterea este foarte mare!)

Frecvența ceasului sistem fosc se alege si din acest considerent!


Acest este si motivul pentru care oscilatorul de ceas este uneori ales având valori
“exotice”, cum ar fi 7.3728 MHz si nu valori “întregi” gen 7 MHz sau 8 MHz
31
( vezi tabel, astfel se pot obține 11 rate baud standard toate cu eroare de 0%)
AVR 8 biți UART: parametrul rata baud, tabele

Dacă eroarea (domeniul de incertitudine) este mai mare de cca. 2% comunicația


devine nesigură, crescând mult numărul de erori de comunicație, etc. 32
AVR 8 biți UART: parametrul rata baud, tabele - 2

Pentru AVR 8 biti ceasul sistem trebuie să fie intr-o variantă stabilizată
cu rezonator cu cuarţ!
Numai aşa sunt îndeplinite cerinţele legate de precizie si stabilitate (temperatura si timp)
pentru frecventa generatorului de ceas al UART-ului 33
Stabilitatea si precizia unui oscilatorul intern sau extern RC sunt insuficiente!
AVR 8 biți UART: exemplu de programare
a ratei Baud (in limbaj de asamblare)

.equ prb = 103; parametru rata Baud


ldi R17, high(brp)
ldi R16, low(brp) Parametrul depinde
out UBRRH, R17 de frecventa ceasului
sistem, de rata baud
out UBRRL, R16 dorita si de starea
bitului U2X
In limbaj de asamblare operatorii high () si low () returnează octetul superior si
respectiv inferior al unei valori presupuse ca exprimata pe 16 biti
In acest caz, in final, in UBRRH se va încărca 0, iar in UBRRL se va încărca 103,
De ce ?
34
AVR 8 biți UART: exemplu de
programare a ratei Baud (in limbaj C )

/*Pt. o rata de 9600 Bauds, cu U2X=0


pt. fosc=4MHz vom avea UBRRR = 25
(sau 51 daca U2X=1) deci UBRRL =25
si UBRRH =0 */
UBRRH = 0;
UBRRL = 25;

35
AVR 8 biți UART: formatul cadrului de biți
serial
• Întotdeauna se începe cu un bit de start (St)
• Urmează 5 până la 9 biți de date, începând cu cel mai puțin
semnificativ (pondere 0)
• Dacă paritatea este activată, un bit de paritate (programabil ca
bit de paritate pară - even sau impară - odd) va fi inserat in
continuare
• Urmează cel puțin un bit de stop (Sp) care este necesar pentru
a finaliza cadrul
– Următorul cadru poate începe imediat după bitul de stop sau linia
poate sta un interval de timp neprecizat in stare inactivă (idle)

Cadru biţi

Inactiv Inactiv sau


următorul
bit de start
Un cadru poate avea minim 7 biţi si maxim 13 biţi
36
AVR 8 biți UART: programarea formatului
cadrului de biți serial
• Programarea se face prin intermediul registrului
UCSRC
– bit 7: URSEL (selectarea registrului, 1=UCSRC )
– bit 6: UMSEL (selectare mod, 0=mod asincron)
– biţi 5:4: UPM1:0 (mod paritate)
• 00 fără paritate, 10 paritate pară, 11 paritate impară
– bit 3: USBS (nr. biți de stop, 0= 1 bit de stop)
– biţi 2:1: UCSZ1:0 (nr. biţi de date, 11 = 8 biţi de data)
• Mai există încă un bit in UCSRB2 (UCSZ2) care este setat la
1 pentru 9-biti de date
– bit 0: UCPOL (polaritate ceas, contează doar pentru
modul sincron)

37
Algoritmul utilizat pentru calculul bitului de
paritate
• Bitul de paritate pară (even) este calculat realizând un
XOR (SAU-EXCLUSIV) intre biții de date.
• Dacă se folosește paritatea impară (odd) rezultatul
XOR-ului este inversat.
• Relaţiile intre bitul de paritate si biţii de date sunt:
Ppara = dn ⊕ dn-1⊕ … ⊕ d1 ⊕ d0 ⊕ 0
Pimpara = dn ⊕ dn-1⊕ … ⊕ d1 ⊕ d0 ⊕ 1
Ppara Bitul de paritate folosind paritatea pară
Pimpara Bitul de paritate folosind paritatea impară
dn al n-lea bit de date
• Dacă este utilizat, bitul de paritate trebuie plasat intre
ultimul bit de date si primul bit de stop al cadrului
serial. 38
AVR 8 biți UART: configurarea tipică a cadrului serial
(in limbaj de asamblare)

• Configurare in mod asincron, cu paritate


pară, cu 2 biţi de stop:
ldi R16, 0b10101110
out UCSRC, R16
neutilizat
URSEL=1
pt. a scrie in 11 = 8 biţi date
UCSRC 1= 2 biti stop

0=Mod asincron
10 = paritatea para

Aceasta modalitate de specificare a valorilor de bit nu este recomandată, fiind foarte


puţin lizibilă: folosiţi numele predefinite ale biţilor! 39
AVR 8 biți UART: configurarea tipică a cadrului
serial de biti (in limbaj C)
/* Dorim 8 biti de date, 1 bit de stop, fara
paritate, adica 8N1 */
UCSRB &= ~(1 << UCSZ2);
UCSRC = ( (1 << UCSZ0) | (1 << UCSZ1));

40
AVR 8 biți UART: activarea emisiei si a
recepției (in limbaj de asamblare)

• Se setează biții corespunzători activării


emisiei si recepției, ștergându-i pe ceilalți:
ldi R16, (1<<RXEN)|(1<<TXEN)
out UCSRB, R16
• Sau se setează doar acești biți, lăsându-i pe
ceilalţi nemodificați:
sbi UCSRB, RXEN
sbi UCSRB, TXEN

41
AVR 8 biți UART: activarea emisiei si a
recepţiei (in limbaj C)
….
//Activeaza transmisia si receptia
UCSRB | = (1<<RXEN)|(1<<TXEN);

//Sau activeaza numai transmisia
UCSRB | = 1<<TXEN;
……

Exemplele care urmează de utilizare a emisiei si recepţiei


sunt bazate pe interogarea/testarea indicatorilor de stare
si asteptare (“polling”)
Cealaltă alternativă este utilizarea întreruperilor si va fi
ilustrată in alt curs
42
AVR 8 biți UART: emisia unui octet sau mai
corect a unui cadru de biti (in limbaj de
asamblare)
• Emisia unui octet este iniţiată ;octetul de emis este
printr-o scriere in UDR
• Trebuie aşteptat până când ;in R16
registrul de date este gol (până transmit:
când s-a terminat serializarea
caracterului curent ), si de aici o ;asteapta eliberarea
buclă de aşteptare ;registrului de
– Instrucţiunea sbis realizează
saltul (sare peste instrucţiunea ;date
următoare) dacă bitul testat din
registrul I/O este setat (=1) sbis UCSRA, UDRE
– Aşteptăm până când bitul rjmp transmit
UDRE din registrul UCSRA se
face “1” ;start transmisie
– Apoi putem emite octetul din out UDR, R16
R16

43
AVR 8 biți UART: emisia unui octet (in
limbaj C)

/* Se asteapta eliberarea bufferului de
emisie, functia este blocanta, nu se
iese din while decat atunci cand bitul
UDRE =1*/
while ( !( UCSRA & (1<<UDRE)) )
;
/* Dupa eliberare se pune data in buffer
si se incepe emisia */
UDR = data;
…..
44
AVR 8 biți UART: recepția unui octet (in
limbaj de asamblare)
• Octeții recepționați sunt
memorați temporar intr-o
“coadă” – un buffer FIFO
– bufferul USART-ului AVR are 2 ;Copiaza caracterul
octeți, FIFO cu 2 nivele
(ATMega16) ;receptionat in R16
• Indicatorul “recepție completă” receive:
RXC este setat atunci când
există un octet in așteptare ;asteapt data
(disponibil) in buffer sbis UCSRA, RXC
– Așteaptă până când RXC se rjmp receive
face “1”
– Apoi putem citi in R16 pe UDR ;ia octetul din
– Citirea lui UDR va șterge pe ;buffer
RXC atunci când bufferul s-a
golit in R16, UDR

45
AVR 8 biți UART: recepția unui octet
(in limbaj C)
unsigned char car;
/* Se asteapta pana avem ceva
receptionat in buffer, functia va fi
blocanta deorecea se asteapta in
while pana cand bitul RXC =1 */
while ( !(UCSRA & (1<<RXC)) );
/*Se citeste caracterul receptionat */
car=UDR;

46
AVR 8 biți U(S)ART: registrul de date
UDR, biții UDRE si RXC
• Scrierea in UDR memorează octetul in bufferul
de emisie al U(S)ART-ului si inițiază transferul
serial
– Începerea transferului va șterge bitul de stare UDRE
(Usart Data Register Empty)
• Registrul de date nu mai este gol
– UDRE va fi setat atunci când octetul este mutat in
registrul de deplasare paralel-serie si practic UDR
este gol putând fi scris următorul octet
• Citirea lui UDR înlătură si returnează următorul
octet din bufferul de recepție al U(S)ART-ului
– Dacă bufferul FIFO de recepție s-a golit si bitul
RXC- Receive Complete din UCSRA va fi șters (=0)

47
AVR 8 biți UART: UDR- registrul de
date, al 9-lea bit

Eventualul al 9-lea bit de date se gaseste in alt registru, registrul UCSRB:


bitii TXB8 (emisie) si RXB8 (recepţie)

48
AVR 8 biți U(S)ART: dezactivarea
emisiei
• Pentru a dezactiva emisia (emițătorul de fapt) trebuie
șters bitul TXEN ( =0) din registrul UCSRB
– De menționat ca dupa reset emisia este implicit dezactivata
ea trebuind sa fie activata de utilizator daca se dorește
utilizata, făcând TXEN=1
• Octeții care se află deja in așteptare pentru a fi emiși,
vor fi emiși, înainte de dezactivarea propriu-zisă a
emițătorului
– Bitul TXC (Transmit Complete) va fi setat (=1) atunci când
bufferul de emisie TXB este gol si registrul de deplasare
utilizat pentru emisie este gol
• Odată ce emițătorul a fost dezactivat, pinul TxD
poate fi utilizat ca un pin I/O normal din portul
PORTD (la ATMega 16 )

49
AVR 8 biți U(S)ART: dezactivarea
recepției

• Pentru dezactivarea recepției trebuie șters bitul


RXEN (=0)
– De menționat ca după reset recepția este implicit
dezactivata ea trebuind sa fie activata de utilizator
daca se dorește utilizata, făcând RXEN=1
• Receptorul este imediat dezactivat si
funcționalitatea lui RxD este redată portului I/O,
pinul respectiv putând fi utilizat ca un pin I/O
normal
– Toate datele recepționate aflate in acel moment
încă in bufferul FIFO de recepție sau in tranzit vor
fi pierdute!
50
AVR 8 biți U(S)ART: indicatorii de
eroare
• Acest set de biți este localizat in registrul UCSRA si
au următoarea semnificație:
– FE: Framming Error (eroare de încadrare)
• =1 indică că primul bit de stop nu a fost găsit/detectat
– DOR: Data OverRun error (eroare de suprascriere)
• =1 indică că octetul recepţionat nu a putut fi plasat/transferat in
bufferul de recepţie, dar intre timp a început recepţia unui alt
octet (octetul anterior fiind suprascris, deci pierdut)
– PE: Parity Error (eroare de paritate)
• =1 indică o eroare de paritate in data recepționată
• Paritate pară (even) înseamnă un număr par de “1” in data
recepționată; impară (odd) un număr impar de “1’-uri

51
AVR 8 biți U(S)ART: citirea indicatorilor
de eroare
• Erorile sunt si trebuie sa fie memorate împreună/sincron cu datele
recepţionate in bufferul FIFO de recepţie: un set de indicatori trebuie sa fie si
este asociat unui anumit octet receptionat
• Din acest motiv indicatorii de eroare (din UCSRA) trebuie citiţi înainte de a
citi datele care au pozitionat eventual acesti indicatori:

in R17, UCSRA
in R16, UDR

Sau in C:
….
eroare=UCSRA;
data =UDR;
….
• Tipic se pot verifica toţi biţii individuali, setarea oricăruia din ei însemnând o
eroare de recepţie, de exemplu (exemplu in limbaj de asamblare):
andi R17, (1<<FE)|(1<<DOR)|(1<<PE);oricare din ei ar fi in ‘1’
brne ReceiveError ;salt la o rutina de tratare a erorilor

52
AVR 8 biți U(S)ART: registrele
UCSRC si UBRRH (ATMega)
• Aceste registre de I/O asociate U(S)ART-ului pun o problemă
utilizatorului ele având alocată aceiași adresă I/O in spațiul dedicat
din memoria de date AVR
• De aici va rezulta o anumită constrângere si modalitate specifică de
a le accesa la scriere sau citire
• De fapt registrul UCSRC poate fi folosit ca atare sau ca UBRRH
selecția făcându-se cu ajutorul bitului URSEL din acest registru
• Când se dorește sa se scrie in UBRRH, cel mai semnificativ bit numit
URSEL (bitul 7) trebuie să fie “0”
– Dar UBRR este exprimat pe 12 biti (8 in UBRRL si 4 in UBRRH) astfel ca
UBRR are valoarea maximă de 4095, si această cerință este realizată
practic automat, bitul 7 din UBRRH fiind intotdeauna “”0”
• Când se dorește sa se scrie in UCSRC, bitul URSEL trebuie a fie
setat (“1”)
• Vezi slide-ul urmator
• Citirea acestor registre este mai puțin necesară in practică, dar este
posibilă

53
AVR 8 biți U(S)ART: registrele
UCSRC si UBRRH (ATmega) -2

54
AVR 8 biți U(S)ART: exemplu de interfaţă RS-
232 full-duplex

Pinii PD4 (XCK) si PD5


sunt folosiţi pentru
comunicaţia serială
sincronă (mai puţin
utilizată), caz in care intre cele
două sisteme se va vehicula
si un semnal de ceas 55
AVR 8 biți U(S)ART : exemple de funcții de bază
pentru utilizarea portului serial, inițializarea

void USART_Init(unsigned int baudrate);


char Usart_Rx(void);
void Usart_Tx(char);

/*initializare uart
rata baud primita ca un argument intreg fara semn */
void USART_Init(unsigned int baudrate)
{
/* Seteaza rata baud */
UBRRH = (unsigned char) (baudrate>>8);
UBRRL = (unsigned char) baudrate;
/* Activare 2x viteza dubla */
UCSRA = (1<<U2X);

/* activeaza receptia si emisia, precum si intreruperile aferente*/


UCSRB = (1<<RXEN)|(1<<TXEN)|(0<<RXCIE)|(0<<UDRIE);

/* Mod asincron, 8N1: 8biti de date, 1 bit de stop, fara paritate*/


UCSRC = (0<<UMSEL)|(0<<UPM0)|(0<<USBS)|(3<<UCSZ0)|(0<<UCPOL);
}
56
AVR 8 biți U(S)ART : exemple de funcții de bază pentru
utilizarea portului serial, scrierea si citirea in mod polling
/*emite caracterul primit ca argument
functie blocanta, se asteapta terminarea emisiei */
void Usart_Tx(char data)
{
while (!(UCSRA & (1<<UDRE)));
UDR = data;
}
/* returneaza caracterul receptionat
functie blocanta, se asteapta pana se receptioneaza un caracter
*/
char Usart_Rx(void)
{
while (!(UCSRA & (1<<RXC)));
return UDR;
}
/* doar initializarea */
int main (){
..
USART_Init(12); /* Baud rate = 9600bps, un exemplu
prost de programare! */
… 57
}
AVR 8 biți U(S)ART : inițializarea sistemului de
întreruperi pentru utilizare a portului serial
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 4000000
#define USART_BAUDRATE 9600
/*o relatie de calcul pentru rata baud functie de frecv.
ceasului sistem*/
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
int main (void)
{ /* Activare emisie si receptie */
UCSRB |= (1 << RXEN) | (1 << TXEN);
UCSRC |= (1 << UMSEL) | (1 << UCSZ0) | (1 << UCSZ1); /*
format 8N1*/
UBRRH = (BAUD_PRESCALE >> 8); /* Incarca octet superior UBRR
*/
UBRRL = BAUD_PRESCALE; /* Incarca octet inferior UBRR */
UCSRB |= (1 << RXCIE); /* Activeaza intreruperea USART
Recieve Complete (USART_RXC) */
sei(); /* Activeaza global intreruperile */

for (;;) /* O bucla infinita */


{ ; /* In care nu facem nimic, “ecoul” unui caracter
receptionat este facut in rutina de tratare a intreruperii */
}
}
58
AVR 8 biți U(S)ART : citirea portului serial
utilizând întreruperile
/*Exemplu de rutina de tratare a
intreruperii aferente portului serial,la
receptia unui caracter, indicator RxC =1
Rutina realizeaza “ecoul” unui caracter
receptionat pe portul serial care va fi
emis pe acelasi port */
ISR(USART_RX_vect)
{
char OctetReceptionat;
OctetReceptionat = UDR; /* Citesc
octetul receptionat in variabila temporara
*/
UDR = OctetReceptionat; /* Emite
“inapoi” octetul receptionat */
}
59
AVR 8 biți U(S)ART: exemplu de interfață
RS-485 half-duplex (2 fire)

RS-485 TTL

Pinul PD6 este folosit ca o


ieşire care activează/
inactivează emisia sau
recepţia:
PD6= /RE=DE
PD6=“0” recepţie activă,
emisie inactivă
PD6=“1” recepţie inactivă,
emisie activă
60
AVR 8 biți U(S)ART: comutarea emisie/recepție pentru
o comunicație RS-485 half-duplex
In mod tipic la inițializare (după reset) trebuie să ne poziționăm pe recepție,
urmând să comutăm pe emisie când este cazul si înapoi pe recepție.
Mai jos un exemplu de funcție care realizează comutarea modului pentru
transceiver:
#define RX_MODE 0
#define TX_MODE 1
void switch_mode(char mode) {
if (mode == RX_MODE)
{
PORTD &= ~(1<<PD6);//PD6=0
}
else
{
PORTD |= (1<<PD6); //PD6=1
}
}
..//este apelata astfel
switch_mode (RX_MODE); // la initializare
…..
switch_mode (TX_MODE); //inainte de a emite
//aici se va emite un caracter

switch_mode (RX_MODE); //pentru a trece inapoi pe receptie
In realitate comutarea nu este atât de simplă cum pare, mai există diverse aspecte
de timp real (întârzieri) care trebuie gestionate! 61
AVR 8 biți, interfețe seriale sincrone:
interfața SPI, magistrala SPI
• Practic toate microcontrolerele AVR 8 biți au suportul
hardware necesar pentru implementarea unei interfețe
seriale sincrone mare viteză, compatibilă cu o
magistrală SPI (Serial Peripheral Interface Bus)
• SPI a fost introdusă de fosta Motorola (fosta Freescale,
actualmente NXP, nu se știe cat timp..) ca o legătură
serială sincronă full-duplex
– SPI este sincronă fiindcă se vehiculează si un semnal de ceas
SCK împreună cu semnalul de date
– Prezentarea SPI care urmează este una doar la nivel introductiv!
• La variantele ATtiny (de exemplu la ATtiny2313) se
întâlnește o interfață serială sincronă simplificată, numita
USI (Universal Serial Interface), care pune la dispoziție
niște resurse hardware de bază pentru implementarea
unei comunicații seriale sincrone
– Utilizând USI unitatea centrală poate fi degrevată de unele sarcini
suplimentare, comparativ cu cazul in care comunicația serială ar
fi realizată doar sub controlul software, folosind intrări/ieşiri de uz
general (lucru de altfel întotdeauna posibil)
62
Magistrala SPI, generalități
• Este o magistrală sincronă (care foloseste un semnal explicit de
ceas) care implementează conceptul de Master-Slave, masterul
fiind acela care inițiază transferul unor cadre seriale de biţi (tipic
de 8 biti, dar nu limitat la această dimensiune), cu un dispozitiv
Slave
• Masterul este si cel care generează semnalul de ceas
• Mai multe dispozitive Slave pot fi selectate printr-un mecanism de
selecție, mecanism care folosește semnale de selecție individuale
• Permite comunicația full-duplex, având linii separate de date
pentru emisie si recepție
• Este destinată a fi utilizată pe distanţe mici (<1m)
• Este potențial o magistrală rapidă, cu viteze de până la 20 Mbps-
echivalentul unui ceas de 20MHz - (funcție si de lungimea firelor),
oricum mai rapidă decât magistrala I2C
• Interfața SPI permite schimbul de date serial utilizând doar 4 fire
(este o 4 wire interface), plus un fir de masă, cu un alt dispozitiv
compatibil SPI Slave (circuite de memorie, convertoare analog-
numerice/numeric-analogice, senzori, registre de deplasare, etc.)
– Daca comunica cu mai multe dispozitive SPI Slave, este necesar un fir in plus
pentru fiecare dispozitiv adăugat
• Vezi si https://en.wikipedia.org/wiki/Serial_Peripheral_Interface
63
SPI, interconexiunea Master- Slave,
semnale
• SC(L)K: Serial ClocK (Ieșire de la Master);
• MOSI; SIMO: Master Output, Slave Input (Ieșire de la Master);
• MISO; SOMI: Master Input, Slave Output (Ieșire de la Slave);
• /SS: Slave Select (activă in “0, ieșire de la Master, intrare la Slave).
• Masterul si Slave-ul SPI sunt de fapt două registre de deplasare serie -
paralel, aici de 8 biți, cu același semnal de ceas SCK, conectate “in inel”,
prin intermediul MISO si MOSI, astfel că practic formează un registru unic
de deplasare
• Semnalul de selecție /SS va spune Slave-ului când va începe transferul
(deplasarea serială de biți) propriu-zis
• Masterul generează informație pe linia MOSI si in același timp
eșantionează (citeste si memorează) informația care ii vine pe linia MISO

64
Magistrala SPI - semnalul de ceas SCK
• Deși datele sunt in mod conventional grupate in mod
tipic in pachete de 8 biți, adică 8 perioade ale ceasului
SCK, in realitate transferul de date poate avea un număr
arbitrar de biți/perioade ale ceasului
• Când nu mai sunt date de serializat Master-ul oprește
ceasul si, in mod normal, asta duce la deselectarea
Slave-ului
• Există multe exemple de periferice cu interfata SPI unde
se vehiculează pachete de 12 sau 16 biți, registrele de
deplasare respective având același număr de biți
• Starea de referință (inactivă) a semnalului de ceas SCK,
“0” sau “1”, precum si frontul activ (cel pe care se
memorează/eșantionează biții de intrare) crescător sau
descrescător, trebuie sa fie programabile de utilizator;
– De exemplu pentru AVR 8 biti, aceasta se face cu ajutorul biților
CPOL- Clock Polarity si CPHA- Clock Phase din registrul SPCR
– SPI Control Register

65
Magistrala SPI- diagrame de timp

In acest exemplu liniile MOSI/MISO comută (isi pot schimba starea) pe frontul căzător
al lui SCLK si sunt memorate/eșantionate/citite pe frontul crescător

Vezi si http://www.epanorama.net/links/serialbus.html 66
AVR 8 biți: schema bloc a interfeței SPI

ATMega16

Utilizarea SPI pentru un microcontroler


AVR se face prin intermediul a 3 registre:
de date (SPDR), stare (SPSR) si control
(SPDR) si a 4 conexiuni externe (MOSI,
MISO, SCK si /SS) 67
AVR 8 biți: interfața SPI, registrele de
control, stare si date (ATMega)

Semnificația tuturor biților si exemple de programare SPI le găsiți in foile de catalog


si notele de aplicații.
Vezi si http://maxembedded.com/2013/11/the-spi-of-the-avr/ 68
Exemple de utilizare SPI
1. Un SPI Master (AVR) conectat la doua
periferice Slave.
Pentru ca la AVR nu există decât un
singur pin dedicat de tip /SS, daca mai sunt
si alți pini de tip /SS, ei vor trebui
implementați cu pini de ieșire de uz general.
Exista o mare varietate de circuite/module
cu interfață SPI care pot fi conectate astfel
Legătura de masă numai cu 3+1 fire: circuite de memorie cu
comună nu este interfața seriala SPI, convertoare
figurată in aceste analog-numerice si numeric analogice,
scheme! diverși senzori, module de comunicație
radio (wireless), etc

2. Două ATmega 328


conectate prin SPI (4 fire),
unul este Master si unul
Slave.

69
AVR 8 biți: SPI si programarea ISP (ATMega)
• Nu in ultimul rând, in contextul AVR, interfaţa SPI poate fi utilizată si pentru o
programare de tip ISP (In System Programming ) a microcontrolerului (serial
downloading):
– a memoriei de program (Flash),
– a memoriei EEPROM si
– a fuzibilelor
Cu ajutorul acestei interfețe se pot realiza operații de scriere si citire(verificare)
din zonele de memorie enumerate mai sus atunci când:
- semnalul /RESET este ținut activ (=‘0’)
- exista semnal de ceas
- fuzibilul SPIEN (activare programare prin SPI) este programat
• Se utilizează un algoritm specific descris in foaia de catalog AVR

70
AVR 8 biți, interfețe seriale sincrone:
magistrala I2C (IIC)
• Prezentarea I2C care urmează este una sumara, doar la nivel introductiv!
– Pentru familia de microcontrolere AVR 8 biti interfaţa I2C se numește TWI (Two Wire serial Interface), interfață cu 2
fire
• Este o magistrală serială sincronă destinată interconectării de circuite integrate (IIC-
Inter Integrated Circuits), inventată in anii ’80 de fostul Philips Semiconductor (acum NXP)
– I2C este sincronă fiindcă se vehiculează si un semnal de ceas împreună cu semnalul de date
• Este o magistrală de tip Multi-Master, ceasul fiind furnizat / generat de Master
• Informația este organizată pe pachete
• Este o magistrală multi-punct, permite conectarea utilizând numai 2 fire (Two Wire-2W) a
până la 128 de dispozitive (sau 1024 pentru adresa extinsa) I2C diferite
• Este destinată a fi utilizată pe distanțe mici (<1 m)
• Este o magistrală cu linii bidirecționale, de tip drenă in gol (ca ieşiri)
– Obligatoriu trebuie să existe rezistente de sarcină externe, către Vcc (pull-up)
• Comunicația este doar Half-Duplex pentru că există o singură linie de date, bidirecțională!
• Este relativ lentă (este oricum mai lentă decât SPI):
– 100 kbiti/s (in modul normal-standard), 400 kbiti/s (in modul rapid-fast, disponibil si la variantele
mai noi de AVR XMEGA)
– La cele mai noi dispozitive există si un mod de mare viteză - high speed care poate asigura
potențial o viteză de 3.4Mbps

OBSERVAŢIE
Magistrala SMBus (System Management Bus), definită de Intel in 1995, este un subset al I²C care
(re) definește protocolul I2C intr-un mod mai strict. Este utilizata si o întâlniți de exemplu la plăcile
de bază PC pentru comunicația cu sistemul de alimentare de tip baterie reîncărcabilă. 71
2
I C, exemple de utilizare

• Permite conectarea simplă si ieftină, a mai multor dispozitive de


intrare/ieşire (peripheral) diverse, cu ajutorul unei magistrale seriale
minimale (doar două fire plus masă, adică a 3 fire –este un 3 wire bus):
– circuite de memorie cu interfața seriala I2C, extensii de porturi paralele,
convertoare analog-numerice si numeric analogice, ceasuri de timp real
(RTC), afisoare LCD, senzori de temperatură, de umiditate, de
acceleraţie, de tip busolă (compass), de viteză unghiulară (gyro), etc
• Exemple multiple de utilizare: robotică, aparatură audio-video, TV,
diverse automatizări, etc. 72
I2C, definiții si concepte
• Master:
– Unitate (dispozitiv) care emite semnalul de ceas, iniţiază si
finalizează un transfer de date
– Furnizează adresa dispozitivului slave care va fi selectat si
stabileşte sensul transferului (citire sau scriere)
• Slave :
– Unitate (dispozitiv) selectată pentru transfer de către Master
– Recepţionează adresa si sensul transferului
– Achită transferul, dacă el este unitatea selectată
• Sistem Multi-Master
– Sistem in care una din mai multe potenţiale unităţi Master pot
prelua, pe baza unui arbitraj, controlul magistralei, fără a corupe
datele (informaţia vehiculată)
• Arbitraj (arbitration)
– Procedură pentru a prelua controlul asupra magistralei, dacă mai
multe unităţi doresc să o facă in acelaşi timp (doresc să devină
Master) 73
I2C, definiții si concepte -2
• Emițător (transmitter):
– Unitate care transmite o dată/un mesaj pe magistrală
– La scriere: emițătorul este Master
– La citire: emițătorul este Slave
• Receptor (receiver):
– Unitate care recepționează o dată/un mesaj de pe magistrală
– La scriere: receptorul este Slave
– La citire : receptorul este Master
• Sincronizare (synchronization)
– Metodă de sincronizare a semnalului de ceas pentru mai multe
dispozitive
• Adresa Slave (slave address)
– Adresa simplă (exista si o adresă extinsă de 10 biti) are 7 biţi permițând
adresarea a până la 128 de dispozitive slave
– Adresa simplă are 2 părți/câmpuri:
• Una (tipic 4 biţi) care identifică tipul dispozitivului: memorie, senzor, convertor,
etc.
• Una (tipic 3 biţi) care controlează activarea dispozitivului, care trebuie să fie
identică cu starea fixată extern (‘0’ sau ‘1’) a unor pini (tipic 2 sau 3, denumiti
A0, A1 sau A2) ai dispozitivului
• Este astfel posibilă astfel adresarea/conectarea a până la 8 dispozitive de
același tip, prin cele 8 combinații posibile de polarizare ale celor 3 pini
74
I2C, interconectarea mai multor
dispozitive

In exemplu avem 2 microcontrolere (UC) din care unul este Master,


altul Slave, un convertor analog-numeric (ADC) si unul numeric-analog
(DAC) conectate la aceiași magistrală I2C.
Sunt necesare doar 2 linii de semnal (plus o masă GND) si două
rezistențe de sarcină Rp:
•SCL : Ceas, semnal bidirecțional
•SDA : Date, semnal bidirecțional
75
•GND : Masa
I2C, interfața electrică
Vcc

• SCL: Serial Clock Line, linie de ceas,


• întotdeauna este activată de Master
• dar poate fi “trasă” in '0' de Slave
• SDA: Serial Data Line, linie de date
Liniile SDA si SCL sunt bidirecționale, ca ieșiri fiind de tip
cu drenă in gol:
- avem un AND (SI) cablat intre ieșirile de același tip
legate intre ele
- obligatoriu trebuie să existe si rezistențe de sarcină 76
(tipic 2..10kOhmi) externe către Vcc/VDD!
I2C, transmisia unui mesaj delimitat de
condițiile START/STOP

Transmis de emițător Confirmare transmisa de


receptor
• Liniile inactive (idle) sunt in ‘1'
• Înainte de a realiza orice tranzacție pe magistrală trebuie emisa o
condiție de Start: SDA ‘1' → '0', apoi SCL 'H' → '0‘
• Ea indică că va urma transmisia unui “mesaj” care trebuie ascultat de toi
cei conectați
• După finalizarea mesajului trebuie emisă o condiție de Stop : SCL '0' →
‘1', apoi SDA '0' → ‘1‘
• Ea indică ca s-a terminat transmisia unui “mesaj”, linia trecând într-o stare
inactivă
• Datele se modifică doar atunci când SCL este '0‘, serializarea începe 77
cu cel mai semnificativ bit, MSb
I2C: operația de citire (Read)
•Primul octet va conține:
• adresa destinatarului pe 7 biţi (maxim 128 de adrese
diferite)
• sensul de transfer (read in acest caz) codificat pe 1 bit
• Este urmat de o condiție de achitare (Acknowledge)
• Este urmat de octetul de date propriu-zis
• Este un exemplu de citire simplă / singulară (există si
citire multiplă, cu autoincrementarea adresei)

Adresa Data

Master Master Emitatorul datei Receptorul


Slave-ul este Slave-ul este Master
78
confirma identificarea adresei
IC
2 : operația de scriere (Write)
•Primul octet va conține :
•adresa destinatarului pe 7 biţi
•sensul de transfer (write in acest caz) pe 1 bit
• Este urmat de o achitare (Acknowledge)
• Este urmat de octetul de date
• Este un exemplu de scriere simplă / singulară (există si
scriere multiplă, cu autoincrementarea adresei)

Adresa Data

Master Master Emitatorul datei Receptor


slave este Master-ul slave
79
I2C: « încetinirea » transferului
(clock stretching)
Tras de Slave in ‘0’
pt. a încetini transferul Masterul isi dezactivează SCL
următor

Transmis de emiţător Transmis de receptor

Trăgând de semnalul de ceas in '0', un Slave poate


« încetini» viteza de transmisie (prin lungirea -stretching-
intervalului de timp cât semnalul de ceas SCL este in ‘0’):
efectul este marirea perioadei lui SCL .
Este astfel posibila comunicația cu parteneri mai “lenți”
care nu pot furniza sau recepționa datele in ritmul
80
semnalului de ceas SCL standard.
AVR 8 biți: I2C=TWI
• Pentru familia de microcontrolere AVR interfaţa I2C
se numește TWI (Two Wire serial Interface),
interfață cu 2 fire
• Este întâlnită, ca periferic, in primul rând la
variantele ATMega si XMEGA
• O interfață de tip I2C (TWI) poate fi eventual si
implementată software – software I2C- la orice
varianta de AVR 8 biți (de fapt la orice
microcontroler), folosind numai 2 pini de
intrare/ieşire de uz general, dar cu o încărcare mult
mai mare ca timp de calcul a unității centrale (care
trebuie să implementeze protocolul numai prin
manipularea pinilor respectivi) si o viteză de transfer
a datelor eventual mai mică

81
AVR 8 biti TWI: schema bloc a sub-sistemului,
conexiunile externe (ATMega16)
ATMega16

82
AVR 8 biti, TWI: registrele asociate
• Pentru AVR 8 biti exista un set de 5 registre utilizate
pentru implementarea interfeței TWI:
– Registrul pentru stabilirea vitezei de comunicație (rata bit, bit
rate) TWBR - TWI Bit Rate Register
– Registrul de control TWCR - TWI Control Register
– Registrul de stare TWSR - TWI Status Register
– Registrul de date TWDR -TWI Data Register; este un singur
registru, utilizat la scriere pentru emisie si la citire pentru recepţie
– Registrul de adresa pentru Slave TWAR -TWI (Slave) Address
Register
• Pentru utilizarea lor si a interfeței TWI consultați foile de
catalog!

83
AVR 8 biti TWI: registrele

84
AVR 8 biti TWI: exemplu de conectare a unui
ATMega16 cu o memorie EEPROM serială, 24C02

Găsiţi si consultaţi foaia de catalog si a circuitului 24C02 pentru a înţelege


care este funcţionalitatea pinilor A0, A1, WP.
In acest exemplu, pe magistrala I2Car putea fi conectate pană la 4 circuite de
85
memorie de tip 24C02.
AVR 8 biti TWI: exemplu de conectare a unui
Attiny 45 cu un circuit PCF8574 –I/O expander
PCF8574 este un circuit care
implementează un port de 8 biți,
intrări si/sau ieșiri
numerice(identificate ca P0..P7)
In acest exemplu un circuit este
utilizat numai ca intrări (8 intrări)
pentru a citi starea unor
comutatoare, iar altul numai ca
ieșiri (6 ieșiri) pentru interfața cu
un modul de afișare LCD (interfață
paralela de 4 biți) LM016.
Cele doua PCF 8574 sunt
conectate pe magistrala I2C având
adrese diferite – vezi pinii A0, A1 si
A2.
ATTiny45 este o variantă de AVR 8
biți într-o capsulă PDIP de 8 pini,
de unde si utilitatea soluției I2C, cu
numai 2 fire (plus masă), de
interfață cu intrările/ ieșirile 86
numerice .
AVR 8 biți TWI: exemplu de conectare a unui
ATMega 8 cu un modul/senzor MPU6050

Găsiți si consultați foaia de catalog a circuitului


MPU6050 (TDK) pentru a înțelege
care este funcționalitatea acestuia.
Măsoară : accelerația (tri-axial), viteza unghiulară (gyro,
tri-axial) si temperatura.
Senzorul (circuitul) există si in varianta cu interfață SPI.
OBS. Rezistentele de pull-up pentru I2C sunt conectate
la Vcc pe placa senzorului

87

S-ar putea să vă placă și