Tutorials - PIC18 by Data Sheet

 
 

MSSP - I2C


 

Il Baud Rate generator

Nel modo Master un baud rate generator (BRG) è disponibile per produrre il clock della comunicazione.

Il valore di questa frequenza è programmabile scrivendo i 7 bit meno significativi di SSPADD.


Va osservato che:
  1. la funzione di generazione del clock è riservata ai Master sul bus, sia quando trasmettono che quando ricevono.
     
  2. Pertanto SSPADD ha lo scopo di permettere la programmazione del Baud Rate quando MSSP è selezionato come Master.
     
  3. In modalità Slave, una periferica I2C NON genera il clock. Quindi, quando MSSP è programmato in uno dei modi Slave, la funzione di Baud Rate Generator non è presente.
     
  4. Però, per lo Slave, lo stesso registro SSPADD assume la funzione di contenere l' indirizzo attribuito allo Slave, nelle modalità descritte più avanti.


Ogni volta che viene effettuata una scrittura di SSPBUF, il baud rate generator inizia il suo conteggio.Il BRG è un count down ed è decrementato 2 volte per ogni ciclo di istruzione (Tcyc).
Una volta che l' operazione in corso è completata, il clock viene arrestato e SCL rimane nell' ultimo stato in cui si trovava.

E' possibile leggere e scrivere il registro SSPADD in ogni momento. La possibilità di scrittura è utile in quanto il valore contenuto nel registro viene passato al BRG ogni qual volta esso deve iniziare un conteggio, per cui è possibile cambiare la frequenza del clock durante il funzionamento, ad esempio per comunicare con una periferica più veloce o più lenta di quanto attribuito genericamente al bus, oppure per effettuare configurazioni automatiche del Master.

La sorgente del BRG è il clock principale Fosc. Il valore della frequenza dipende dalla relazione:

baud_rate = Fosc 7 [ 4 * (BRG+1)]

dove BRG è il valore scritto in SSPADD, ovvero:

BRG = (Fosc / (4 * baud_rate) ) -1

La seguente tabella presenta alcuni esempi delle frequenze ottenibili, mettendo in relazione il clock principale con il baud rate generato per la comunicazione seriale.

Fosc
[MHz]
BRG
[hex]
baud_rate
[kHz]
40 0x18 400
0x1F 312.5
0x31 200
0x63 100
32 0x13 400
0x27 200
0x4f 100
16 0x09 400
0x0C 308
0x27 100
10 0x09 400
0x13 200
0x27 100
8 0x04 400
0x09 200
0x13 100
4 0x00 1 MHz
0x02 333
0x04 200
0x09 100

Avendo BRG disponibili solo 7 bit, il numero massimo impostabile sarà 0x7F (127 decimale).

Va notato che l' interfaccia non è perfettamente conforme alla specifica I2C per la frequenza di 400 kHz (o 333 kHz e 1MHz), ma può essere utilizzata con un attimo di attenzione e verifica sull' applicazione. 

Il BRG e la logica di controllo relativa hanno anche lo scopo di fornire le temporizzazioni necessarie durante la gestione delle condizioni. In particolare, temporizza gli impulsi del clock, la durata delle condizioni, le scansioni dei livelli del bus per individuare condizioni imposte e stati di conflitto.

Inoltre, il BRG in modo Master supporta la sincronizzazione del clock necessaria alle operazioni di arbitraggio nei sistemi multi-Master.

Sul clock sono possibili due funzioni speciali:

  • il clock stretching , riservato agli Slave
  • l' arbitraggio del clock, indispensabile nei sistemi multi-Master

Arbitraggio del clock

L' arbitraggio del clock è una funzione specifica del Master ed è utilizzata per la sincronizzazione nei sistemi multi-Master.

