I2C tra due Pic16 ma lo slave non "sente" lo START dal master

9 Anni 1 Mese fa #1 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 ?

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Elby
  • Senior Member
  • Senior Member
Di più
9 Anni 1 Mese fa #2 da Elby
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)

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Elby
  • Senior Member
  • Senior Member
Di più
9 Anni 1 Mese fa #3 da alfa75
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 ?

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • alfa75
  • Avatar di alfa75
  • Platinum Member
  • Platinum Member
Di più
9 Anni 1 Mese fa #4 da Elby
Ho spostato il timer ad uso del pwm dal timer2 al timer4 ma non è aimè cambiato nulla. :unsure:

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
  • Senior Member
  • Senior Member
Di più
9 Anni 1 Mese fa #5 da Mauro Laurenti
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

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Moderator
  • Moderator
Di più
Moderatori: Mauro LaurentiPinnaStefAMatteo Garia

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Login