Como advertencia, este es mi primer PCB. Estoy experimentando problemas con el bus I2C. Hay dos esclavos I2C en este bus (la pantalla SSD1306 y el medidor de combustible BQ27441, actualmente el programa sólo envía comandos a la pantalla en 0x3C, así que no me preocupa que el otro dispositivo cause problemas en este momento).
Mi primera preocupación fueron los problemas de ruido porque no me di cuenta de que era una mala práctica encaminar las señales I2C una al lado de la otra, así que corté las trazas y las reencaminé utilizando hilo magnético. Esto resultó en el mismo problema. El problema es: la pantalla sólo se muestra durante un segundo, ni siquiera, y luego se corta. Cambié las resistencias pull-up a valores bastante bajos (1,1k, originalmente 4,7k pero el tiempo de subida en el osciloscopio se veía bastante mal). Nota importante: la pantalla no funcionaba en absoluto antes de este cambio. Sin embargo, la pantalla sigue siendo muy intermitente, lo que me lleva a creer que esta no era la causa directa.
La traza SDA es de 71,5mm y la traza SCL es de 80,8mm, no pensé que la coincidencia de longitudes fuera importante a 400kHz, pero pensé en incluir la información. Además, ¿el acoplamiento cruzado podría ser un problema aquí? El espacio libre es de unos 5 milímetros, creo. Probablemente no fue la mejor idea para la ruta bajo el ESP32 tampoco ... Definitivamente he estado aprendiendo el camino difícil en este proyecto.
Es una placa de 2 capas, la mayor parte de la capa inferior es un plano de tierra, hay un par de secciones muy pequeñas de las trazas I2C que bajan a esta capa. La capa superior y la inferior tienen un grosor de 0,03556mm separadas por un dieléctrico FR-4 de 1,6mm.
Tenga en cuenta que este código fue verificado en el ESP32 DevKitC V4 y funcionaba perfectamente. También probé diferentes frecuencias en el bus I2C también (100kHz, 400kHz y 700kHz).
A partir de la captura del osciloscopio, mi primera conjetura sería una capacitancia de bus demasiado alta, pero me gustaría tener otras opiniones antes de verme obligado a hacer otra revisión de la placa.
También capturé la comunicación con un analizador lógico como se ve abajo. Repetidamente está haciendo una escritura de configuración a 0xF8 que no aparece en el código en absoluto (basado en la captura del osciloscopio no esperaría nada significativo de un analizador lógico de todos modos, pero para completar), de nuevo apuntando a un problema de hardware.
Tampoco parece que sean problemas de alimentación porque tanto los raíles de 3v3 como los de 5v parecen estables.
Editar: He cortado las trazas que van al indicador de combustible para eliminar cualquier posible contención del bus, todavía nada. También he añadido el esquema, junto con la configuración del osciloscopio y otra captura del osciloscopio con "datos" repetidos. Es interesante que las señales parecen ser bastante opuestas.
Rojo: SCL (CH1), Blanco: SDA (CH2), Naranja: GND
Me las arreglé para capturar este ^^ tan pronto como me conecté mi tablero en micro-USB....interesting. Esto no debería ser un problema de energía, los convertidores DC-DC están clasificados para más de un amperio cada uno en sus voltajes de 3v3 y 5v, no dibujar en cualquier lugar cerca de eso.
¡EDIT: Fui terco en cuanto a las respuestas sobre la tierra del osciloscopio, pero por la razón equivocada! El cabezal J2 está teniendo problemas de tierra aparentemente, pude capturar esto en el osciloscopio usando uno de los agujeros de montaje como referencia de tierra para el osciloscopio, voy a tener que comprobar la conexión de soldadura para el cabezal, o tal vez incluso reemplazar el cabezal ya que había un poco de flujo que rodeaba el cabezal y puede haber quedado atascado allí? He comprobado que el pin GND de J2 va directamente al plano de tierra de la capa inferior.
0 votos
Muéstranos el esquema.
6 votos
1. ¿Cómo estaba conectada la tierra de la sonda del osciloscopio cuando tomaste la traza del osciloscopio? 2. Mencionas que tienes fuentes de alimentación de 3,3 y 5 V. ¿Con cuál de ellas se alimentan tus dispositivos I2C? ¿A cuál están conectados los pull-ups?
4 votos
I2C es bastante indulgente con los problemas de diseño. Mi primera sospecha sería otra cosa. Como que olvidaste pullups o usaste el valor incorrecto de pullups o tienes contención en el bus (alguien manejándolo cuando no debería). etc.
0 votos
Estoy de acuerdo con mkeith. Tu trazado de alcance parece algún tipo de contención (y también una conexión a tierra incorrecta, tal vez). Como si tuvieras el bus a 5 V, pero uno de los dispositivos en el bus es alimentado por 3,3 V.
1 votos
La captura del alcance se ve rara, no me malinterpretes. ¿Supongo que accidentalmente hiciste la placa con dos tierras que en realidad no están conectadas entre sí? El trazo del osciloscopio parece una situación de tierra flotante.
0 votos
Ambos dispositivos I2C están utilizando 3v3 y yo he escopado 3v3, la tierra fue conectada a la conexión de tierra de la cabecera que se utiliza para la pantalla de 4 pines que también es alimentada por 3v3. Los pull-ups eran originalmente de 4k7 y los cambié a 1k1 con la preocupación de que el tiempo de subida fuera demasiado lento.
2 votos
¿Puedes publicar una imagen de cómo está conectado el osciloscopio a las líneas SCL/SDA? También, como se mencionó anteriormente, un esquema podría ser útil.
0 votos
Para la depuración, corta las trazas para que el procesador quede aislado. Todavía necesitas pullups de alguna manera. Haz un sondeo con el osciloscopio (obviamente coloca las sondas del osciloscopio en el lado del procesador del corte). Hasta que no veas que el procesador conduce el bus correctamente, no hay esperanza de que nada funcione. Si se ve igual sólo con el procesador conectado, entonces tienes un código malo, un procesador malo o alguna otra suposición básica está mal (pines equivocados, bus equivocado, etc). Comprueba también las sondas del osciloscopio. Sólo se tarda un segundo en engancharlas a la señal de prueba incorporada en el propio osciloscopio.
0 votos
A veces es algo tan simple como que el pequeño "sombrero de bruja" de la sonda del osciloscopio es del tipo equivocado o no está bien asentado.
0 votos
Me lo estoy preguntando: I2C no es diferencial por defecto, pero tu osciloscopio muestra una señal diferencial - que tiene una forma perfecta, por cierto. ¿Puede el analizador lógico manejar señales diferenciales? ¿Y puedes confirmar con el osciloscopio que NO estás enviando los mismos datos una y otra vez? ¡Como se ha dicho, muestra el esquema, al menos alrededor de ese circuito I2C!
0 votos
Sí. Si ch1 y ch2 son mitades diferentes de un par diferencial, entonces la señal es tal vez correcta, excepto que está flotando en algunos lugares (donde ch1 y ch2 son iguales). Pero I2C no es diferencial, como dijo @sweber.
1 votos
¡Voy a añadir una foto de la configuración del osciloscopio y el esquema pronto! Gracias por la ayuda hasta ahora, como ustedes mencionaron I2C no es diferencial. Además, he vuelto a comprobar las sondas con la señal de prueba incorporada, están bien.
0 votos
Acabo de actualizar el post con el esquema, la configuración del osciloscopio y una captura adicional del osciloscopio que muestra los "datos" repetidos
2 votos
Ese I2C que parece un par de diferencias apunta fuertemente a un problema de tierra en alguna parte. Lo mismo cuando se ve bien cuando se conecta al USB, pero no cuando se alimenta de la batería (la batería está en la parte inferior oculta a la vista?). La ordenación no secuencial de los pines de J2 en el esquema es realmente molesta, pero parece estar conectado correctamente, sin embargo, el espacio entre las almohadillas J2 no-Gnd y el Gnd-pour en la parte inferior parece muy apretado. ¿Has comprobado esta cosa con tu DMM (no alimentado) para asegurarte de que Gnd, 3v3 y 5 sólo van donde deben y en ningún otro sitio?
0 votos
Sí, es lo primero que hice después del montaje.
0 votos
Mirando la configuración, parece que el GND del osciloscopio está conectado (cable naranja) a SCL, de acuerdo con el esquema, sin embargo la imagen del diseño cuenta una historia diferente. Parece que hay un desajuste entre los dos. ¿Cuál tiene el pinout correcto de J2?
0 votos
Tienes un cable que pasa directamente por el inductor de tu fuente de alimentación. Esa es un área MUY ruidosa. Alejar el cable de esa zona sería una buena idea. Podría ayudar añadir un cable de tierra separado desde cerca de SCL/SDA en el chip hasta el GND en el conector. Lo ideal sería llevar SCL en un par trenzado con SCL/GND. Eso proporcionaría la mejor integridad de la señal posible. Además, ¿está seguro de que el aislamiento del cable magnético está intacto? Los cables de parcheo suelen ser cables de kynar.
0 votos
Agradezco todas las sugerencias, pero voy a ignorar todas las sugerencias relacionadas con la configuración del osciloscopio y los pinouts. Se olvidan de que la pantalla funciona momentáneamente al arrancar, lo que significa que el osciloscopio no tiene nada que ver (la pantalla lo hace sin el osciloscopio conectado). Los pines J2 no están en orden en el esquema si se mira de nuevo.
2 votos
Por favor, no ignores las sugerencias sobre el osciloscopio. Realmente necesitas saber si la tierra está flotando o si el osciloscopio está mostrando falsamente eso. La gran mejora cuando conectaste el USB dice que era un problema de conexión a tierra del osciloscopio.