Si verifica quando il Master, nel corso di uno scambio di dati o delle condizioni di Restart o Stop, rilascia il pin SCL (che va a livello alto).
Quando il pin SCL è rilasciato, il Baud Rate Generator (BRG) sospende il conteggio per tutto il tempo in cui il pin SCL è campionato alto. Quando SCL viene campionato alto, il generatore di baud rate è ricaricato con il contenuto del registro SSPADD <6:0> e
inizia il conteggio. Questo assicura al livello alto di SCL al minimo il tempo di un periodo di BRG nel caso in cui la linea del clock è tenuta bassa da un dispositivo esterno.

Il diagramma seguente esemplifica i segnali relativi:


Clock Stretching

Il clock stretching è una funzione tipica della modalità Slave.

E' l' unica situazione in cui lo Slave può manipolare la linea del clock.

Un allungamento (stretching) del tempo di clock ha lo scopo di dare allo Slave più tempo per sistemare il dato ricevuto o per preparare quello da trasmettere.

In modalità Slave, sia a 7 che a 10 bit, è possibile implementare lo stretching del clock automatico durante una sequenza di trasmissione. Il bit SEN (SSPCON2 <0>) = 1 permette che il clock sia esteso: la linea SCL sarà tenuta a livello baso dallo Slave alla fine di ogni blocco di dati ricevuti. Questo permette allo Slave di avere più tempo a disposizione per il trattamento del dato ricevuto, rallentando la trasmissione del Master.

Clock stretching in ricezione

In modalità di ricezione Slave con indirizzo a 7 bit, sul fronte di discesa del nono impulso di clock, alla fine della sequenza ACK, se il BF è a 1, il bit CKP nel registro SSPCON1 è automaticamente azzerato, costringendo l'uscita SCL a livello basso
Per rilasciare la linea occorre che il bit CKP sia azzerato da programma.
Il bit CKP deve essere impostato a 1 da programma prima del la ricezione. Tenendo la linea SCL a livello basso, l'utente ha il tempo di servire l' interrupt del modulo MSSP o, comunque, leggere il contenuto di SSPBUF prima che il Master avvii la trasmissione del dato successivo. Questo consentirà di evitare overflow del buffer e sospensioni indesiderate della comunicazione.

Va notato che se SEN=1, il che abilita il clock stretching automatico, occorre una particolare attenzione nel programma di gestione per cancellare le condizioni di stretching, che, altrimenti, terrebbero bloccato il bus.

Va notato, inoltre, che, anche se SEN=1, il che abilita il clock stretching automatico, dove non è necessario può essere evitato:

  • se l'utente legge il contenuto di SSPBUF prima che del fronte di discesa del nono impulso di clock
    orologio nono, il bit BF viene azzerato e il bit CKP non verrà cancellato; in questo modo non si effettua lo stretching del clock (che non sarebbe necessario, in quanto il dato ricevuto è già stato letto).
     
  • Il bit CKP può essere imposto a 1 dal software indipendentemente dallo stato del bit BF per cancellare comunque lo stretching. L' utente deve fare attenzione, però, a cancellare il bit BF (e SSPIF) prima della prossima ricezione al fine di evitare una condizione di overflow (SSPOV=1) che abortirà la comunicazione.

Nel modo Slave con indirizzo a 10 bit, durante la ricezione dell' indirizzo lo stertching del clock avviene automaticamente, ma CKP non va a zero. Lo stretching è iniziato se il bit è UA è a 1 dopo il nono impulso del clock.
Ricordiamo che UA=1 dopo aver ricevuto il byte alto dell' indirizzo a 10 bit e questo indica la necessità di aggiornare SSPADD con il valore della parte bassa dell' indirizzo. Inoltre UA =1 dopo la ricezione di questo secondo byte, per richiedere l' aggiornamento di SSPADD in modo che sia pronto per una futura ricezione.
La linea SCL viene rilasciata dallo Slave al momento di aggiornamento dell' aggiornamento di SSPADD.
Lo stretching si verificherà, poi, su ogni ricezione di dati come descritto per il modo a 7 bit..


Clock stretching in trasmissione

