Sunteți pe pagina 1din 9

Capitolul 7

50
I IN NT TE ER RF FA A A A S SC CI I
7.1. Introducere
Microcontrolerele HCS12 pot comunica prin intermediul interfeei seriale
SCI (Serial Communications Interface), modulul care controleaz aceast interfa
este S12SCI. Interfaa lucreaz numai n modul asincron. Interfaa se caracterizeaz
prin: posibilitatea de a funciona n modul duplex, comunicaie n standard NRZ
(non-return-to-zero) i format 8 sau 9 bii pentru date, 13 bii rezoluie de
programare a ratei de transfer, calcul automat al paritii la emisie, validare
separat pentru emisie i recepie, dou posibiliti de scoatere a microcontrolerului
din modurile cu consum redus, posibilitate de funcionare n ntreruperi, detectarea
erorilor de cadrare, verificare paritate i detectarea zgomotului la recepie. Interfaa
SCI utilizeaz urmtoarele registre: SCIBDH i SCIBDL registre pentru fixarea
ratei de transfer, SCICR1 i SCICR2 registre de control, SCISR1 i SCISR2
registre de stare i SCIDRH i SCIDRL registre de date. Conexiunile externe
utilizate de interfaa sunt: TXD/PS1 emisie de date i RXD/PS0 recepie de
date.
7.2. Descrierea interfeei SCI
Pentru codificarea datelor se utilizeaz un cod NRZ unipolar (mark/space),
nivelul logic 1 este reprezentat de tensiunea nalt (mark) iar nivelul logic 0 de
tensiunea sczut (space). Avnd n vedere c la comunicaiile asincrone nu se
transmite un tact de sincronizare i c la bii succesivi de aceeai valoare nu apar
tranziii, la aceste coduri apar dificulti de sincronizare. n figura 7.1 este dat un
exemplu de codificare NRZ.

0 1 0 0 0 1 1 0
Mark
Space
Mark

Figura 7.1. Exemplu de cod NRZ monopolar.

n contrast cu codurile NRZ, la codurile RZ (return-to-zero), dup fiecare
bit se revine la nivelul zero ceea ce elimin necesitatea unui tact de sincronizare.
Codurile RZ au totui dezavantajul c, la aceeai rat de transfer, ocup o lrgime
de band dubl fa de codurile NRZ. Un exemplu de cod RZ bipolar este dat n
figura 7.2.
7.2. Descrierea interfeei SCI
51

1 0 1 1 1 0 0 1
nivel 0


Figura 7.2. Exemplu de cod RZ bipolar.

Interfaa SCI vehiculeaz informaia pe cadre (frame), fiecare cadru este
format din 10 sau 11 bii, astfel: bitul de Start, 8 sau 9 bii de date i bitul de Stop.
Dup bitul de Stop poate urma un nou cadru sau se st ntr-o stare inactiv (mark),
figura 7.3. Alegerea lungimii cadrului se realizeaz din bitul SCICR1_M
(SCICR1_M=0/1-lungime cadru 10/11 bii). Ultimul bit de date dintr-un cadru
(bitul 7 din cadrul de 10 bii, respectiv, bitul 8 din cadrul de 11 bii) poate fi: bit de
date, bit de paritate sau bit de adres. La emisie, pentru inserarea automat a bitului
de paritate trebuie setat bitul SCICR1_PE (SCICR1_PE=1/0-funcia de paritate
validat/invalidat). Tipul de paritate se va preciza din bitul SCICR1_PT
(SCICR1_PT=1/0-paritate impar/par, paritate impar/par-numrul total de bii
de date inclusiv bitul de paritate este impar/par). La recepie, dac funcia de
paritate este validat, se va verifica prin hardware paritatea cadrului recepionat. n
cazul n care nu este respectat tipul de paritate selectat se va seta automat bitul de
eroare paritate SCISR1_PF (SCISR1_PF=1- eroare de paritate la recepie). n cazul
comunicaiilor multiprocesor, fiecrui procesor i se aloc cte o adres. La cadrul
care conine o adres de procesor, bitul cel mai semnificativ (bitul 7/8) trebuie s
fie setat.
Start Bit0 Bit1 Bit2 Bit3 Bit4 Bit5 Bit6 Bit7 Stop
Mark
sau
Start
Mark
Start Bit0 Bit1 Bit2 Bit3 Bit4 Bit5 Bit6 Bit7 Stop
Mark
sau
Start
Mark
Bit8
Cadru de 10 bii
Cadru de 11 bii
LSB
LSB MSB
MSB

