banner

Blog

Jul 25, 2023

Tre insidie ​​nell'I2C che tutti vorrebbero non fossero presenti

La parte migliore di I2C è che si tratta di un bus disponibile praticamente ovunque, che copre un vasto ecosistema di dispositivi che lo offrono come interfaccia definita dall'hardware, pur essendo abbastanza semplice da poter essere implementato anche puramente via software su semplice GPIO perni. Nonostante questa popolarità, I2C è uno di quei famosi standard informali che presentano un paio di implementazioni popolari, lasciando molti dettagli come la tempistica esatta, la capacità del bus e altri dettagli noiosi al povero stronzo che si occupa dello sviluppo del prodotto. È così che ci ritroviamo con articoli come quello recente sul blog di scioglilingua [coppia di pere pared], che copre i problemi riscontrati durante l'implementazione di uno schiavo I2C.

Come con qualsiasi autobus condiviso, multimaster o meno, capire quando l'autobus è libero è un argomento divertente, ma che può causare infiniti grattacapi. Un problema qui deriva da una funzionalità che la versione SMBus di I2C chiama lettura/scrittura rapida. Ciò consente il trasferimento rapido di alcuni dati. Tuttavia, a seconda dei dati restituiti dallo slave, al master potrebbe sembrare che non stia ancora accadendo nulla, poiché SDA viene mantenuto basso dallo slave fino alla condizione di arresto, bloccando sostanzialmente il bus.

Il punto in cui le cose diventano ancora più eccitanti si presenta generalmente sotto forma di ciò che gli analizzatori logici amano chiamare traumaticamente una "condizione di avvio/arresto spuria". Si riferisce al comportamento di SDA e SCL, con SDA che scende prima che SCL indichi un errore. Ciò può verificarsi a causa di un tempo di attesa troppo basso che fa sì che altri dispositivi sul bus perdano la transizione. Qui SMBus definisce un tempo di transizione di 300 ns, mentre I2C richiede 0 secondi, ma ora si suggerisce di ritardare la chiamata di una condizione di avvio/arresto fino a quando non è trascorso un ritardo di 300 ns. In sostanza, sembrerebbe che l’implementazione di un tempo di attesa sia la strada da seguire finché non emergano prove contrarie.

La terza trappola riguarda le modalità a velocità più elevata di I2C, tra cui Fast-Mode (FM) e Fast-Mode Plus (FM+). La compatibilità con queste versioni a velocità più elevata è assente o discontinua. Sebbene FM+ (introdotto da NXP nel 2007) dovrebbe essere retrocompatibile con velocità inferiori, in realtà le differenze nei requisiti di temporizzazione tra gli standard FM+ e FM sono troppo grandi per essere compensate. Almeno nelle versioni attuali degli standard, ma una delle gioie di I2C è che c'è sempre un'altra nuova serie di revisioni da aspettarsi.

CONDIVIDERE