I2C funziona solo quando viene sondato o caricato con 1Mohm


9

Sto cercando di risolvere i problemi di comunicazione tra un msp430fr5847 (master) e un sensore slave con chip I2C sconosciuto (parte di un sensore industriale)

Sto riscontrando problemi con un nuovo batch di sensori in cui i miei dati vengono restituiti con tutti zeri, tuttavia quando provo a risolvere i problemi con il mio Saleae logic pro (2Mohm, 10pf) o il mio oscilloscopio (10Mohm, 50pf) il sistema funziona perfettamente durante il sondaggio il pin SDA.

La risoluzione dei problemi del circuito funziona correttamente se aggiungo un resistore da 1Mohm tra SDA e terra, ma non funziona se si aggiunge solo un condensatore da 10pf o 100pf.

Sto usando resistori pull-up da 4.7k per la mia guida 3.3v.

Cosa potrebbe causare questo problema e cosa si può fare per risolvere i problemi senza risolvere involontariamente il problema.


EDIT: 19/07/2017 Ecco una breve traccia di portata dei miei segnali.

Qualcos'altro che ho dimenticato di menzionare è che solo sondare SDA fa funzionare la scheda, sondare SCL o la mia linea di interruzione non riesce a farlo funzionare correttamente.

Traccia dell'ambito di SDA e SCL


MODIFICA: 21/07/2017

La trama si infittisce, sembra che il collegamento di un oscilloscopio diverso non faccia funzionare correttamente il circuito e si può vedere che l'unica differenza è che un ACK non viene trasmesso.

Nuova immagine dell'ambito

Nell'immagine sopra, le tracce blu e verde sono SCL e SDA quando il circuito non funziona correttamente. Le tracce gialle e rosa provengono da quando collego anche la mia logica Saleae al pin SDA e alla terra, ma senza collegare l'USB (cercando di evitare loop di massa).