Figura 7.3. Formatul cadrelor de 10 i 11 bii.

Rata de transfer este aceeai pentru emisie i recepie i se determin cu
relaia (7.1). n aceast relaie f
BUS
este frecvena magistralei microcontrolerului iar
k este o constant de 13 bii determinat de biii SCIBDH_[SBR12SBR8]:
SCIBDL_[SBR7SBR0].
k
f
Rata
BUS
SCI
16
= (7.1)

Receptorul eantioneaz continuu linia de recepie, frecvena de
eantionare este de 16 ori mai mare dect rata de transfer (16Rata
SCI
). Pentru a
INTERFAA SCI
52
reduce eroarea datorat diferenelor de rat de transfer dintre emisie i recepie,
receptorul se sincronizeaz cu emitorul. Aceast sincronizare are loc n dou
cazuri: dup detecia frontului negativ cu care ncepe bitul Start i dup fiecare
tranziie de la un bit 1 la un bit 0 din cadrul celor 8 sau 9 bii de date.
Pentru detectarea unui nivel logic se iau n calcul trei eantionri succesive.
n cazul detectri nivelului logic al unui bit de date se consider eantionrile din
mijlocul intervalului bitului. Nivelul logic este determinat de valoarea majoritii
eantioanelor, dac numai dou valori coincid se consider recepia zgomotoas
(acest aspect este indicat de setarea bitului SCISR1_NF, NF-Noise Flag).
Avnd n vedere sincronizarea recepiei cu fiecare bit de Start, ntre emisie
i recepie poate s existe o anumit diferen de rat de transfer. Diferena de rat
tolerat se consider aceea care nc asigur achiziia corect a bitului de Stop. n
cazul n care cadrul recepionat este mai lent trebuie asigurat detecia corect a
nceputului bitului de Stop (eroarea tolerat este de 4,63 % pentru un cadru de 10
bii i de 4,19 % pentru un cadru de 11 bii). n cazul n care cadrul recepionat este
mai rapid trebuie asigurat detecia corect a sfritului bitului de Stop (eroarea
tolerat este de 3,75 % pentru un cadru de 10 bii i de 3,40 % pentru un cadru de
11 bii). n cazul n care se depesc aceste erori se consider c a aprut eroarea de
cadrare deoarece cadrul recepionat apare ca i cum nu ar conine bitul de Stop.
Acest aspect este indicat prin setarea automat a bitului SCISR1_FE (FE- Framing
Error Flag).
Pentru a implementa simplu protocolul interfeei LIN (Local Interconnect
Network), interfaa SCI poate genera automat secvene de Break. Aceste secvene
sunt formate din 10/11 bii 0 (pentru bitul SCICR1_M=0/1 i bitul
SCISR2_BK13=0), respectiv 13/14 bii 0 (pentru bitul SCICR1_M=0/1 i bitul
SCISR2_BK13=1). Generarea secvenei de Break implic bascularea bitului
SCICR2_SBK. n figura 7.4 este dat structura cadru, ce respect specificaiile
protocolului LIN, n care un dispozitiv Master apeleaz un dispozitiv Slave.


Secvena
Break
(>13 bii 0)
Secvena
sincronizare
(0x55)
Identi-
ficator
(PID)
Data 1 Data 2 Data N Suma de
control
(cheksum)
Header (Master)
t
byte
Rspuns (Slave)
Timp de rspuns


Figura 7.4. Structura unui cadru LIN.

