Newsgroup: it.hobby.elettronica.digitale
Titolo: Problema di Signal Integrity

Un po' di tempo fa vi scrissi di un problema con un ADC della Analog
AD7997. E' un ADC I2C ad 8 ingressi montato su una scheda di
acquisizione che è collegata ad una scheda con il micro mediante un
cavo piatto di circa 1.5m.
Gli ADC (ce ne sono due sul bus) comunicano mediante 4 fili: i 2
dell'I2C, un pin di START e un pin di BUSY.
Nella modalità 1 (da datasheet) il micro pone alto lo START per almeno
1us e l'ADC si accende. Contemporaneamente il BUSY viene messo basso
dall'ADC (è una sua uscita open-drain) e rilasciato al termina della
conversione. Dopo di che è possibile leggere, mediante I2C, il
registro con il valore risultante dalla conversione.
Con un cavo corto non ci sono problemi. Con il cavo da 1.5m spesso ci
sono problemi, basta toccare il cavo con la mano. Eppure i 4 segnali
sono tra di loro separati da masse e alimentazioni.
Quello che non va è che l'ADC impazzisce, continua a comunicare
correttamente in I2C (mi ritorna sempre gli ACK nel momento giusto) ma
il risultato del registro di conversione è sballato.
Con un oscilloscopio si vede chiaramente quando impazzisce: i byte del
registro di conversione anzichè essere 0 (l'ingresso dell'ADC è a
massa) diventano quasi casuali.
La cosa strana è che sui pin di START e BUSY non ho problemi di rumore
o spikes. Sull'oscilloscopio, anche quando l'ADC impazzisce, questi
segnali sembrano abbastanza puliti.
Il pin di START è alto per quasi 2us (il doppio del valore dichiarato
da datasheet).
Ho risolto in due modi: se metto in corto la resistenza serie messa
vicino al uC da 100R proprio per evitare problemi di ringing, il
problema scompare. Oppure con la resistenza da 100R montata, metto un
condensatore da 100pF sulla scheda di acquisizione sempre sul pin di
START.
A questo punto non so cosa fare e non riesco a spiegarmi perchè una
resistenza serie, che normalmente aiuta nei problemi di integrità dei
segnali, dà fastidio. Inoltre non mi spiego perchè l'ADC impazzisce
quando sull'oscilloscopio non vedo nessun problema.
Avete qualche idea in proposito?

 START.
Non hai parlato della resistenza di pull-up necessaria affinch� l'I2C
funzioni. Di che valore �? Prova a ridurla un po'.
Se invece ti sei dimenticato di metterla, ecco l'origine dei tuoi problemi.
:)
-- 
emboliaschizoide.splinder.com

Avete qualche idea in proposito?
Nel tuo caso  io metterei una resistenza di pullup da tutte e due le parti del
collegamento, sia su SCL che SDA questo per ridurre l'impedenza della linea e
l'influenza della capacit� del cavo, e toglierei quella da 100 ohm in serie.
Naturalmente pi� basso � il valore del pullup e meglio andranno le cose, dal
momento che non ti conviene mettere delle capacit� per evitare sfasamenti nei
segnali.
Se hai ancora problemi prova a ridurre la frequenza I2C fino a 100K o anche a
10K e metti un paio di condensatori da 100-220pF.
Togliere la 100 ohm ti espone a qualche problema con le cariche elettrostatiche,
ma I2C � nato per lavorare sullo stesso pcb e usarlo con un flat � di per se una
forzatura.
--
ciao
  Stefano

 :)
C'è c'è...

 quando sull'oscilloscopio non vedo nessun problema.
Secondo me c'� qualche pasticcio coi riferimenti (soprattutto per la 
parte analogica). Perch� non provi a postare uno schema di massima?
Ciao
Pasu

 parte analogica). Perchè non provi a postare uno schema di massima?
Lo schema è molto semplice e si tratta di 4 fili: SDA, SCL, BUSY e
START.
Su SDA e SCL c'è un pull-up da 1k0 sulla scheda micro. Sul pin BUSY un
pull-up da 10k (sempre scheda micro). Il pin START ha una resistenza
serie
da 100R sulla scheda micro.
Continuo a pensare che siano i segnali dell'I2C che sporcano lo START
e
fanno ripartire l'ADC in modo errato, anche se su oscilloscopio non si
vede
questo disturbo.

 e fanno ripartire l'ADC in modo errato, anche se su oscilloscopio non
 > si vede questo disturbo.
Forse non si vede perch� non c'�... Fissarsi su una possibile causa non 
aiuta molto alla risoluzione di un problema, non credi? Non � pi� saggio 
cercare anche altrove?
P.

 da 100R sulla scheda micro.
per il minimo sindacale, credo che dovresti mettere resistenze serie da
entrambi i lati del cavo, per evitare disturbi distruttivi e limitare la
corrente nei pin; credo che con qualche cap si possano fermare i
disturbi senza rallentare pericolosamente i fronti (si, nonostante la
presenza di una buona isteresi sugli ingressi I2C, esiste un limite ai
tempi rise_fall);  gli stessi cap riducono il crosstak tra i diversi
segnali.
dalla parte del uC usi una periferica I2C oppure e' fatto col SW ?
hai rispettato tutte le tempistiche dichiarate ?
devi acquisire ad alta velocita' o puoi rallentare la comunicazione ?
(che spero sia alla bassa velocita')
saluti
-- 
  lowcost