Tutorials - PIC18 by Data Sheet

 
 

MSSP - I2C

 

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:

  1. il Master trasmette l' indirizzo a 7 bit per uno Slave, con il bit R/W=1 per la lettura .
  2. lo Slave risponde con un ACK
  3. il Master viene programmato per la ricezione e invia il clock su cui lo Slave trasmetterà i dati
  4. completato il byte, il Master risponde con un ACK. Il Master non legge SSPBUF.
  5. il Master viene nuovamente settato per la ricezione e invia il clock su cui lo Slave trasmetterà i dati
  6. viene ricevuto un secondo dato, che genera un overflow (SSPOV=1) non essendo stato letto il precedente
  7. 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.

 


 

 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 15/01/12.