|
|
La comunicazione Seriale |
|
Per comunicazione seriale, si intende una trasmissione
di dati costituita da una lunga sequenza di alti e bassi ...
1 e 0 che si susseguono l'uno in coda l'altro e che
codificati contengono un'informazione. |
Avete mai sentito parlare di Codice Morse ? ... ebbene in
quel caso avremmo parlato di tratti e punti o suono corto e
lungo, qui invece il nostro messaggio è del tipo : |
10110001011000100101001010101010100000101011010110....... |
|
Inizieremo col dire, che la comunicazione seriale può avvenire
in due modi : Sincrona ed Asincrona, andiamo
quindi ad analizzarli. |
|
Comunicazione seriale Sincrona. |
|
Com'è facile intuire dalla parola, la comunicazione Sincrona,
avviene in presenza di un segnale di sincronismo, ovvero un
segnale di clock. |
La trasmissione seriale Sincrona prevede perciò due linee
distinte ... una per i dati, l'altra per il clock. |
Il clock è generato dalla fonte di trasmissione ed è
usato dalla fonte ricevente al fine di stabilire con
assoluta precisione la collocazione dei dati presenti sulla
prima linea. |
La trasmissione seriale Sincrona permette velocità di
comunicazione più elevate, rispetto alla Asincrona, ed è
possibile, a differenza della Asincrona, inviare interi
pacchetti di dati, preceduti da una sequenza di inizio (header)
e succeduti da una sequenza di fine (tail). |
Nella sequenza di fine è possibile include anche un codice
di controllo, per consentire al ricevente di effettuare una
verifica dei dati ricevuti. |
Le due Linee, chiamate SDA (Dati) ed SCL
(Clock), sono del tipo a collettore aperto (
elettronicamente parlando, richiedono
una resistenza di Pull-Up). La linea SDA e' di
tipo bidirezionale, e permette lo scambio dei dati tra i
dispositivi I2C collegati, mentre la linea SCL e'
unidirezionale e serve come clock per sincronizzare la
comunicazione.
Dispositivi comuni che usano questo metodo
di comunicazione sono ad esempio le EEPROM della famiglia 24Cxx. |
la Sequenza di inizio (Start - Header), in una trasmissione
di dati, prevede il passaggio
dallo stadio 1 a quello 0 della linea SDA mentre la
linea SCL è alta, ovvero con una durata di 1/2 periodo di
clock. |
La sequenza di fine (Stop - tail) prevede il passaggio da 0
ad 1, nel momento in cui SCL è alto, sempre con la durata di
1/2 periodo di clock. |
La condizione di riposo prevede che i due
segnali siano Alti. |
|
I dati vengono trasmessi a byte (8 bit alla volta), e alla fine della
sequenza troviamo un nono bit basso ( inviato dalla sezione
ricevente ), a conferma dell' avvenuta ricezione. Questo bit
è detto di ACKNOWLEDGE (ACK) |
Resta ancora da dire che il valore del Bit (Alto/Basso) è
valido solo quando il clock è alto, tutte le
variazioni sull'SDA sono da considerarsi irrilevanti quando
il clock e basso. |
La trasmissione del dato parte sempre dal bit più
significativo (MSB). |
|
|
Come è possibile vedere nella figura, il passaggio dal bit
Alto al Basso e viceversa, avviene sempre quando il clock è
basso. |
Ogni dispositivo collegato al bus I2C funge o da slave o da
master ed è identificato da un indirizzo univoco a otto bit
lo SlaveAddress. Lo SlaveAddress è un ottetto di Bit, i
primi 4 vengono rilasciati dal costruttore del componente
elettronico, i successivi 3 servono per indicare il
dispositivo sul Bus I2C (A0,A1,A2), l'ultimo è il R/W... il
master cambiando questo Bit, indica allo slave se vuole
leggere o scrivere. |
|
Un semplice I2C Bus per la comunicazione seriale possiamo
ottenerlo semplicemente realizzando lo schema sotto
riportato (famoso JDM) |
|
|
|
|
|
Ora vediamo invece come si può realizzare un semplice programmatore
I2C bus su porta parallela. |
|
Se analizziamo la piedinatura della porta LPT possiamo
tirare le prime cifre... |
|
|
I Pin dal 18 al 25 sono la nostra massa, decidiamo quale Pin
utilizzare per In, Out e Clock. |
|
Se stabiliamo per esempio come pin di Uscita il Pin 2 (D0)
Ingresso il Pin 10 (S6) e clock il pin 16(C2) uno schema
potrebbe essere il seguente |
|
|
|
Bisognerà ora realizzare un programma per scrivere sul Bus.
Il Software, dovrà in sintesi compiere 5 operazioni base : |
|
- inviare il segnale di start;
- trasmettere l'indirizzo dello slave;
- trasmettere l'indirizzo del particolare
registro interno su cui andare a scrivere (opzionale);
- trasmettere il dato da scrivere sul
registro;
- ricevere l'ancknowledge
- segnale di stop.
|
|
Vediamo ora qualche passaggio in Basic : |
|
***************************** |
|
Impostiamo i registri della porta |
Scl = &H37A
Sdaout = &H378
SdaIn = &H379 |
Invia la sequenza di start :
StartScritturaLettura:
'****************************************************************************
Output Sdaout, 0
Output Scl, 0
Return
'****************************************************************************
|
|
Inviare un Byte : SendByte:
'****************************************************************************
For i = 7 To 0
Step -1
Bit = ByteH And 2 ^ i
If Bit > 0
Then Bit = 1
Else Bit = 0
Output Sdaout, Bit
'******* clock. *******
Output Scl, 4
Output Scl, 0
'*********************
Next i
Output Sdaout, 1
Return
'**************************************************************************** |
|
|
Comunicazione seriale Asincrona. |
|
la prima cosa che si può dire della Comunicazione Seriale
Asincrona è che dispone di una sola linea di dati. Sembra
difficile, dopo aver studiato il metodo di Comunicazione
Sincrona, spiegare il come si faccia a ricostruire
l'informazione avendo a disposizione la sola linea dati ...
in realtà il tutto è supportato da una gran quantità di
regole standard senza le quali tutto questo sarebbe
impossibile. |
Le regole di cui sopra, impongono quindi determinate
caratteristiche Hardware e Software, tali per cui quando due
sistemi si trovano a dover comunicare, questi risultano
pienamente compatibili. |
Es. RS232 - RS422 - RS485 |
|
Abbiamo visto come uno dei compiti assegnati al clock, è anche quello di
avvisare la sezione ricevente di prepararsi a ricevere i
dati ... resta il fatto che nella comunicazione Asincrona
questo manca ... |
|
Vediamo quindi cosa accade quando inizia la trasmissione
del Byte...
Com'è facile intuire, viene inviata una sequenza di Start, questa è
necessaria affinché si metta in moto tutto il meccanismo. |
|
Supponiamo di avere una condizione di riposo e che quindi la
linea sia costantemente a livello logico 1 ... una
variazione dello stato logico, ovvero il passaggio da 1 a 0,
avverte il ricevente che la trasmissione è iniziata. A
questo punto, la sezione ricevente attiva un clock interno,
impostato ad una determinata velocità di decodifica dei
dati. |
le velocità consentite dallo Standard RS232 vanno da :
75 Bps a
128kBps. |
|
E facile comprendere quindi che, se le due parti sono state
configurate per una trasmissione a 19200Bps, avremo un treno
di bit in cui ogni bit avrà la durata di 52 microsecondi. |
Terminato il Bit di Start, la sezione ricevente, saprà
precisamente con quale frequenza interpretare i dati in
arrivo, inizierà quindi a leggere con la cadenza
preimpostata. |
Terminato il Byte avremo la sequenza di Stop, che nello
standard RS232 può prevedere 1, 1-1/2 o 2 Bit, questa volta
Alti ( cioè 1), che riporteranno la linea alla condizione di
riposo. |
|
|
|
la
sequenza di Bit, in questo caso va dal meno significativo LSB (D0) al più
significativo MSB (D7), applicando il Bit di Start (0) in
testa ed il Bit di Stop in coda. *************
E' importante a questo punto fare una considerazione.
la comunicazione seriale Asincrona spesso e volentieri
la si ritrova come Standard sui PC. Il Dato, in questo caso,
non nasce seriale ... non stiamo parlando di un bus
I2C dove tutti i componenti comunicano allo stesso modo su 2
Linee, Il nostro Dato è generato da un processore che
nel nostro caso usa un Bus Parallelo.
Quando dobbiamo quindi inviare un Byte è importante
sapere che, esiste un componente elettronico che esegue il
lavoro di trasformare un Byte da Parallelo in Seriale,
stiamo parlando della UART (Universal Asyncronous Receiver/Trasmitter)
************* |
Prima di finire, dobbiamo introdurre però un'altro Bit ... il
così detto Bit di parità,
che anticipa il Bit di Stop, e che è necessario al fine
di assicurare la corretta ricezione.
|
In realtà succede che il sistema risulta facilmente
disturbabile da interferenze esterne... ... inoltre
il Bit, a differenza della comunicazione Sincrona, non viene
letto durante il periodo di clock Alto, ma ( e questo anche a seconda delle
specifiche tecniche ) verrà interpretato magari sul fronte di salita
o di discesa del clock locale. |
|
Se si osserva la figura seguente, si può capire che
l'interpretazione del Bit avviene a volte anche a metà
periodo del Bit. |
|
|
ecco che, commutazioni improvvise dovute ad eventuali
interferenze, possono causare l'errata interpretazione del
Byte. Il Bit di parità ( a seconda del caso se Pari o
Dispari ) conferma la trasmissione. |
|
Se per esempio adottiamo un Bit di parità Pari, questo sarà
0 se il numero di bit nel Byte trasmesso è pari, se il
numero di Bit trasmessi e Dispari, il bit di parità sarà
Alto ... cosi che il numero di bit trasmessi sarà sempre un
numero Pari, avremo quindi : |
|
|
|
Il discorso sulla Comunicazione seriale Asincrona potrebbe
considerarsi terminato ... |
|
... per cercare però di ottenere un esempio pratico,
dobbiamo aprire una piccola parentesi ed affacciarci su un
esempio di Comunicazione Seriale Asincrona che ci sia il più
familiare possibile. |
Il caso più familiare che abbiamo, è proprio quello della seriale del
nostro PC. |
In più, a tutto quello che abbiamo detto fin ora sulla nostra
comunicazione, c'è da aggiungere che : |
Il treno di Bit mostrato nella figura precedente, viene
fuori da un particolare componente chiamato UART, costruito
per convertire i dati dal formato Parallelo ( così come
presenti sul Bus ) in Seriale. Questa sequenza di Bit ha 2
livelli logici ormai comuni che sono 0 e 1, ovvero 0V e 5V. |
|
Il segnale che troviamo sul nostro connettore seriale (9 o 25
Pin) posto sul retro di un PC è diverso, ed è diverso perchè... al fine di diminuire i disturbi e le
perdite di tensione sul cavo, lo standard RS232 ha adottato
livelli logici diversi ... il Bit vale 1 quando il
valore di tensione è compreso tra -3V e -25V, il Bit vale 0
quando il valore di tensione è compreso tra +3V e +25V. |
Siccome sui nostri PC le tensioni più alte disponibili sono
+12V e - 12V ... vengono adottate queste per la
trasmissione, avremo quindi il seguente risultato: |
|
|
|
I componenti interessati in questo frangente erano in
origine 2, un Driver di linea MC1488 in grado di traslare il
livello di tensione dallo stato TTL a quello RS232 con
relativa inversione, e preparare quindi il segnale ad essere
trasmesso. Alla ricezione, c'era un secondo componente l'
MC1489 ovvero un ricevitore di linea in grado di fare
l'operazione inversa ... ribaltare il segnale e riportarlo a
livello logico TTL. |
I tempi nel frattempo corrono, e questi due hanno lasciato il
posto ad un unico componente, Il Max232, molto più compatto
ed in grado di gestire contemporaneamente In e Out. |
|
L'architettura interna di una seriale da PC sarà quindi : |
|
|
|
analogamente uno schema per connettersi ad un
qualsiasi apparecchio con Comunicazione RS232 sarà : |
|
|
|
Questo in figura è uno dei tanti schemi che si trovano in
giro su Internet per la connessione con i Cellulari,
personalmente realizzato e testato. |
|
|
|
|
|
|
|
|
|