Master in trasmissione dati
La trasmissione di un byte di dati, di un indirizzo a 7 bit o della metà di un indirizzo 10-bit avviene semplicemente scrivendo un valore di registro
SSPBUF.
Anche qui il modulo MSSP si occupa delle
temporizzazioni hardware
e, dell'immissione dei bit seriali sulla linea SDA e della generazione del
clock sincrono, ma resta all' utente la gestione della struttura logica
connessa.
La scrittura di SSPBUF setta il bit Buffer
Full BF e consente al baud rate generator di iniziare il conteggio e avviare la trasmissione. Ogni bit dei dati/indirizzo sarà
shiftato sul pin SDA dopo il fronte di discesa di SCL (vedi dati di temporizzazione
param. 106).
SCL è tenuto basso per un conteggio del BRG. I dati sono validi prima che
SCL
sia rilasciato e vada a livello alto (vedi dati di temporizzazione param. 107). Quando il pin
SCL viene rilasciato, si
avvia il BRG.
I dati sul pin SDA sono stabili per la durata del periodo a livello alto di
SCL
e alcuni istanti dopo la caduta di SCL.
Dopo l'ottavo bit, il flag BF viene
cancellato e il Master rilascia SDA. Questo consente al dispositivo Slave di rispondere con un
ACK
o un NACK durante il nono impulso di clock.
Lo status di ACK viene identificato nel bit ACKDT sul fronte di discesa del nono
impulso di clock; se il Master ha ricevuto questa condizione, il bit ACKSTAT è a zero. Se viene ricevuto un
NACK il bit va a 1.
Dopo il nono clock viene settato il bit SSPIF e e il baud rate generator è
arrestato fino a quando il prossimo byte di dati viene caricato in SSPBUF;
SCL
resta a livello basso, impegnando il bus e SDA resta al livello in cui era a
seconda del NACK o dell' ACK.
Il diagramma seguente riporta le operazioni di invio della sequenza
Start-indirizzo-dato:
La trasmissione del byte successivo
si svolge in modo analogo. Se il Master non ha altro da inviare, chiude la
trasmissione con una condizione di Stop P e rilascia il bus.
Il flag di interrupt SSPIF viene
attivato:
- al completamento dello Start
- all' arrivo dell' ACK
- all' arrivo del secondo ACK
- al completamento della condizione
di Stop
Questo permette sia una gestione in polling, testando il bit SSPIF, che va
cancellato da programma, sia una gestione in interrupt, abilitando la chiamata
dal modulo MSSP.
Il bit BF viene settato quando si scrive un dato in SSPBUF e si cancella
automaticamente quando l' invio del dato è completato.
Il bit WCOL viene settato se l' utente cerca di scrivere SSPBUF mentre è in
corso una precedente trasmissione. SSPBUF non viene sovrascritto. WCOL va
cancellato da programma.
Il bit ACKSTAT è portato a 0 quando
viene ricevuto un ACK e a 1 quando viene ricevuto un NACK.
Master in ricezione dati
La trasmissione di un byte di dati avviene automaticamente da parte del
modulo MSSP, che renderà il byte ricevuto nel di registro SSPBUF.
Anche qui il modulo MSSP si occupa delle
temporizzazioni hardware
,
della ricezione dei bit seriali sulla linea SDA e della generazione del clock
sincrono, ma resta all' utente la gestione della struttura logica
connessa.
La ricezione in modalità Master
deve essere attivata con il Receiver Enable bit, RCEN (SSPCON2<3>).
Anche il settaggio della modalità di ricezione è un evento che può essere
eseguito solamente se l' evento precedente è concluso.
Pertanto, prima di impostare il bit RCEN, il modulo MSSP deve
essere in idle. Se così non fosse, il settaggio del bit non viene eseguito. |
Il Baud Rate Generator inizia il conteggio e su ogni rollover viene cambiato lo
stato del pin SCL; gli impulsi di clock generati serviranno allo Slave
per
sincronizzare l' emissione dei dati, che vengono shiftati nel registro SSPSR. Dopo il
fronte di discesa dell'ottavo impulso di clock:
- il flag di enable della ricezione viene automaticamente
cancellato
- il contenuto del SSPSR viene copiato in
SSPBUF
- viene settato il flag BF
- viene settato flag SSPIF
- il Baud Rate Generator sospende
il conteggio
SCL resta a livello basso impegnando
il bus.
MSSP è ora in stato di inattività in attesa del comando successivo.
Quando
SSPBUF viene letto dalla CPU, il flag BF viene automaticamente cancellato. L'utente può quindi inviare
il bit di ACK settando il bit ACKEN (SSPCON2<4>).
Il diagramma seguente rappresenta un
esempio di Master in ricezione:
- il Master trasmette l' indirizzo
a 7 bit per uno Slave, con il bit R/W=1 per la lettura .
- lo Slave risponde con un ACK
- il Master viene programmato per
la ricezione e invia il clock su cui lo Slave trasmetterà i dati
- completato il byte, il Master risponde con un ACK. Il Master non legge
SSPBUF.
- il Master viene nuovamente settato per la ricezione e
invia il clock su cui lo Slave trasmetterà i dati
- viene ricevuto un secondo dato,
che genera un overflow (SSPOV=1) non essendo stato letto il precedente
- il Master chiude la ricezione
con un NACK seguito da uno Stop, che rilascia idle il bus
Il flag di interrupt SSPIF viene attivato:
- al completamento dello Start
- all' arrivo dell' ACK
- al completamento della ricezione del primo byte
- al completamento della condizione ACK
- al completamento della ricezione del secondo byte
- al completamento della condizione NACK
- al completamento della condizione di Stop
Questo permette sia una gestione in polling, testando il bit SSPIF,
che va cancellato da programma, sia una gestione in interrupt, abilitando la
chiamata dal modulo MSSP.
Il bit BF viene settato quando si scrive un dato in SSPBUF e
si cancella automaticamente quando l' invio del dato è completato. Viene
settato anche quando viene ricevuto un dato e resta settato fino a che SSPBUF
non viene letto.
Il bit SSPOV, indicatore di overflow, viene settato se è stato
ricevuto un byte mentre il precedente non era ancora stato letto
Il bit ACKSTAT è portato a 0 quando viene ricevuto o trasmesso un ACK
e a 1 quando viene trasmesso il NACK.
Da osservare che il bir RCEN di abilitazione della lettura viene
azzerato automaticamente alla fine della ricezione di ogni byte e se occorre
ricevere un ulteriore byte, deve essere settato nuovamente.
Diventa evidente il senso della logica dei vari flag:
- SSPIF: viene settato alla conclusione di ogni operazione
comandata dal master e che richiede un tempo di esecuzione. Va ricordato
ancora che il modulo MSSP può eseguire una operazione solo quando la
precedente è completata e il tempo di completamento dipende dalla
situazione del bus e dal valore di BRG.
SSPIF permette una gestione in interrupt, dove la CPU può svolgere altri
compiti mentre il modulo MSSP esegue l' ordine. In polling consente di
verificare la fine dell' evento prima di impostare il successivo.
La necessità di cancellare il flag da software è legata alla necessità
che il programma prenda visione dell' evento completato.
- BF: indica semplicemente che il buffer SSPBUF è pieno. Siccome
il buffer è unico, occorre che il programma legga il dato prima che lo
shift register ne acquisisca un' altro, che sovra scriverebbe il primo.
Il flag si cancella automaticamente non appena il buffer viene letto.
- SSPOV: indica che il programma ha mancato la lettura di un byte.
La necessità di cancellare il flag da software è legata alla necessità
che il programma prenda visione dell' anomalia.
- RCEN: una volta trasmesso un byte, il flag si disabilita. Questo
richiede una ri abilitazione per ogni successivo byte ricevuto, ma la
necessità di settarlo da programma fa si che la ricezione sia un atto
voluto dal programma. Va tenuto presente che solo dopo il settaggio di
RCEN il Master provvede a inviare il clock su SCL: fino a quel momento il
bus è impegnato (SCL=0), ma lo Slave indirizzato non trasmette.
Questo consente al Master di avere il tempo necessario per trattare il
dato ricevuto.