- Messaggi: 43
- Ringraziamenti ricevuti 0
I2C tra due Pic16 ma lo slave non "sente" lo START dal master
9 Anni 1 Mese fa #1
da Elby
I2C tra due Pic16 ma lo slave non "sente" lo START dal master è stato creato da Elby
Da due settimane sto cercando di mettere in comunicazione due pic16 tramite bus i2c a 100Khz. Ambedue hanno clock esterno dato da un oscillatore a 18,432 Mhz ed il bus (di soli 4 cm di lunghezza) l'ho forzato con due pull-up da 4,3 Kohm.
Vedendo con l'oscilloscopio, il master invia regolarmente il segnale di start quando previsto dal programma e prova ad inviare ad oltranza (non ricevendo l'ACK riprova) il byte di indirizzo ma lo slave non avverte l'abbassamento della linea dati e quindi non riceve "la partenza". La parte di programma dello slave che interessa i registri è:
.....
unsigned char address; //variabile in cui trasferire il buffer del bus I2C
TRISBbits.TRISB6=1; //linee I2C settate come ingresso
TRISBbits.TRISB4=1;
SSPCON1=0b00000110; //modulo MSSP settato come slave con indirizzo a 7 bit
SSPCON2=0x00;
SSPSTAT=0b10000000; //slew rate disabilitato per lavorare a 100 khz
SSPADD=0xAA ; //SLAVE_ADDRESS
PIR1bits.SSPIF=0; //azzera flag di interrupt modulo
PIR2bits.BCLIF=0; //azzera flag di collisione
while (1){
while (SSPSTATbits.BF==0){ //in attesa che il buffer sia pieno
address=SSPBUF; //salvo il dato in variabile vuota per azzerare BF
if (SSPCON1bits.SSPOV==1)
{SSPCON1bits.SSPOV=0;
}
if (PIR1bits.SSPIF==1)
{PIR1bits.SSPIF=0;
}
if (SSPSTATbits.S==1)
{PORTCbits.RC7=1; //led da accendere se si rileva lo start mentre il buffer non è ancora pieno
}
}
PORTCbits.RC4=1; //led da accendere se il buffer è pieno (BF=1)
....
....
Tengo a precisare che il master manda lo start e che gli è stato dato un valore SSPADD= (18432000/400000)-1
Quale potrebbe essere il problema ?
Vedendo con l'oscilloscopio, il master invia regolarmente il segnale di start quando previsto dal programma e prova ad inviare ad oltranza (non ricevendo l'ACK riprova) il byte di indirizzo ma lo slave non avverte l'abbassamento della linea dati e quindi non riceve "la partenza". La parte di programma dello slave che interessa i registri è:
.....
unsigned char address; //variabile in cui trasferire il buffer del bus I2C
TRISBbits.TRISB6=1; //linee I2C settate come ingresso
TRISBbits.TRISB4=1;
SSPCON1=0b00000110; //modulo MSSP settato come slave con indirizzo a 7 bit
SSPCON2=0x00;
SSPSTAT=0b10000000; //slew rate disabilitato per lavorare a 100 khz
SSPADD=0xAA ; //SLAVE_ADDRESS
PIR1bits.SSPIF=0; //azzera flag di interrupt modulo
PIR2bits.BCLIF=0; //azzera flag di collisione
while (1){
while (SSPSTATbits.BF==0){ //in attesa che il buffer sia pieno
address=SSPBUF; //salvo il dato in variabile vuota per azzerare BF
if (SSPCON1bits.SSPOV==1)
{SSPCON1bits.SSPOV=0;
}
if (PIR1bits.SSPIF==1)
{PIR1bits.SSPIF=0;
}
if (SSPSTATbits.S==1)
{PORTCbits.RC7=1; //led da accendere se si rileva lo start mentre il buffer non è ancora pieno
}
}
PORTCbits.RC4=1; //led da accendere se il buffer è pieno (BF=1)
....
....
Tengo a precisare che il master manda lo start e che gli è stato dato un valore SSPADD= (18432000/400000)-1
Quale potrebbe essere il problema ?
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Elby
- Autore della discussione
- Senior Member
Riduci
Di più
9 Anni 1 Mese fa #2
da Elby
Risposta da Elby al topic I2C tra due Pic16 ma lo slave non "sente" lo START dal master
Oggi ho provato anche ad usare come master pic18 ma con lo stesso risultato.
Aggiungo alle informazioni che del pic slave utilizzo i quattro moduli ccp in modalità pwm (1,25khz circa tramite timer2)
Aggiungo alle informazioni che del pic slave utilizzo i quattro moduli ccp in modalità pwm (1,25khz circa tramite timer2)
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Elby
- Autore della discussione
- Senior Member
Riduci
Di più
- Messaggi: 43
- Ringraziamenti ricevuti 0
9 Anni 1 Mese fa #3
da alfa75
Risposta da alfa75 al topic I2C tra due Pic16 ma lo slave non "sente" lo START dal master
Ciao Elby
io proveri a far funzionare una cosa alla volta
disattiva temporaneamente il pwm e vedi se ci sono cambiamenti ,perchè il timer2 viene usato sia dal modulo ECCP (quello pwm per intenderci) ma anche dallo MSSP(quello che gestisce lo spi e l'i2c)
poi hai messo le resistenze di pull-up sulle linee ?
io proveri a far funzionare una cosa alla volta
disattiva temporaneamente il pwm e vedi se ci sono cambiamenti ,perchè il timer2 viene usato sia dal modulo ECCP (quello pwm per intenderci) ma anche dallo MSSP(quello che gestisce lo spi e l'i2c)
poi hai messo le resistenze di pull-up sulle linee ?
Si prega Accedi o Crea un account a partecipare alla conversazione.
- alfa75
- Platinum Member
Riduci
Di più
- Messaggi: 527
- Ringraziamenti ricevuti 86
9 Anni 1 Mese fa #4
da Elby
Risposta da Elby al topic I2C tra due Pic16 ma lo slave non "sente" lo START dal master
Ho spostato il timer ad uso del pwm dal timer2 al timer4 ma non è aimè cambiato nulla.
Con l'oscilloscopio (analogico da 200Mhz) mi sono reso conto però che passando dall'oscillatore interno da 8 Mhz all'oscillatore esterno da 18,432 Mhz non riesco più a vedere chiaramente l'abbassamento della linea SDA in fase di start, è possibile che siano cambiate le velocità di trasmissione e che quindi lo slave (collegato allo stesso oscillatore) non riesca a rilevare ?
Con l'oscilloscopio (analogico da 200Mhz) mi sono reso conto però che passando dall'oscillatore interno da 8 Mhz all'oscillatore esterno da 18,432 Mhz non riesco più a vedere chiaramente l'abbassamento della linea SDA in fase di start, è possibile che siano cambiate le velocità di trasmissione e che quindi lo slave (collegato allo stesso oscillatore) non riesca a rilevare ?
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Elby
- Autore della discussione
- Senior Member
Riduci
Di più
- Messaggi: 43
- Ringraziamenti ricevuti 0
9 Anni 1 Mese fa #5
da Mauro Laurenti
Risposta da Mauro Laurenti al topic I2C tra due Pic16 ma lo slave non "sente" lo START dal master
Come frequenza usane una bassa (100Kb/s o meno).
Controlla bene l'indirizzo che invii.
Lo slave non deve rispondere allo start, ma alla fine dell'indirizzo, se lo riconosce suo, invia un ACK.
...niente altrimenti.
Saluti,
Mauro
Controlla bene l'indirizzo che invii.
Lo slave non deve rispondere allo start, ma alla fine dell'indirizzo, se lo riconosce suo, invia un ACK.
...niente altrimenti.
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.