Per aggiungere un po 'più di sfondo al sensore, si tratta di un sensore di pressione industriale che acquistiamo dal produttore. In precedenza abbiamo progettato e testato questi PCB con il nostro primo lotto di sensori. Recentemente abbiamo ricevuto un nuovo batch e ora stiamo riscontrando questi problemi. Ho fatto un po 'di indagine e sospetto fortemente (dopo aver cercato su google frasi uniche dall'aspetto del foglio dati) che internamente il sensore utilizza uno ZSC31014 o simile, foglio dati PDF QUI


MODIFICA: 26/07/2017

Quindi, si spera, l'ultima puntata nella risoluzione di questo problema, secondo la risposta dettagliata di SamGibson, ho implementato la correzione dell'impostazione del bit alto dell'indirizzo per mascherare il glitch alla fine del bit iniziale.

Questo ha funzionato principalmente con i dati che arrivano come previsto, tuttavia ora sembra che nel primo comando read dopo una scrittura (se questo è il termine corretto per un gruppo di bit i2c), lo slave tenta di ACK un bit in anticipo (in la posizione del bit di scrittura). Posso dire che è lo slave che abbassa la linea aggiungendo un piccolo resistore (47 ohm) in serie con la linea SDA.

Di solito vorrei iniziare questo come una nuova domanda, ma quando allego lo stesso ambito che non ha avuto alcun effetto nella risoluzione dei problemi di cui sopra, questo problema sembra andare via, questo sembra davvero essere un problema al limite come se anche allego il probe dell'ambito, senza collegarlo all'ambito il problema è stato risolto, quindi presumo sia un problema di capacità.

Trama del problema senza ambito allegato

Trama senza ambito

Problema con la sonda dell'oscilloscopio collegata, ma non collegata all'oscilloscopio, rilevando la tensione leggermente superiore quando lo slave abbassa il bit di scrittura anziché il bit ACK.

Con portata allegata


1
Hai qualche traccia di portata
Kevin White,

1
Hai inavvertitamente invertito il segnale del tuo orologio?
Andy aka

6
Verificare che il bus I2C abbia e stia utilizzando un filo di terra comune (da MSP al sensore I2C). Necessari 3 fili: SDA, SCL e GND, con SDA e SCL tirati fino a Vcc (possibile 4 ° filo) attraverso resistori di pull-up.
Chris Knudsen,

1
@Hugoagogo - Yikes! Sia SDA che SCL sono anomali, in diversi modi. Presumo che traccia è con le nuove mancanza sensori? In tal caso, puoi fornire una traccia con i vecchi sensori funzionanti ? Forse la differenza potrebbe non essere così grande cioè hai avuto un problema prima, ma era solo lavorando. Ulteriori informazioni di base potrebbero rivelare dati utili, ad esempio Come fai a sapere che si tratta di "nuovi" chip I2C, considerando che il chip è "sconosciuto"? Immagino che sia stato fatto un po 'di reverse engineering per consentire a MSP430 (che controlli?) Di essere usato con un sensore (che non controlli?). Quanto è diverso dalla configurazione "originale"?
SamGibson,

1
Bene, sono d'accordo con SamGibson. Non sarei così veloce nel dire che i picchi sono errori di misurazione. Penso che dovresti provare a ricercare un po 'di più e cercare di eliminarli, se provengono dalla tua configurazione di misurazione o trovano il motivo per cui sono lì. Dopotutto, sembrano essere allineati con i bordi cadenti di SCL. Vorrei anche provare a collegare il sensore direttamente sul PCB. Ciò potrebbe aiutarti a escludere che i problemi sono causati dal cavo o dalla distanza del sensore dalla scheda principale.
nickagian,

Risposte:


11

Io penso che ho trovato la risposta. Si scopre che questo è un problema noto, ma ho scoperto che solo dopo aver deciso dove si trovava il problema e l'ho cercato!

Ecco il processo che ho seguito, quindi puoi seguirlo (e, se necessario, puoi quindi adattare la tua indagine se vedi risultati che differiscono dai miei presupposti). La linea di fondo è che sembra esserci un'incompatibilità tra (almeno alcuni) il comportamento I²C MSP430 e il comportamento I²C richiesto dal dispositivo che si sospetta essere lo Slave I²C, l' IDT ZSC31014 . Avere il foglio dati per quel dispositivo è fondamentale per capirlo, quindi grazie per averlo trovato.

La buona notizia è che ci sono (almeno) 2 soluzioni alternative per questo problema, che spiegherò alla fine.

La trama si infittisce, sembra che il collegamento di un oscilloscopio diverso non faccia funzionare correttamente il circuito e si può vedere che l'unica differenza è che un ACK non viene trasmesso.

Le nuove tracce sono utili, grazie, anche se le interpreto in modo leggermente diverso.

(Il undershoot del segnale SCL, che mi riguardava nella traccia iniziale, è ancora lì sull'ultima traccia. È interessante notare che il undershoot su SCL sembra maggiore del undershoot su SDA, soprattutto considerando le diverse scale verticali tra i segnali SCL e SDA sul traccia più recente. Suggerirei comunque di indagare sul fatto che il undershoot SCL alla fine, ma non credo che sia correlato al problema principale.)

Ci sono quei due "problemi" su SDA:

  • Un glitch appena prima o subito dopo l'impulso ACK non è raro, quando un Master I²C rilascia il controllo di SDA per consentire a uno Slave di eseguire l'ACK e quindi il Master potrebbe ricondurre nuovamente SDA. Quindi sto ignorando quello.

  • È il primo glitch SDA, prima del primo impulso SCL, che è più insolito. Dall'ampiezza di quel primo glitch SDA (vedi più avanti) e dal fatto che si verifica solo prima di quel primo impulso SCL (etichettato 0), ma non si verifica prima degli impulsi SCL successivi dove saremmo in grado di vedere un glitch su SDA (come SCL impulsi etichettati 4, 5, 6 o 7), sappiamo che non è un artefatto di misurazione, né accoppiamento da SCL (ad esempio).

(Per riferimento futuro, il glitch SDA iniziale sembra almeno 2 V nell'ultima traccia, quindi con Vdd a 3,6 V dai commenti precedenti, ciò rende l'ampiezza del glitch SDA almeno (2 / 3,6) = 0,55 x Vdd. Confronta questo con le soglie di livello logico I2C pertinenti discusse più avanti).

Ignorando la differenza ACK, credo di vedere un'altra differenza tra i due set di tracce in quel secondo screenshot. L'ampiezza di quel primo glitch SDA sembra leggermente diversa, confrontando la traccia SDA superiore etichettata C1(giallo-ish?) E la seconda traccia SDA etichettata M3(blu). Ora credo che le differenze nell'ampiezza di quel primo glitch SDA, sia ciò che può far apparire o scomparire il tuo problema, come spiego di seguito.

Anche una risoluzione più specifica del glitch sarebbe di aiuto (questo è uno dei problemi nel tentativo di lavorare su problemi "da remoto" - non riesco a far funzionare l'ambito da solo!). Presumo che quando si ingrandisce, sembra l'inizio di una normale logica I²C "1" (cioè una curva RC sul fronte di salita, specialmente se si rendono temporaneamente più deboli i pull-up, ad esempio 10k), tranne che non lo fa ' t raggiunge la piena tensione positiva prima che sia nuovamente guidato su uno "0" logico. Questo è ciò che viene mostrato su un'altra pagina web collegata in seguito. Se vedi una forma diversa per il tuo problema tecnico, la mia analisi successiva potrebbe non essere applicabile.

Il Master I²C ha il controllo del bus nel punto di quel glitch, tra I²C Start e il primo impulso di clock SCL (che hai etichettato "0" nonostante sia MSbit). Ciò mi ha reso sospettoso del comportamento di MSP430, anche se con SCL basso a quel punto, un glitch SDA non dovrebbe influenzare i dispositivi conformi a I²C, poiché aspetteranno che SCL salga prima di leggere lo stato di SDA.

Quindi, lo I²C Slave è davvero conforme allo I²C? Si scopre che lo ZSC31014 è " pignolo " e meno tollerante rispetto ad altri dispositivi I²C, proprio nel momento in cui credo che l'MSP430 stia producendo quel glitch!

Il foglio dati ZSC31014 elenca 3 aree in cui ammettono che il comportamento I²C del dispositivo è "diverso". Potresti essere interessato anche dai primi due in questo elenco altre volte (che non fa parte di questa analisi), ma è il terzo punto che ho contrassegnato di seguito in rosso, che è correlato a quel primo glitch SDA:


estratto dal foglio dati ZSC31014


L'ampiezza di quel primo glitch SDA è fondamentale . Se quel glitch non aumenta abbastanza per essere riconosciuto da ZSC31014 come una logica "1" prima che ricada di nuovo, allora sei OK - il dispositivo deve vedere un fronte di discesa su SDA per infrangere quella "regola" e può essere solo un fronte di discesa se è già stato riconosciuto come logica "1".

Tutto ciò che influisce sull'ampiezza di quel glitch SDA, come il carico aggiuntivo di un 'oscilloscopio o analizzatore logico sul segnale SDA, potrebbe essere sufficiente per impedire al glitch di essere riconosciuto da ZSC31014 come raggiungere una logica "1" e quindi non "cadere" SDA edge ", quel terzo punto dell'elenco, può verificarsi (in una buona giornata, a seconda di tensioni, temperature ecc.). Tuttavia, come hai scoperto, la variazione tra diversi oscilloscopi è sufficiente per significare che alcuni di essi aggiungono un carico sufficiente per fermare il problema, mentre altri no. Questa configurazione deve essere molto marginale!

Ciò conferma la mia preoccupazione che i tuoi precedenti gruppi "funzionanti" di sensori, potrebbero "solo" funzionare, dal momento che le MCU MSP430 su quelle configurazioni "funzionanti probabilmente produrranno anche problemi di SDA. La mia teoria su una possibile differenza tra lotti di sensori, che potrebbe spiegare il diverso comportamento che hai segnalato (lotto "funzionante" vs. lotto "non funzionante") verrà spiegata in seguito.

È interessante notare che ZSC31014 è diverso dallo standard I²C in un'altra area che non è menzionata in tale elenco dal produttore, e questo potrebbe spiegare perché sembra che si veda una differenza tra i lotti di sensori.

Le soglie logiche I²C standard sono (semplificate) - sotto 0,3 x Vdd per la logica "0" e sopra 0,7 x Vdd per la logica "1" come mostrato nella specifica I²C :


soglie di livello logico dalla specifica I2C


Tuttavia, ZSC31014 ha soglie diverse , 0,2 x Vdd e 0,8 x Vdd, il che significa che la sua "regione non definita" tra tali soglie è maggiore rispetto ai dispositivi I²C tipici:


soglie di livello logico dal foglio dati ZSC31014


Quella "regione indefinita" più ampia aumenta la possibilità che il glitch entri nell'area del livello di tensione indefinita, dove potrebbe essere riconosciuto come una logica "1" (ricordate, qualsiasi cosa al di sopra di 0,2 x Vdd potrebbe essere riconosciuta dallo ZSC31014 come una logica "1" , poiché nella regione indefinita, tutto è permesso - è solo sopra 0,8 x Vdd quando deve essere riconosciuto come una logica "1"). E, come spiegato in precedenza, se il problema tecnico viene riconosciuto da ZSC31014 come se avesse raggiunto una logica "1", quindi quando ricade di nuovo in una logica "0", hai infranto quella "regola" contrassegnata in rosso per il comportamento I²C richiesto dallo ZSC31014.

Poiché il riconoscimento dei livelli logici in quella regione di tensione "non definita" non è specificato, il produttore del sensore non sta infrangendo la specifica se crea un batch che riconosce la logica "1" solo quando raggiunge 0,7 x Vdd, ma crea un altro batch che riconosce una logica "1" fino a 0,4 x Vdd, ad esempio. Quell'ipotetico secondo lotto sarebbe più probabile che vedesse il glitch dell'SDA come un limite SDA in calo, in violazione di quel terzo punto del loro elenco, ma non infrangendo le loro specifiche.

(Molti dei problemi a cui ho lavorato nel corso degli anni sono stati così: ci sono due dispositivi, nessuno dei quali rompe individualmente una specifica che ha scappatoie - ma uno è esigente e meno tollerante, in un punto in cui il l'altro ha bisogno che i dispositivi connessi siano più tolleranti a causa del suo comportamento oscuro! Ognuno di questi due dispositivi si interfaccia bene con la maggior parte degli altri dispositivi, ma sono inaffidabili (o falliscono completamente) quando sono collegati tra loro.)

Che cosa si può fare? Ho pensato a due opzioni:

  • Non usare un MSP430 - usa un altro MCU che non crei quel glitch SDA iniziale. Tuttavia, mi aspetto che tu abbia investito molto tempo nel software e non vorrebbe trasferire il codice su un altro MCU, se ciò potesse essere evitato.

  • "Bit-bang" il protocollo I²C su MSP430, invece di utilizzare il suo modulo hardware I²C integrato. In questo modo, hai il controllo totale dei segnali I²C e puoi evitare che si verifichi quel problema. Tuttavia, sarebbe ovviamente un po 'di lavoro creare le proprie routine I²C, eseguirne il debug e il codice risultante potrebbe essere più grande di quando si utilizza il modulo hardware I²C MSP430, che a sua volta potrebbe essere un problema se si ha poco spazio su Flash.

Quindi sono andato alla ricerca di problemi I²C MSP430 e ho scoperto che questa combinazione di MSP430 + ZSC31014 è un problema noto, a causa di quel primo problema tecnico SDA da MSP430! Vedi questa discussione sul forum TI E2E MSP430:

Forum TI E2E: impulsi glitch MSP430 I2C che causano problemi al chip periferico I2C

La soluzione menzionata qui è quella di modificare l'indirizzo I²C ZSC31014 in modo che SDA sia elevato nel momento in cui si potrebbe verificare un glitch positivo , e poiché SDA è reso alto quindi comunque, non c'è alcun glitch effettivo su SDA:

La nostra soluzione è configurare il chip ZSC in modo che abbia un indirizzo con il suo set di bit 6 (ad es. Ora stiamo usando 0x42) - questo trasforma l'impulso glitch in un bel bit "alto" pulito per la durata dell'indirizzo bit 6, che elimina del problematico fronte di discesa.

La stessa soluzione alternativa è effettivamente il contrario del suggerimento nel foglio dati ZSC31014, nella casella rossa che ho contrassegnato. Dicono che un glitch SDA deve essere evitato se il primo bit (che è il MSbit) dell'indirizzo I²C ZSC31014 è 0 - quindi non rendere il MSbit dell'indirizzo I²C uno "0", rendilo invece "1" invece impostare il bit 6 nell'indirizzo I²C a 7 bit!

Dato che il thread del forum TI E2E e il foglio dati ZSC31014 si stanno entrambi concentrando sull'indirizzo I²C, allora forse il glitch SDA non si verifica o non è un problema se si verifica durante l'invio di altri dati sul bus. Dovrai indagare su questo.

Pertanto, ignorando la prima soluzione alternativa dell'utilizzo di una MCU diversa, le due (più pratiche) soluzioni alternative sono:

  • Bit-bang del bus I²C MSP430 scrivendo il proprio codice, in modo da non creare quel glitch su SDA, o
  • Modificare l'indirizzo I²C ZSC31014 in modo che sia impostato il bit 6 del suo indirizzo a 7 bit, il che significa che SDA è già elevato quando altrimenti si verificherebbe il glitch, quindi non si verifica alcun glitch effettivo su SDA quando viene indirizzato ZSC31014 (supponendo che un glitch SDA sia non si verifica dopo altri eventi I²C Start durante il trasferimento dei dati o, se si verifica, che ZSC31014 non viene "sconvolto").

Spero che aiuti!


2
Questa è una risposta fantastica e molto utile, prima di contrassegnare come accettato c'è un modo in cui posso darti qualche rappresentante in più per attenermi attraverso la risoluzione dei problemi. Aggiornerò anche la mia domanda con la mia soluzione alternativa quando avrò successo.
Hugoagogo,

1
@Hugo - È un pensiero molto gentile :-) Credo che si possa fare offrendo una generosità in cui la ragione della generosità sarebbe " Ricompensa risposta esistente ". Non sono un esperto del processo, quindi non posso dire molto di più. Ovviamente sarei felice di avere un rappresentante extra (ci sono volute alcune ore per fare l'analisi e scrivere ;-)) ma se non vuoi usare una taglia, o non riesci a capire il processo , quindi non preoccuparti, è comunque tutto positivo karma :-) Spero che la mia risposta funzioni!
SamGibson,

@Hugo - Non so se ricevi notifiche sugli aggiornamenti alle risposte, ma solo FYI, ho aggiunto un paragrafo su SCL e il suo undershoot (ancora un enigma, ma dubito che sia correlato al problema principale) e io ' ho ipotizzato che l'ampiezza del "glitch SDA iniziale" nell'ultima traccia dell'oscilloscopio fosse almeno 0,55 x Vdd, che rientra bene nella regione di tensione "non definita", in cui diversi sensori (o diversi lotti di sensori ;-)) potrebbero trattare che come logica "1" o no, senza infrangere le loro specifiche. Presto sarò offline per un po ', quindi di nuovo buona fortuna!
SamGibson,

1
Grazie ancora per l'assistenza
proverò

sarei in grado di farti valutare un ultimo aggiornamento alla domanda.
Hugoagogo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.