In modalità Slave di trasmissione, con indirizzo a 7 bit, il clock viene esteso, portando CKP = 0 dopo il fronte di discesa del nono impulso del clock.
Questo si verifica indipendentemente dello stato del bit SEN, ma solo se BF=0.
L'utente deve settare il bit CKP prima della trasmissione.
Tenendo la linea SCL a livello basso, si blocca il bus, ampliando il tempo di servizio della trasmissione e il caricamento dei dati in SSPBUF prima che il Master possa avviare un' altra trasmissione con il suo ACK.

Il diagramma esemplifica la situazione dei segnali:

In modalità Slave di trasmissione, con indirizzo a 7 bit, il clock stretching è controllato durante la ricezione dei 2 byte di indirizzo dallo stato del bit UA, esattamente come nel modo di ricezione Slave a 10 bit.
I primi due bytes di indirizzo sono seguiti da un terzo indirizzo che contiene il byte alto e il bit R / W =1 (richiesta di lettura dallo Slave, che, quindi, dovrà trasmettere dati).
Dopo il secondo aggiornamento di SSPADD, il bit UA non viene più settato; il modulo è ora configurato in modalità di trasmissione e lo stretching del clock è controllato dal flag BF come nella modalità Slave a 7 bit.

Va notato che:

  • il bit R/W del primo byte di indirizzo è a 0 per scrivere il secondo byte di indirizzo.
     
  • il bit R/W del terzo byte di indirizzo è a 1 per indicare la richiesta di invio dati.

Nell' esempio del diagramma qui sopra, il Master chiude la trasmissione di dati dello Slave con uno Stop (P).


Temporizzazioni della condizione di Start.

Tutte le operazioni di generazione della condizione di Start sono realizzate dal modulo MSSP in modo automatico.
All''utente è demandata la gestione della logica del protocollo e della risoluzione di eventuali situazioni anomale.

Abbiamo visto che per avviare la condizione di Start, l' utente porta a 1 il bit SEN (SSPCON2<0>).
Vengono campionati
SDA e SCL e se sono entrambe a livello alto si suppone che il bus sia idle. Il baud rate generator viene caricato con il valore contenuto in SSPADD<6:0> e inizia il conteggio.
Se SCL e SDA sono campionate a livello alto quando il BRG ha esaurito il conteggio, il pin SDA viene portato a livello basso. Questo intervallo di tempo ha lo scopo di verificare l' effettivo stato idle del bus.
L' azione di portare a livello basso SDA con SCL a livello alto fa si che il flag S (SSPSTAT<3>) sia portato a 1.  Subito di seguito, il BRG viene ricaricato e riparte il conteggio. Quando BRG ha esaurito il tempo, il bit SEN viene automaticamente cancellato e il bit SSPIF viene settato

Se all'inizio della condizione di avvio, i pin SDA e SCL sono campionati a livello basso o se, durante la condizione di avvio, la linea SCL è campionata a livello basso prima che la linea SDA sia portata a livello basso, questo indica che c'è una collisione sul bus con un altro dispositivo che sta trasmettendo. Quindi il Bus Collision Interrupt Flag, BCLIF, è portato a 1, la condizione di Start viene interrotta e il modulo I2C passa in stato di inattività.

Se l'utente scrive il SSPBUF quando una sequenza di avvio è in corso, il flag WCOL viene portato a livello 1 e la scrittura non si verifica, lasciando invariato il contenuto del buffer.

Da notare che, siccome non è consentito accodare eventi, ma occorre attendere la fine di quello in corso prima di comandare il modulo MSSP per un' altro evento, la scrittura dei i 5 bit inferiori di SSPCON2 è disattivata fino a quando la condizione di Start è stata eseguita completamente.