Un cadru LIN este format dintr-un header i un mesaj sau rspuns.
Header-ul este generat totdeauna de Master i este format din: secvena de Break
(cel puin 13 bii 0) care indic nceputul transmiterii unui cadru; secvena de
sincronizare (caracterul 0x55) care poate fi folosit de dispozitivele Slave pentru
sincronizare i eventual detectarea ratei de transfer; un identificator protejat (PID
7.2. Descrierea interfeei SCI
53
Protected Identifier) care conine 6 bii ce specific tipul cadrului i 2 bii de
paritate calculai asupra primilor 6 bii. Dup trecerea timpului de rspuns,
dispozitivul Slave va genera mesajul de rspuns constituit din 1 pn la 8 octei de
date (Data 1 Data N) i din suma de control calculat asupra octeilor de date sau
asupra octeilor de date i a octetului PID (suma de control este complementul fa
de 1 al octetului inferior al sumei octeilor).
n cazul comunicaiilor multiprocesor, o parte din receptoare pot fi puse n
stare inactiv pentru a nu recepiona mesaje care nu le sunt destinate. Punerea n
stare inactiv a unui receptor se realizeaz prin setarea bitului SCICR2_RWU. n
aceast stare receptoarele continu s recepioneze caractere dar nu cer ntrerupere
la terminarea recepiei unui caracter. Scoaterea unui receptor din starea inactiv
(wake-up) se poate face prin dou moduri: prin recepionarea unui caracter de
adres (bitul MSB de date este 1) sau prin recepionarea secvenei Idle. Selecia
modului se realizeaz cu ajutorul bitului SCICR1_WAKE (SCICR1_WAKE=1/0-
weke-up la recepie adres/Idle).
Recepionarea unei secvenei Idle (10/11 bii consecutivi n 1 logic) este
indicat de setarea automat a bitului SCISR1_IDLE. nceperea numrrii biilor
Idle se poate face dup bitul de Start sau dup bitul de Stop, selecia se face cu bitul
SCICR1_ILT (SCICR1_ILT=0/1- contorizare bii Idle dup Start/Stop). Dac un
receptor inactiv recepioneaz condiia de trezire (wake-up) se terge automat bitul
SCICR2_RWU. Dac trezirea a fost realizat prin recepionarea unei adrese,
receptorul analizeaz adresa primit i dac este cazul va trece la recepionarea
mesajelor. Dac trezirea s-a fcut prin recepionarea secvenei Idle, urmtorul
caracter recepionat trebuie s fie o adres etc.


Receptor
Emitor
RXD
emisie prin TXD (SCISR2_TXDIR=1)
recepie prin TXD (SCISR2_TXDIR=0)
Comunicaie pe un singur fir (semiduplex)
(SCICR1_LOOPS=1, SCICR1_RSRC=1,
SCICR2_TE=1, SCICR2_RE=1)
Receptor
Emitor
RXD
emisie prin TXD
Comunicaie normal pe dou fire (duplex)
(SCICR1_LOOPS=0, SCICR1_RSRC=X,
SCICR2_TE=1, SCICR2_RE=1)

TXD
recepie prin RXD
Receptor
Emitor
RXD
emisie prin TXD
Comunicaie n bucl (simplex)
(SCICR1_LOOPS=1, SCICR1_RSRC=0,
SCICR2_TE=1, SCICR2_RE=X)

TXD
TXD

Figura 7.5. Structura modurilor de comunicaie.

