I Registri I2C.
MSSP ha 6 registri per controllare il modo I2C.
SSPSR |
è lo shift register vero e proprio e non è direttamente
accessibile |
SSPBUF |
è il buffer dei dati in arrivo e partenza ed è leggibile e
scrivibile |
SSPSTAT |
è il registro di stato della comunicazione |
SSPCON1 |
è un registro di controllo del modulo I2C |
SSPCON2 |
è un secondo registro di controllo del modulo I2C |
SSPADD |
è il registro di indirizzo |
ai quali vanno aggiunti i registri per la gestione dell' interrupt (di
tipo periferico).
In ricezione, la combinazione SSPSR e SSPBUF crea un sistema a doppio
buffer. Quando il dato è completato in SSPSR esso viene copiato in SSPBUF,
così da poterne ricevere uno successivo, mentre l' unità centrale elabora
quello corrente. Un flag SSPIF viene settato per
comunicare l' avvenuta ricezione.
Durante la trasmissione invece si tratta di un buffer semplice: scrivendo
SSPBUF si scriveranno sia questo che SSPSR. Sarà quindi necessario
attendere la completa trasmissione del byte caricato nel registro di
scorrimento prima di caricare il successivo.
SSPSTAT
SSPTAT (SSP STATus) è il registro di status della comunicazione, ma contiene anche elementi
relativi al funzionamento come SPI. Da notare che in modo I2C
alcuni bit sono in comune con il modo SPI, ma hanno funzioni differenti.
Per I2C
il registro contiene:
- flag che indicano il
riconoscimento delle condizioni sul bus
- il flag di Buffer Full
- i bit di selezione dello
slew rate e della compatibilità SMBus
SSPSTAT |
bit |
SMP |
CKE |
D/A |
P |
S |
R/W |
UA |
BF |
funzione |
R/W |
R/W |
R |
R |
R |
R |
R |
R |
default |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
SMP
:
(Slew rate control) bit
di selezione dello slew rate
1 =
disabilitato per comunicazione in modo standard (100 kHz e 1 MHz)
0 =
abilitato, per la comunicazione in modo high speed (400 kHz)
bit 6
CKE
:
(SMBus selection) selezione
del modo
1
= abilita l' interfaccia per la compatibilità con SMBus
0 =
disabilita il modo SMBus
bit 5
D/A :
dato/indirizzo
in
modo Master
non
utilizzato - riservato
in
modo Slave
1 =
indica che l' ultimo bit ricevuto è un dato
0 =
indica che l' ultimo bit ricevuto è un indirizzo
Il bit è
azzerato al reset e quando viene azzerato SSPEN
bit 4
P : stop bit
1 = indica che è stato ricevuto uno Stop
0 = non
è stato ricevuto uno Stop
Il bit è azzerato al reset e quando viene azzerato SSPEN
bit 3
S : start bit
1 = indica che è stato ricevuto uno Start
0 = non
è stato ricevuto uno Start
bit 2
R/W : read/write
in
modo Master
1 = trasmissione di un
byte in corso
0 =
trasmissione non in corso
Un OR
con i bit SEN, RSEN, PEN, RCEN o ACKEN indica che MSSP è in modo ativo
in
modo Slave
1 =
read
0 =
write
Questo
bit conserva l' informazione R/W conseguente all' ultimo check valido di
indirizzo ed è valido solamente fino al prossimo Start, Stop o Ack
bit 1
U/A : (Update
Address bit)
Valido solo
in modo Slave a 10 bit
1 = l' utente necessita
dell' aggiornamento dell' indirizzo in SSPADD
0 = non
è richiesto aggiornamento
bit 0
BF : Buffer
Full
in
trasmissione
1 =
SSPBUF è pieno
0
= SSPBUF vuoto o non completo
in ricezione
1 =
SSPBUF è pieno (non include Stop e ACK)
0
= SSPBUF vuoto o non completo (non include Stop e ACK)
Vediamoli in particolare.
I primi due bit più
significativi,
SMP e CKE
servono a stabilire
come il modulo MSSP controlla i pin collegati al bus, quindi sono
da considerare essenzialmente in una fase di assegnazione iniziale per il
setup del modulo MSSP in funzione delle caratteristiche
attribuite al bus.
SMP
Questo bit controlla
lo Slew rate
, ovvero le rampe di commutazione dei segnali sul bus. Se viene lasciato a
0 (default) MSSP controllerà i segnali SCL e SDA in modo compatibile con
le temporizzazioni dello standard I2C nella modalità high
speed (400 kHz).
Se viene impostato a 1, i segnali sono adeguati a SMBus, ma anche al clock
di 100 kHz e 1 MHz.
Quindi questo bit sarà programmato in funzione delle caratteristiche
attribuite al bus.
CKE
- Questo bit seleziona la compatibilità con SMBus
Se a 0 (default) il modulo MSSP configura i pin per l' uso con lo standard I2C
Se viene programmato a 1, abilita l' interfaccia per la compatibilità con SMBus
Anche questo bit va programmato inizialmente in funzione
delle caratteristiche attribuite al bus.
I successivi 6 bit (D/A,
P,
S,
R/W, U/A,
BF) sono veri e propri flag del modulo MSSP.
E' fondamentale rilevare che:
- si tratta di flag a sola lettura, cioè non possono essere modificati
dall' utente.
-
Il loro valore è stabilito automaticamente dalla
logica del modulo MSSP a seconda della fase della comunicazione in corso.
-
Vanno a 0 a seguito dalla disabilitazione del modulo MSSP e/o dal Reset.
Alcuni sono validi solamente per
un modo di funzionamento Slave o hanno significato diverso in altre
configurazioni.
D/A
- Questo flag è valido solo in
modo Slave. In modo Master il suo valore non ha importanza.
Indica se l' ultimo byte ricevuto e presente in SSPBUF è un indirizzo o un
dato.
Questo permette al programma di gestione della comunicazione di individuare
con sicurezza la fase del protocollo in cui ci si trova in quel dato istante.
Se il flag è a 0, in SSPBUF è contenuto un indirizzo, altrimenti si tratta
di un dato.
Viene rimesso a 0 al Reset del microcontroller oppure quando il modulo MSSP è
disabilitato (SSPEN=0).
P
- Questo flag indica l'ultima condizione che è stata rilevata era
uno Stop (P = 1).
Va a 0 automaticamente quando un altro evento diverso da Stop viene ricevuto.
S
- Questo flag indica l'ultima condizione che è stata rilevata era
uno Start (S = 1).
Va a 0 automaticamente quando un altro evento diverso da Start viene ricevuto.
R/W
- ha due funzioni distinte a seconda se si lavora come Master o come Slave.
In modo Master, informa se è in corso un trasferimento di bit (1) oppure no (0).
Un OR
con i bit SEN, RSEN, PEN, RCEN o ACKEN indica che MSSP è in modo attivo,
ovvero sta completando una operazione e non può accettare alcun comando.
In modo Slave indica il valore del bit R/W, bit 0 del primo byte
inviato dal Master dopo la condizione di Start.
Se R/W è "0", è richiesta una scrittura, se è a "1", è richiesta una lettura.
Questo
bit conserva l' informazione R/W conseguente all' ultimo check valido di
indirizzo (ovvero se l' indirizzo dello Slave corrisponde a quello
richiesto dal Master) ed è valido solamente fino alla fine della sequenza,
ovvero alla prossima condizione di Start, Stop o Ack.
U/A
- Viene utilizzato esclusivamente in modalità Slave con indirizzo a 10 bit.
Il suo scopo è richiedere al programma di gestione il rinnovo del byte di
indirizzo contenuto in SSPADD e indispensabiule per la comparazione a due
bytes dell' indirizzo a 10 bit.
In realtà, si ha un solo registro a 8 bit per l' indirizzo e quindi, in modo a
10 bit, occorrono due comparazioni successive, la prima con i due bit più
significativi dell' indirizzo, la seconda con gli otto successivi.r
U/A
è un flag critico, nel senso che, fino a che è settati, costringe lo slave a
mantenere la linea SCL a livello basso, realizzando un clock stretching che
arresta la trasmissione col Master. Fino a che il flag non viene
cancellato dalla scrittura dell' indirizzo richiesto in SSPADD, il bus è
bloccato.
BF
- Indica se il registro SSPBUF è pieno (1) o vuoto (0).
I modo ricezione, indicherà se la ricezione è stata completata. In
trasmissione, indicherà se il byte scritto in SSPBUF è stato completamente
shiftato sul bus.
SSPCON1
E' il primo dei due registri di controllo della comunicazione.
Contiene:
- il bit di abilitazione dell' MSSP
- i bit della selezione dei vari modi di funzionamento in I2C
- il bit di abilitazione del clock stretching
- i flag di identificazione dell' overflow e della collisione
SSPCON1 |
bit |
WCOL |
SSPOV |
SSPEN |
CKP |
SSPM3 |
SSPM2 |
SSPM1 |
SSPM0 |
funzione |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
default |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
- bit 7
WCOL
: Write Collision Detect
durante
la trasmissione come Master
1 =
SSPBUF è stato sovrascritto mentre stava completando una trasmissione.
Il flag
va cancellato da software
0 = nessuna
collisione
-
bit 6
SSPOV
:
(Synchronous Serial Port OVerflow) Overflow in ricezione
in
modo SPI Slave
1
= è stato ricevuto un
byte mentre non era ancora stato scaricato il precedente
0 = no
overflow
- bit
5
SSPEN : (Synchronous Serial Port Enable)
1 =
abilita la funzione e configura i pin relativi
0 =
disabilita la funzione e rilascia i pin per altri usi
***
vedere nota successiva
- bit 4
CKP : (ClocK
release control bit) controllo del clock stretching
in
modo slave
1 =
rilascia il clock
0 =
applica il clock stretching
in
modo Master
non ha
alcuna funzione
- bit 3:0
SSPM3:0
: Mode select
1111 =
I2C Slave con indirizzo a 10 bit con interrupt per Start e Stop
1110 =
I2C Slave con indirizzo a 7 bit con interrupt per Start e Stop
1011 =
I2C Master firmware controlled
1000
= I2C Master
0111
= I2C Slave con indirizzo a 10 bit
0110
= I2C Slave con indirizzo a 7 bit
Va osservato che le combinazioni al di fuori di questo elenco sono
utilizzate per configurare il modulo MSSP come SPI
Il registro SSPCON1 dei PIC18F (enhanced) equivale interamente al
registro SSPCON dei PIC16 (mid-range). Vediamo i vari bit in maggiore
dettaglio.
SSPEN(bit
5),
CKP e i
quattro SSPM
(bit 3:0) sono bit di comando, usati nella configurazione iniziale del
modulo MSSP.
SSPEN
- E' la "chiave di avviamento" del modulo MSSP.
Programmato a livello 1 abilita il modulo.
Occorre ricordare che sarà necessario, prima di attivare il modulo:
- selezionare la
direzione dei pin SDA e SCL come ingressi
- selezionare la
modalità di funzionamento del modulo con gli
SSPM3:0
.
Programmando a 0 il bit SSPEN
, il modulo MSSP viene disabilitato. Questo cancella le operazioni
in corso, i flag attivi e rilascia per altri usi i pin SDA e SCL.
SSPM3:0
- Attraverso questi bit si definisce il modo di funzionamento del
modulo MSSP.
Va considerato che alcune combinazioni dei 4 bit sono riservate alla
modalità di interfaccia SPI e non vanno imposte nel caso di I2C.
Indica se il registro SSPBUF è pieno (1) o vuoto (0).
I modo ricezione, indicherà se la ricezione è stata completata. In
trasmissione, indicherà se il byte scritto in SSPBUF è stato completamente
shiftato sul bus.
CKP
- Questo bit è valido solamente se è selezionata una modalità
Slave.
il suo scopo è quello di effettuare il clock stretching (vedere
più avanti).
I rimanenti due bit sono dei flag indicatori di particolari condizioni
anomale.
WCOL
- E' valido, con funzioni diverse, sia in modo Master che in modo
Slave.
In modo Master questo flag va automaticamente a 1 quando si
sia tentato di scrivere il registro in SSPBUF in un momento in cui
questo non è possibile, ovevro non è ancora stata completata l'
azione precedente (ad esempio non è stato inviato o completato lo
Start oppure il bus non è libero). La scrittura in SSPBF, allora,
non ha alcun effetto.
In modo Slave indica che si sta cercando di scrivere in SSPBUF
mentre c'è ancora un dato in trasmissione. Anche qui, la scrittura
tentata non ha effetto.
Questo flag va rimesso a
zero da programma, una volta presa visione dell'
anomalia.
SSPOV
- E' un flag di overflow, che , andando a 1, indica che il modulo
MSSP ha ricevuto un byte, ma il precedente non è ancora stato letto
dal programma.
Il byte ricevuto in SSPSR non viene trasferito in SSPBUF. In
ricezione, il dato in SSPSR sarà copiato in SSPBUF quando il
contenuto di questo sarà letto e il flag cancellato (doppio
buffer).
Questo flag va rimesso a 0 da programma.
Va osservata la differenza
tra SSPOV
e
BF.
SSPCON2
SSPCON2 è il secondo dei
due registri di controllo della comunicazione.
Contiene essenzialmente:
- i bit di comando/flag di avvio delle condizioni.
Queste sono avviate portando il relativo bit a 1; il bit è cancellato
automaticamente dall' hardware quando la condizione è conclusa.
- l' abilitazione della General
Call
In modo Slave una parte dei bit
diventa la maschera dell' indirizzo. Il bit 0 dell' indirizzo a 7 bit non è
mascherabile, mentre quello dell' indirizzo a 10 bit viene mascherato contemporaneamente al bit 1.
SSPSTAT |
bit |
GCEN |
ACKSTAT |
ACKDT
ADMSK5 |
ACKEN
ADMSK4 |
RCEN
ADMSK3 |
PEN
ADMSK2 |
RSEN
ADMSK1 |
SEN
|
funzione |
R/W |
R/W |
R |
R |
R |
R |
R |
R |
default |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
GCEN
:
(General Call ENable) abilitazione
alla ricezione della General Call
solo
in modo Slave
1 = abilita
la ricezione della General Call
0 = Genereal
Call disabilitata
bit 6
ACKSTAT
:
(ACKnowledge STATus)
tipo di acnowledge ricevuto
solo in
modo Master
trasmettitore
1 = ACK
non ricevuto (NACK)
0 = ACK
ricevuto
bit
5
ACKDT
:
(ACK Data bit) selezione del livello dell' acknowledge
solo
per il modo Master ricevitore
1 = invia
NACK
0 = invia
ACK
ADMSK5:
solo per
il modo Slave
bit 5
della mascheratura indirizzio (mascheratura valida per il bit a 1)
bit 4
ACKEN
:
(ACK sequence ENable bit) abilita
la sequenza di acknowledge
solo
per il modo Master ricevitore
1 = inizia
la condizione di acknowledge
(livello determinato da ACKDT)
Cancellato
automaticamente dall' hardware.
0 = condizione
di ACK
idle
ADMSK4:
solo per
il modo Slave
bit 4
della
mascheratura indirizzio (mascheratura valida per il bit a 1)
bit 3
RCEN
:
(Receiver
ENable bit) abilita
la ricezione del Master
solo
per il modo Master ricevitore
1 = abilita
la ricezione del Master
0 = ricezione
idle
ADMSK3:
solo
per il modo Slave
bit 3
della mascheratura indirizzio (mascheratura valida per il bit a 1)
bit 2
PEN
:
(Stop
condition
ENable bit) abilita
l' avvio della condizione di Stop
solo
per il modo Master
1 = inizia
la condizione di Stop
Cancellato
automaticamente dall' hardware.
0 = ricezione
idle
ADMSK2:
solo
per il modo Slave
bit 2
della mascheratura indirizzio (mascheratura valida per il bit a 1)
bit 1
RSEN
:
(ReStart
condition ENable bit) abilita
l' avvio della condizione di Restart
solo
per il modo Master
1 = inizia
la condizione di Restart
Cancellato
automaticamente dall' hardware.
0 = Restart
idle
ADMSK2:
solo
per il modo Slave
con indirizzo a 7 bit
bit 1
della mascheratura indirizzio (mascheratura valida per il bit a 1)
solo
per il modo Slave
con indirizzo a 10 bit
bit 1e
bit 0 della mascheratura
indirizzio (mascheratura valida per il bit a 1)
bit 0
SEN
:
(Start condition ENable) bit
di avvio della condizione START
in modo
Master
1 =
inizia la condizione di Start. Cancellato automaticamente dall' hardware
0 =
condizione di Start idle
in modo
Slave
1 =
abilita il clock stretching sia in ricezione che trasmisione
0 = clock
stretching disabilitato
ADMSK2:
solo
per il modo Slave
con indirizzo a 7 bit
bit 1
della mascheratura indirizzio (mascheratura valida per il bit a 1)
solo
per il modo Slave
con indirizzo a 10 bit
bit 1e
bit 0 della mascheratura
indirizzio (mascheratura valida per il bit a 1)
Note
- per i bit ACKEN,
RCEN, PEN, RSEN, SEN : se il modulo MSSP è attivo, a seguito di particolari
condizioni, questi bit possono non essere settati e SSPBUF può non essere
scritto oppure la sua scrittura può essere disabilitata.
- Per maggiori informazioni
sulla funzione di mascheratura degli indirizzi, vedere più avanti.
|
SSPCON2 è presente anche
nei mid-range, con le stesse funzioni
I bit che contiene sono essenzialmente i comandi per generare le condizioni, ad
eccezione di GCEN
e RCEN:
GCEN
- Questo bit abilita il modulo MSSP alla ricezione e trattamento della
General Call (vedere più avanti i dettagli su questo elemento del
protocollo ), quindi è valido solo per le selezioni di modi Slave.
in modo Master non ha alcuna funzione.
Se si abilita questo bit, il PIC, come Slave, risponde non solo all'indirizzo
definito in SSPADD, ma anche a quello speciale riservato per la Generale Call (0x00).
I byte che seguono l' indirizzo, in questo caso, hanno funzioni specifiche o
riservate (per esempio comandare un reset software). Se si decide che il
microcontroller debba rispondere alla General Call, è a carico dell' utente
la gestione dell' evento.
RCEN
- Questo bit abilita il modulo MSSP Master a ricevere dati dallo Slave.
Attenzione alla differenza: il Master, abilitando RCEN, si apsetta dati in
arrivo dallo Slave, ma non viene configurato come Slave. Si tratta di Master
in condizione di ricezione (Master ricevitore).
Con RCEN programmato a 1 il modulo MSSP automatizza la ricezione del byte
dal bus, che sarà trasferito in SSPBUF per essere letto dal software.
Con il bit programmato a 0 il modulo trasmetterà sull bus il byte contenuto
in SSPBUB.
I bit rimanenti sono i comandi di
avvio delle condizioni.
In pratica il modulo MSSP genera le varie condizioni del protocollo I2C
in modo interamente automatico, dopo il semplice settaggio del relativo bit
di comando in SSPCON2. Quindi, livelli sul bus e temporizzazioni sono del
tutto trasparenti per l' utente, al quale, però, resta la condotta logica delle
operazioni.
I bit 6:4 sono dedicati alle condizioni di acknowledge.
ACKSTAT
- Indica se è stato ricevuto un NACK (=1) o un ACK (=0).
ACKDT
- Questo bit contiene il valore da attribuire all' acknowledge emesso dal
Master.
In pratica , le condizoni ACK e NACK sono del tutto identiche come tempi e
sequenza e si differenziano solo per il livello attribuito alla linea SDA,
che sarà a 0 per un ACK e a 1 per un NACK.
Il programma di gestione del Master, prima di far partire la condizione con
ACKEN, deve caricare in ACKDT il valore voluto per l' acknowledge: se l'
utente desidera genrare un ACK, ACKDT sarà posto a 1, l' inverso per
generare un NACK.
ACKEN
- Programmato a 1 genera sul bus la condizione di acnowledge con la
polarità stabilita in ACKDT.
I rimanenti bit avviano le altre condizioni.
PEN
- Programmato a 1 genera sul bus la condizione Stop.
RSEN
- Programmato a 1 genera sul bus la condizione di Repeated Start o Restart.
SEN
- Programmato a 1 genera sul bus la condizione di Start.
Molto importante da considerare è il fatto che i
bit 5:0 di SSPCON2, nell' MSSP degli Enhanced, si differenziano da
quelli dell' MSSP dei mid-range perhè, in
modo Slave, diventano la maschera dell' indirizzo.
Questo è possibile in quanto i questi bit sono funzionali nel modo sopra
descritto solo per il PIC programmato come Master. Come Slave non avrebbero
utilità.
Così, per il modulo MSSP dei PIC18F programmato in una modalità Slave,
diventano bit di maschera di indirizzo. Questa funzione è descritta più avanti
nel paragrafo che descrive l' indirizzamento.
SSPADD
SSPADD ha funzione completamente diversa nell' uso in modo Master
o
Slave .
SSPADD |
bit |
ADD7 |
ADD6 |
ADD5 |
ADD4 |
ADD3 |
ADD2 |
ADD1 |
ADD0 |
funzione |
R/W |
R/W |
R/W
|
R/W
|
R/W
|
R/W
|
R/W
|
R/W
|
default |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
-0
ADD7:0
:
in modo Slave
bit dell' indirizzo del modulo MSSP
in
modo Master
bit di selezione della frequenza del Baud Rate Generator
Nota:
-
Il Master non ha indirizzo, quindi,
quando l' MSSP è configurato in questa modalità,
il registro SSPADD
serve per la programmazione del Baud Rate Generator.
- Nel modo multi-Master
un Master può essere chiamato come Slave da un' altro Master e in tal
caso
dovrà operare come tale e abbisognerà di un indirizzo.
|
In modo Master, la funzione di BRG è descritta
più avanti.
In modo Slave, la funzione di indirizamento è anche descritta più
avanti.
Operazioni in I2C
Il modulo MSSP viene abilitato portando a 1 il bit SSPEN
(SSPCON1<5>). Lo stesso registro SSPCON1 consente, attraverso i bit
SSPCON1<3:0> di impostare il modulo per le seguenti modalità I2C:
- Master
- Slave con indirizzo a 7 bit
- Slave con indirizzo a 10 bit
- Slave con indirizzo a 7 bit e interrupt per le condizioni di Start e
Stop abilitato
- Slave con indirizzo a 10 bit e interrupt per le condizioni di Start e
Stop abilitato
- Master controllato da firmware, slave idle
Selezionando uno qualsiasi di questi modi si forzano i pin SDA e SCL ad
assumere una configurazione open drain per collegarsi al bus (su cui dovranno
essere presenti i pull-up).
|