- Messaggi: 1
- Ringraziamenti ricevuti 0
dubbio trasferimento via i2c
11 Anni 7 Mesi fa - 11 Anni 7 Mesi fa #1
da andy91
dubbio trasferimento via i2c è stato creato da andy91
ciao a tutti, qualcuno può spiegarmi a cosa serve praticamente il bit ACKDT del registro SSPCON2?
(Ovviamente ho letto dal datasheet e non sono riuscito a capire).Sto utilizzando un pic 18f452 per la lettura della temperatura da un tc74 per poi visualizzarla su un display lcd e il mio prof ha fatto la seguente funzione:
#define idleI2C !(SSPSTATbits.R_W | SSPCON2bits.SEN | SSPCON2bits.RSEN | SSPCON2bits.PEN | SSPCON2bits.RCEN | SSPCON2bits.ACKSTAT | SSPCON2bits.ACKEN)
short int acquisizioneTC74(short int cmd){
short int resultI2C = -128;
SSPCON2bits.SEN = 1; // inizio una condizione di start
while(!idleI2C);
SSPBUF = 0b10011010; // invio indirizzo TC74 per scrittura bit R_W = 0
while(!idleI2C);
SSPBUF = cmd; // invio richiesta TC74 di temperatura
while(!idleI2C);
SSPCON2bits.RSEN = 1; // inizio una condizione di restart
while(!idleI2C);
SSPBUF = 0b10011011; // invio indirizzo TC74 per lettura bit R_W = 1
while(!idleI2C);
SSPCON2bits.RCEN = 1; // invio richiesta TC74 di temperatura
while(!idleI2C);
resultI2C = SSPBUF; // lettura risultato di misura dal registro SSPBUF
SSPCON2bits.ACKDT = 1; // Seleziono il NACK
SSPCON2bits.ACKEN = 1; // invio il NACK
while(!idleI2C);
SSPCON2bits.PEN = 1; // inizio la condizione di stop
while(!idleI2C);
return resultI2C;
}
EDIT: Mi spiego meglio... perchè non posso effettuare direttamente la condizione di stop dopo che ho letto il risultato da SSPBUF? Grazie
(Ovviamente ho letto dal datasheet e non sono riuscito a capire).Sto utilizzando un pic 18f452 per la lettura della temperatura da un tc74 per poi visualizzarla su un display lcd e il mio prof ha fatto la seguente funzione:
#define idleI2C !(SSPSTATbits.R_W | SSPCON2bits.SEN | SSPCON2bits.RSEN | SSPCON2bits.PEN | SSPCON2bits.RCEN | SSPCON2bits.ACKSTAT | SSPCON2bits.ACKEN)
short int acquisizioneTC74(short int cmd){
short int resultI2C = -128;
SSPCON2bits.SEN = 1; // inizio una condizione di start
while(!idleI2C);
SSPBUF = 0b10011010; // invio indirizzo TC74 per scrittura bit R_W = 0
while(!idleI2C);
SSPBUF = cmd; // invio richiesta TC74 di temperatura
while(!idleI2C);
SSPCON2bits.RSEN = 1; // inizio una condizione di restart
while(!idleI2C);
SSPBUF = 0b10011011; // invio indirizzo TC74 per lettura bit R_W = 1
while(!idleI2C);
SSPCON2bits.RCEN = 1; // invio richiesta TC74 di temperatura
while(!idleI2C);
resultI2C = SSPBUF; // lettura risultato di misura dal registro SSPBUF
SSPCON2bits.ACKDT = 1; // Seleziono il NACK
SSPCON2bits.ACKEN = 1; // invio il NACK
while(!idleI2C);
SSPCON2bits.PEN = 1; // inizio la condizione di stop
while(!idleI2C);
return resultI2C;
}
EDIT: Mi spiego meglio... perchè non posso effettuare direttamente la condizione di stop dopo che ho letto il risultato da SSPBUF? Grazie
Ultima Modifica 11 Anni 7 Mesi fa da andy91.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- andy91
- Autore della discussione
- New Member
Riduci
Di più
11 Anni 7 Mesi fa #2
da Mauro Laurenti
Risposta da Mauro Laurenti al topic dubbio trasferimento via i2c
Ciao,
il bit ACKDT viene usato solo quando il Master si trova in ricezione.
Quando riceve in byte deve inviare un segnale di ACK e il suo valore e' proprio ACKDT.
Dall'altro lato del bus ci deve essere un master in Trasmissione che aspetta per ACKSTAT e il valore che ricevera' sara' ACKDT del master che sta in ricezione.
Saluti,
Mauro
il bit ACKDT viene usato solo quando il Master si trova in ricezione.
Quando riceve in byte deve inviare un segnale di ACK e il suo valore e' proprio ACKDT.
Dall'altro lato del bus ci deve essere un master in Trasmissione che aspetta per ACKSTAT e il valore che ricevera' sara' ACKDT del master che sta in ricezione.
Saluti,
Mauro
Si prega Accedi o Crea un account a partecipare alla conversazione.
Moderatori: Mauro Laurenti, Pinna, StefA, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.