n ceea ce privete conexiunile externe, interfaa SCI utilizeaz pinul
PS1/TXD pentru emisie i PS0/RXD- pentru recepie. Prin utilizarea celor doi
pini se poate realiza o legtur duplex (emisie i recepie simultan). Pe de alt
parte exist i alte dou moduri de comunicaie: n bucl (loop operation) i pe un
INTERFAA SCI
54
singur fir (single wire operation). n ambele moduri se utilizeaz numai conexiunea
TXD, conexiunea RXD este deconectat de la interfaa SCI. Selecia celor dou
moduri cade n sarcina biilor SCICR1_LOOPS i SCICR1_RSRC. Structura
modurilor de comunicaie este prezentat n figura 7.5.
La comunicaii pe un singur fir se pot realiza legturi semiduplex (emisie i
recepie dar nu simultan) prin intermediul pinului TXD. Specificarea direcie de
comunicaie este dat de bitul SCISR2_TXDIR (SCISR2_TXDIR=0/1-pinul TXD
este intrare/ieire de date). La comunicaiile n bucl se pot realiza numai legturi
simplex (numai emisie), ceea ce se emite se i recepioneaz.
Pentru emisia i recepia datelor, interfaa SCI utilizeaz aceeai pereche
de registre SCIDRH:SCIDRL. Datele care vor scrise n aceste registre vor fi emise,
datele recepionate pot fi citite din aceste registre. Registrul SCIDRL conine 8 bii
cei puin semnificativi ai datelor. Registrul SCIDRH este folosit n comunicaiile
pe 9 bii, astfel: bitul 7 al registrului conine bitul 9 recepionat (R8) iar bitul 6 al
registrului conine bitul 9 ce va fi transmis (T8).
Pentru validarea emisiei trebuie setat bitul SCICR2_TE (SCICR2_TE=1/0-
emisie validat/invalidat). Facem precizarea c la trecerea bitului SCICR2_TE din
0 n 1 se genereaz automat o secven Idle. Data care va fi emis trebuie scris n
registrele SCIDRH:SCIDRL. Aceasta este imediat transferat intern n registrul de
deplasare de emisie. Aici se face ncadrarea datei cu biii de Start i Stop i ncepe
emisia bit cu bit, bitul LSB se transmite primul. Tot la nceperea emisiei se seteaz
automat bitul SCISR1_TDRE (SCISR1_TDRE=1 registrele SCIDRH:SCIDRL
sunt disponibile). Aceasta permite o nou ncrcare a registrelor de date n vederea
emisiei continue de caractere. La terminarea emisiei unui caracter se seteaz
automat bitul SCISR1_TC (SCISR1_TC=1/0- transmisie terminat/transmisie n
progres).
Validarea recepiei se face prin setarea bitului SCICR2_RE
(SCICR2_RE=1/0 recepie validat/invalidat). La recepia unui caracter acesta
se transfer automat n registrele de date SCIDRH:SCIDRL, moment n care se
seteaz automat i bitul SCISR1_RDRF (SCISR1_RDRF=1/0 data este
disponibil/indisponibil n registrele de date). Dac se mai recepioneaz o dat
nainte de a fi citit data anterioar va fi setat bitul SCISR1_OR (SCISR1_OR=1-
caracterul recepionat n registrul de deplasare nu se transfer n registrele de date
SCIDRH:SCIDRL i este pierdut).
Emisia i recepia pot fi controlate prin testarea indicatorilor prezentai dar
i prin ntrerupere. Modul de control al ntreruperilor este dat n tabelul 7.1.

Tabelul 7.1. Controlul ntreruperilor de la emisie i recepie.
Sursa de ntrerupere Bit de validare
ntrerupere
Bit indicator de
ntrerupere
Emisie Registrele de date disponibile SCICR2_TIE SCISR1_TDRE
Emisie complet caracter SCICR2_TCIE SCISR1_TC
Recepie Recepie complet caracter SCICR2_RIE SCISR1_RDRF
Suprapunere recepie SCISR1_OR
Recepie secven Idle SCICR2_ILIE SCISR1_IDLE

7.3. Registrele ataate blocului SCI
55
Pentru gestionarea ntreruperilor de la interfaa SCI este alocat un singur
vector de ntrerupere. ntreruperea de la interfaa SCI este mascabil de tip CCR_I.
Prin subrutina de ntrerupere trebuie testai indicatori pentru a depista cauza care a
generat ntreruperea. n cazul recepiei este util s fie verificai i ali indicatori:
SCISR1_NF indic prezena zgomotului la recepie, SCISR1_FE indic o
eroare de cadrare la recepie, SCISR1_PF indic o eroare de paritate la recepie.
7.3. Registrele ataate blocului SCI
SCIBDH x0 x0 x0 SBR120 SBR110 SBR100 SBR90 SBR80

SCIBDL SBR70 SBR60 SBR50 SBR40 SBR30 SBR21 SBR10 SBR00

SCICR1 LOOPS0 SCISWAI0 RSRC0 M0 WAKE0 ILT0 PE0 PT0

SCICR2 TIE0 TCIE0 RIE0 ILIE0 TE0 RE0 RWU0 SBK0

SCISR1 TDRE0R TC0R RDRF0R IDLE0R OR0R NF0R FE0R PF0R

SCISR2 x0 x0 x0 x0 x0 BK130 TXDIR0 RAF0R

