Newsgroup: it.hobby.elettronica.digitale
Titolo: I2C,quando slave ACK e il master NACK

Salve
 
ho sempre avuto paura dell'I2C,può essere molto complicata
 
http://tinyurl.com/j3qvfrc
 
 
a volte mi sembra che l'SPI in confronto sia poco più che un bitbang 
svolto da un hardware dedicato
 
Con 2 uC Freescale Kinetis devo parlare con un RTCC
 
Il 1° uC è supportato da CodeWarrior,
ho usato senza alcun problema un componente software I2C già fatto
 
Passo al 2° uC ,più potente e recente e devo usare Kinetis Design Studio.
Non c'è un componente simile (c'è,ma non per questo micro)
per cui vado a basso livello,prima smanetto un pò coi registri,tanto per 
toccare con mano,poi passo ad un livello di astrazione appena + 
alto,usando i driver HAL,che alla fine sono spesso un "scrivi il tal 
valore nel bit del registro" utilizzando però termini più immediati e 
intuitivi.
 
Sarà che sono scarso e arrugginito in I2C,
Uso il uC come master,mando START,mando l'indirizzo del device(sempre 
verificando con oscilloscopio)
mi trovo che al 9° impulso di clock il bit di ACK,è a 1/2 VDD..
Come se lo slave volesse tirarlo basso e il master tirarlo alto.
 
Colpa dello slave?
Mi scrivo una funzione di I2C software,con bitbang GPIO,e tutto fila liscio.
 
E' il uC,o meglio è il modo errato in cui io lo stavo usando.
C'è un registro di indirizzo A1,ma io dico che non mi serve cosa 
contenga ,visto che scrivo io nel registro dato D cosa mandare,infatti 
vedo uscire ciò che scrivo in D.
Solo che nel caso di primo byte,se questo non è coerente con quanto 
scritto nel registro A1,il master mi manda un NACK,che fa il tiro alla 
fune con il ACK dello slave
 
In particolare se io forzo in D 0xAE  devo avere in A1 l'indirizzo 
shiftato a dx di 1,ossia 0x57
 
E' normale che il master I2C controlli il bus in questo modo?
 
Grazie a buon inizio d'anno,
 
anche se in Corea coi fuochi stanno esagerando
 
 
 
 

 fune con il ACK dello slave
 
La cosa che trovo strana č che lo slave tenti di forzare un livello alto.
Di solito i dispositivi I2C usano uscite open drain, sia per SDA che per
SCL.
 
-- 
Fletto i muscoli e sono nel vuoto.

 SCL.
 
Infatti e' impossibile, c'e' un problema hardware o di configurazione dei registri .
 
Giulia
 
 


si ...è il master,che apparentemente "forza" un livello alto,dico così 
perchè se semplicemente rilasciasse SDA,questo sarebbe o alto o basso ,a 
seconda di cosa fà lo slave..
in effetti,come sottolineate voi,è una cosa abbastanza anomala da poter 
dire che è un problema elettrico estraneo del protocollo i2C
sto ancora cercando di fare tornare i conti

 Come se lo slave volesse tirarlo basso e il master tirarlo alto.
 > [...]
 
Non è che ti manca qualche pull-up, interno oppure esterno al uC, e 
quindi quel livello a metà indica che entrambi i device (master e slave) 
sono in alta impedenza?
 


eh no,perchè il pullup c'è fisicamente e l'ho + volte misurato(2 res da 
10K)e sono assolutamente collegate ai pin
 
 


copio e incollo a costo di mostrare ANCHE le mie carenze angloanglofone
 
 
Just solved,
 
it was absolutely my fault,a wrong assumption
but the datasheet did not helped me
 
there is a bit that i never used and not present in other Freescale 
uControllers i worked with (KL family), and i was not aware of its existence
 
is the bit ODE(OpenDrainEnable) in pin configuration,missing in the 
KLfamily,i assumed erroneously that pin configuration was the same after 
a rapid glance,and that once choosed an alternate I2C function for the 
pin ,everything would have been in I2C style
 
Things are differents..
 
And is clearly showed:
Open drain configuration is valid in all digital pin muxing modes
 
No mention to this pin in the whole I2C chapter
and the I2C initialization component does not affects this bit
 
So i could say
not a bug in the uc,compliant to its reference manual
maybe a lack in library,probably inherited from uC with less features
As i told it's mainly my fault
 
 
Grazie per l'aiuto
 
PS
Inizio anno abbastanza attivo per il ng ,anche se in questo caso ne 
avrei fatto a meno