Possiamo osservare le funzioni specifiche dei flag:

  • SEN: è l' "interruttore" che genera lo Start, portandolo da programma a livello 1.
    Ma è anche un indicatore, in quanto torna automaticamente a zero quando l' evento è completato.
     
  • S: questi flag indica che sul bus è stata verificata una condizione di Start. Ricordiamo che i pin sul bus I2C hanno contemporaneamente funzione di uscita open drain e di ingresso Schmitt trigger
     
  • SSPIF: il flag indica il completamento dell' operazione con la possibilità, se abilitato, di chiamare un interrupt.
    Non viene cancellato automaticamente, ma va cancellato da programma, proprio perchè occorre che il programma gestisca le fine dell' evento concatenando il successivo. Inoltre, da modo di applicare una gestione in interrupt, dove il processore, una volta lanciato il comando della condizione, può svolgere altre attività.
     
  • WCOL: indica un errore nella gestione della comunicazione, dove si è cercata di avviare una operazione mentre la precedente era ancora in corso.
     
  • i flag di SSPCON2 hanno proprio lo scopo di evitare questo errore: nel momento in cui uno di essi è settato, il modulo MSSP non è libero di accettare un nuovo comando.

Temporizzazioni della condizione di Restart.

Tutte le operazioni di generazione della condizione di Restart sono realizzate dal modulo MSSP in modo automatico.
All''utente è demandata la gestione della logica del protocollo e della risoluzione di eventuali situazioni anomale.

Abbiamo visto che per avviare la condizione di Restart, l' utente deve portare a 1 il bir RSEN (SSPCON2<1>). Come per la condizione di Start, il bus deve essere idle.
Quando RSEN viene programmato alto, la linea SCL va a livello basso e lo stato della linea è campionato. Se SCL è andato a livello basso, il BRG inizia il conteggio. SDA resta a livello alto per un conteggio al cui termine la linea viene campionata: se si trova a livello alto, SCL viene rilasciata e va anch' essa a livello alto a causa dei pull-up.

Ancora SCL viene campionato e se trovato a livello alto, il BRG viene ricaricato: SCL e SDA sono campionate per un periodo del conteggio e devono risultare entrambe a livello alto. Questo viene seguito dall' invio a livello basso della linea SDA per un periodo di conteggio del BRG, durante il quale SCL resta a livello alto. La sequenza, quindi, è composta da uno Start e da uno Stop.

Al termine, il bit RSEN viene cancellato automaticamente e il BRG non viene ricaricato, lasciando SDA a livello basso, impedendo ad altri dispositivi di accedere al bus. Come per la condizione di Start, il bit S (SSPSTAT<3>) viene settato e, al momento del time out di BRG, viene settato anche il bit SSPIF.

Come per gli altri eventi, occorre attendere la fine della condizione prima di iniziare un nuovo evento. Quindi, se RSEN è stato settato mentre qualsiasi altro evento è in corso, non avrà effetto.

Si verifica una collisione sul bus durante la condizione di Restart se:

  • SDA è campionato basso quando SCL va da livello basso a livello alto.
  • SCL va basso prima che SDA vada basso. Ciò potrebbe indicare che un altro Master sta tentando di trasmettere un dati a livello alto.

Immediatamente dopo il settaggio del bit SSPIF, l' utente può scrivere l' indirizzo dello Slave da chiamare in SSPBUF, nel modo a 7 bit, oppure la prima parte dell' indirizzo a 10 bit. In ogni caso, dopo la trasmissione di un byte e la ricezione dell' ACK corrispondente, l' utente può far seguire ulteriori bytes di dati.

Come per le altre condizioni, non è consentito accodare eventi, ma occorre attendere la fine di quello in corso prima di comandare il modulo MSSP per un' altro evento e la scrittura dei i 5 bit inferiori di SSPCON2 è disattivata fino a quando la condizione di Restart è stata eseguita completamente. 
Se l'utente scrive il SSPBUF quando una sequenza di avvio è in corso, il flag WCOL viene portato a livello 1 e la scrittura non si verifica, lasciando invariato il contenuto del buffer.


Temporizzazioni della sequenza di ACK.