SCIDRH R80R T80 x0 x0 x0 x0 x0 x0

SCIDRL R70R/T70W R60R/T60W R50R/T50W R40R/T40W R30R/T30W R20R/T20W R10R/T10W R00R/T00W

Legend: notaia biilor Bit
a
din registre: Bit numele bitului, x bit neimplementat (se citete 0 iar
scrierea nu are efect); a valoare de reset, R/W bit de tip read only/write only.
7.4. Programarea interfeei SCI
nainte de utilizarea interfeei SCI aceasta trebuie configurat.
Configurarea emisiei i recepiei poate fi fcut independent sau simultan. La fel,
exist bii separai pentru validarea emisiei i recepiei. Paii care trebuie urmai
pentru programarea i operarea cu interfaa SCI sunt prezentai n continuare.
Primul pas presupune configurarea interfeei SCI, astfel:
- selectarea ratei de transfer (calcularea i ncrcarea constantei k n
registrele SCIBDH:SCIBDL , se va utiliza relaia (7.1));
- programarea comunicaiei (normal, bucl sau pe un singur fir),
programarea lungimii datelor (8/9 bii), utilizarea paritii etc. Se utilizeaz
biii SCICR1_[LOOPS, SCIWAI, RSRC, M, WAKE, ILT, PE, PT];
- validarea emisiei, recepiei sau wake-up dac este cazul, a funcionrii prin
ntreruperi. Se utilizeaz registrul SCICR2_[TIE, TCIE, RIE, ILIE, TE,
RE, RWU, SBK]. Facem precizarea c la trecerea bitului SCICR2_TE din
0 n 1 se transmite automat o secven Idle.
Pentru a realiza transmiterea datelor caracter cu caracter se procedeaz
astfel:
- se testeaz bitul SCISR1_TDRE sau se rspunde la ntreruperea generat
de acesta. Dac acest bit este setat se va scrie urmtorul caracter n
registrele de date SCIBDH:SCIBDL (operaiile de citire a registrului
INTERFAA SCI
56
SCISR1 i de scriere n registrele de date terg automat bitul
SCISR1_TDRE);
- se repet operaiile anterioare pn la transmiterea ultimului caracter;
- se terge bitul SCICR2_TE.
Pentru a transmite mai multe mesaje separate ntre ele cel puin printr-o
secven Idle se va proceda astfel:
- dup ndeplinirea condiiei SCISR1_TDRE=1, se scrie n registrele
SCIBDH:SCIBDL ultimul caracter din mesajul n curs de transmitere;
- se ateapt ndeplinirea condiiei SCISR1_TDRE=1 (aceasta asigur
transmisia complet a caracterului curent);
- se terge i apoi se seteaz bitul SCICR2_TE (aceasta asigur transmiterea
unei secvene Idle dup terminarea transmiterii caracterului curent);
- se scrie n registrele SCIBDH:SCIBDL primul caracter din mesajul
urmtor etc.
Pentru recepia continu a caracterelor se procedeaz astfel:
- se testeaz bitul SCISR1_RDRF sau se rspunde la ntreruperea generat
de acesta. Dac acest bit este setat se va face o citire din registrele de date
SCIBDH:SCIBDL (operaiile de citire a registrului SCISR1 i de citire din
registrele de date terg automat bitul SCISR1_RDRF);
- se repet operaiile anterioare pn la achiziia ultimului caracter (facem
precizarea c la recepionarea unui caracter nainte ca precedentul caracter
s fie citit din registrul de date, noul caracter recepionat se pierde i se
seteaz bitul de eroare SCISR1_OR).
- se terge bitul SCICR2_RE.
7.5. Aplicaii
Pentru a utiliza interfaa SCI trebuie concepute funciile: de
iniializare a interfeei, de scriere i citire a unui caracter, de scriere i citire
a unui ir de caractere etc. n scopul afirilor i conversiilor de date este
comod utilizarea funciei printf. Aceast funcie utilizeaz fiierul termio.c
din mediul de programare CodeWarrior care trebuie modificat. Structura fiierul
termio.c modificat este dat n continuare. Acest fiier trebuie inclus n fiecare
proiect n care se utilizeaz funcia printf.

