¿Por qué poner resistencias entre Vcc / SDA y Vcc / SCL en I2C da como resultado una onda cuadrada?

7

Estoy tratando de entender por qué colocar resistencias entre Vcc y las líneas de datos / reloj ayuda a que mi forma de onda sea cuadrada, cuando me estoy comunicando entre Arduino y un chip EEPROM. Si no se colocan resistencias en el circuito, las olas se ven como aletas de tiburón. El circuito aún funciona, pero definitivamente son olas de aspecto extraño.

Para los antecedentes, esta pregunta surgió después de conectar un Arduino a un Microchip 24LC256 (EEPROM) usando I2C. Al inspeccionar las señales con mi osciloscopio ( tratando de depurar algo no relacionado ) noté que las olas se veían, bueno, horrible. A mí me parecían aletas de tiburón (¿hay una frase de EE más aceptada para esto?). Verifiqué varias veces para asegurarme de que los sensores de mi sonda estaban sintonizados / compensados correctamente, y verifiqué que no obtuve tal comportamiento en otros circuitos. Así es como se veía el cableado:

EnunaconversacióncasuallecontéaEEsobreesto,ymedijeronqueestonoesraroenI2C.Recomendócolocarunaresistenciade10kOhmentreVccaSCLyprobarunaresistenciamásbajaentreVccySDA.Además,recomendóreducirlavelocidadI2Calaconfiguraciónmásbaja(31KHzparaUno).Porsupuesto,sicolocounaresistenciade10kentreVcc/SCLyunaresistenciade4.7kentreVcc/SDA,sevenbienycuadradas.Tambiénbajélavelocidaddelonormala31KHz,peroesotuvounimpactomuchomenor(siesquehuboalguno).

¡Lamentablementenuncatuvelaoportunidaddepreguntarporqué!Soyunnovatodelaelectrónica,perotengomuchacuriosidaddeporquéunaresistenciacomoestahacequeseveanmejorconondascuadradas.Estafotoacontinuaciónesdespuésdeusarresistencias,peroantesdeelegirlosvaloresderesistencia"óptimos" para obtener las mejores ondas cuadradas. Creo que se ve mucho mejor.

BusquéexplicacionesenStackExchangeperosinéxito.Estosparecían(potencialmente)similaresamiproblema: Problema con la comunicación I2C EEPROM (sus ondas parecen similares a las mías, pero la respuesta no respondió a mi pregunta) Interfaz I2C entre dos chips (este también parecía bastante prometedor pero no lo hizo profundizar en el "por qué") Extrañas señales I2C emitidas desde FPGA (esto parecía estar relacionado con otra cosa). .. aunque similar en que sus olas se ven "feas")

¡Gracias por la ayuda!

    
pregunta Thomas

2 respuestas

9

I2C es un bus que utiliza salidas de drenaje abierto. Un drenaje abierto es como un interruptor conectado entre la salida y la tierra. No funcionará sin resistencias pullup porque no hay nada que lo haga subir.

Si las resistencias pullup tienen un valor demasiado alto , no funcionará (o no funcionará confiablemente) porque la resistencia no cargará la capacitancia de las entradas, la salida, el cable y tal vez una sonda de alcance lo suficientemente rápido . Si son demasiado bajos, la salida no será lo suficientemente fuerte como para tirar hacia abajo.

Observa que en la medición de su alcance, las salidas bajan muy rápidamente pero son lentas para alcanzar el nivel lógico 1.

Si el código de su Arduino está utilizando las resistencias de extracción internas en la ATMega para golpear una interfaz I2C, entonces es probable que tengan un valor demasiado alto (decenas de K ohms, y no estén bien). especificados) para que funcionen de manera confiable, por lo que deben estar en paralelo con resistencias externas.

Personalmente, habría escrito el código para no usar las activaciones internas (por defecto) para evitar que la situación del bus "casi" no funcione, y obligar al usuario a usar las resistencias o elegir deliberadamente usar las internas . Es posible que sean aceptables si los chips están muy juntos, se usa una velocidad baja (100 K) y no se adjuntan sondas de alcance (especialmente en x1).

He visto una situación muy similar en la que las redes de resistencia de 47K se instalaron accidentalmente en lugar de 4.7K.

    
respondido por el Spehro Pefhany
5

Se supone que I2C no funciona en absoluto sin resistencias pull-up; se requieren explícitamente en el diseño del bus.

Entonces, en efecto, tu pregunta es discutible: hazlo mal, y suceden cosas malas.

Si realmente quiere entender exactamente lo que está sucediendo, es probable que esté obteniendo algún tipo de efecto de pull-up débil de una corriente de fuga o posiblemente incluso una resistencia de pull-up interna que es aproximadamente 10 veces más grande que la resistencia de bus I2C. debiera ser. Esto hace que la forma de onda ascendente de RC exponencial, la clásica de un condensador que se carga a través de una resistencia. Con un valor apropiado de resistencia de pull-up todavía ocurre, pero lo suficientemente rápido como para que el exponencial se vea vertical en el alcance.

Cualquiera que sea la fuente de corriente que esté elevando la línea en ausencia de una verdadera resistencia de pull-up, es débil (es decir, el circuito tiene una impedancia muy alta), por lo que también es extremadamente susceptible al acoplamiento capacitivo desde la línea del reloj, por lo tanto, verá que la parte superior de la forma de onda de la línea de datos muestra artefactos cuando el reloj cambia.

Utilice las resistencias de pull-up requeridas. Ponga un capacitor de derivación en su chip. Mantenga el cableado lo más corto posible. Siga las reglas y evitará los problemas que, de manera característica, surgen al romperlas.

    
respondido por el Chris Stratton

Lea otras preguntas en las etiquetas