Tutte le operazioni di generazione della condizione di ACK/NACK sono realizzate dal modulo MSSP in modo automatico.
All''utente è demandata la gestione della logica del protocollo e della risoluzione di eventuali situazioni anomale. In particolare, la presenza di situazioni di overflow o errori nella gestione del modulo fanno si che esso generi un NACK invece di un ACK.

Come abbiamo visto per le altre condizioni, anche per la generazione dell' ACK il modulo MSSP fornisce un completo supporto hardware che per la gestione del bus e le corrette temporizzazioni e l' avvio della condizione si riduce al settaggio di pochi bit.
Di nuovo,
resta all' utente la gestione della struttura logica connessa e, in particolare, la necessità di verificare il completamento della condizione precedente prima di avviare l' ACK. In particolare, se l' utente cerca di scrivere SSPBUF prima del completamento della sequenza di ACK, il flag WCOL viene settato e la scrittura sul buffer non ha effetto.

Quando il bit ACKEN viene settato, SCL viene mandata a livello basso, mentre il contenuto del bit ACKDT viene copiato su SDA.
In sostanza, dato che ACK e NACK hanno una identica struttura, ma si differenziano solamente per il valore su SDA, la funzione dei due bit è semplice:

bit funzione
ACKEN = 1 avvia la sequenza ACK o NACK
ACKDT = 0 invia un ACK sulla linea SDA
ACKDT = 1 invia un NACK sulla linea SDA

Occorrerà quindi impostare ACKDT prima di ACKEN.

Il BRG conta un ciclo, dopo di che SCL viene rilasciata a livello alto. Se SCL viene campionata a livello alto, il BRG conta un'altro ciclo, quindi abbassa SCL, generando il nono bit del clock.
ACKEN viene cancellato automaticamente alla conclusione della condizione, segnalando alla CPU che il modulo MSSP è libero per accettare un ulteriore comando. SCL è a livello basso, mantenendo impegnato il bus.

Il diagramma rappresenta la sequenza di ACK. Identica è quella di NACK, solamente la linea SDA è a livello 1.

il flag SSPIF viene settato alla conclusione della ricezione (dopo l' ottavo impulso di clock) e alla fine della sequenza di ACK. In entrambi i casi va cancellato da software.


Temporizzazioni della condizione di Stop.

Tutte le operazioni di generazione della condizione di Stop sono realizzate dal modulo MSSP in modo automatico.
All'utente è demandata la gestione della logica del protocollo e della risoluzione di eventuali situazioni anomale.

ACK e NACK non terminano la comunicazione, in quanto n on rilasciano il controllo del bus (mantenendo SCL a livello basso).
Per terminare la comunicazione e rendere libero il bus occorre generare una condizione di Stop.
Come abbiamo visto per le altre condizioni, anche per la generazione dello Stop il modulo MSSP fornisce un completo supporto hardware che per la gestione del bus e le corrette temporizzazioni e l' avvio della condizione si riduce al settaggio di un bit, ma, di nuovo, occorre ricordare che resta all' utente la gestione della struttura logica connessa agli eventi.

La condizione di Stop viene avviata scrivendo a 1 il bit PEN (SSPCON2< >).
Alla fine di una trasmissione o ricezione di dati la linea SCL è a livello basso dopo il fronte di discesa del nono impulso di clock.
Se PEN viene programmato a 1, il modulo MSSP porta a livello basso la linea SDA. Quando questa linea viene campionata a livello basso, il BRG viene avviato ed al termine del ciclo la linea SCL è rilasciata, ovvero va a livello alto. Il BRG effettua un altro ciclo di conteggio e viene rilasciata anche la linea SDA. Dopo un ulteriore conteggio di BRG l' evento di Stop è concluso e il bit PEN viene cancellato automaticamente.

Il flag SSPIF viene portato a uno al termine della condizione; va cancellato da software.
Contemporaneamente il flag P va a 1.

Come per le condizioni precedenti, se l' utente cerca di scrivere SSPBUF prima del completamento della sequenza di ACK, il flag WCOL viene settato e la scrittura sul buffer non ha effetto.

 


 

 

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