#include <termio.h>
#include <mc9s12c32.h>
#define SCI_BAUD_RATE 52 // baud Rate = 9600

//scrie un caracter la SCI
void TERMIO_PutChar(char ch) {
while (!SCISR1_TDRE);
SCIDRL = ch;
}

//initializare SCI
void TERMIO_Init(void) {
SCIBDL = SCI_BAUD_RATE; // setare rata de transfer
SCICR2_RE = 1; // validare recepie
7.5. Aplicaii
57
SCICR2_TE = 1; // validare emisie
}

//citeste un caracter
char TERMIO_GetChar(void) {
while (!SCISR1_RDRF);
return SCIDRL;
}

Se consider c frecvena de tact a microcontrolerului este 16 MHz (f
BUS
=8
MHz) i rata de transfer dorit 9600 baud. Conform relaiei (7.1), pentru rata de
transfer de 9600 baud i f
BUS
=8 MHz, pentru constanta k se determin valoarea
52,083. Cea mai apropiat valoare ntreag este 52. Cu aceast valoare se obine o
rat de 9615 baud. Eroarea de rat este de 0,16% i deci se ncadreaz n eroarea
admis. Fixarea ratei se realizeaz n funcia TERMIO_Init, tot aici se valideaz
emisia i recepia. n rest, pentru configurarea interfeei SCI se utilizeaz valorile
implicite (dup resetare) ale biilor de control (comunicaie normal duplex pe 8
bii de date, fr paritate, nu se utilizeaz ntreruperile, recepie normal etc.).
Funcia TERMIO_PutChar(char ch) permite emisia unui caracter, caracterul se
ncarc n registrul de date de emisie SCIDRL numai cnd registrul este disponibil
(SCISR1_TDRE=1). Funcia char TERMIO_GetChar() returneaz caracterul
recepionat. Citirea caracterului se face numai dup ce bitul SCISR1_RDRF este
setat.
Dac fiierul termio.c modificat este inclus n proiect putem utiliza funcia
printf ca n exemplul care urmeaz. Pentru ca funcia printf s prelucreze variabile
floating trebuie inclus n proiect fiierul ansis.lib sau ansisf.lib i nu fiierul
ansisi.lib. Alegerea fiierului din librrie care se include se realizeaz n pasul 5
de la crearea proiectului (opiunea None fiier ansisi.lib; opiunea float is
IEEE32,double is IEEE32 fiier ansis.lib; opiunea float is IEEE32,double is
IEEE64 fiier ansisf.lib). Un fiier de acest gen poate fi scos din sau introdus n
proiect i dup crearea acestuia.

void main(void) {
float result_adc;
TERMIO_Init(); //iniializare SCI
.
adc_init();
for(;;) {
if(ATDSTAT1_CCF0) //sfrit conversie?
result_adc = (ATDDR0H*256.0+ATDDR0L)*5.0/1024;
(void)printf("Tensiunea masurata la canalul AN0 este = %0.2f V\r",result_adc);
.
}
}

Deoarece puncia printf consum mult memorie, acolo unde este posibil,
este bine de evitat utilizarea acestei funcii. Pentru afiarea unui ir de caractere
nregistrat ntr-un vector poate fi folosit funcia print_string(char s[]), prezentat
n continuare. Afiarea se face pn la ntlnirea caracterului 0x00.

INTERFAA SCI
58
.
void print_string(char s[]); //prototip funcie
char p[]=("Determinarea pozitiei cursorului\n\r"); //mesajul de afiat
.............................................

//scrie irul de caractere la consola pana la 0x00
void print_string(char s[]) {
unsigned char i=0;
while (!SCISR1_TDRE);
while(s[i]) {
SCIDRL = s[i++];
while (!SCISR1_TDRE);
}
}
.................................................
void main(void) {
...............................................
TERMIO_Init(); //iniializare SCI
print_string(p); //afiare mesaj
.............................................
}

Note bibliografice
[1] MC9S12C Family/MC9S12GC Family Reference Manual (Chapter 13 Serial
Communications Interface (S12SCIV2) Block Description) Block
Description), Rev 01.24, 05/2010, Freescale Semiconductors.

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