La comunicación I2C no funciona

Estoy tratando de leer datos de/escribir datos en un Xilinx Zedboard (plataforma FPGA) usando un microcontrolador externo a través del bus I2C. El esquema para esto se vería actualmente de la siguiente manera:

ingrese la descripción de la imagen aquí

Como puede ver en el esquema, el microcontrolador usa resistencias pull-up de 1k para el bus I2C.

Noté que después de la primera transacción, el microcontrolador no leerá/escribirá más datos.

No puedo depurar esto en el microcontrolador porque no puedo hacer ningún cambio en el software del microcontrolador. Se ha verificado que el microcontrolador funciona correctamente con otros periféricos I2C.

Cuando observo la traza de un osciloscopio, puedo ver que el Zedboard no baja la línea SDA al nivel lógico bajo del microcontrolador mientras envía un reconocimiento. Creo que esta podría ser la razón por la cual la transacción falla. Vea la captura a continuación, donde puede ver que el mínimo SDA del Zedboard está aproximadamente 600 mV por encima del mínimo SDA del microcontrolador.

ingrese la descripción de la imagen aquí

Creo que la razón de esto podría deberse a que las resistencias pull-up son bastante bajas. Sin embargo, no puedo hacer ningún cambio en la placa del microcontrolador y, por lo tanto, no puedo reemplazarlos por resistencias más altas.

¿Tiene alguna idea de cuál podría ser el problema aquí y cómo puedo resolverlo?

gracias y saludos

¿Hay cables largos entre las tablas? ¿Se envían SDA y SCL a través de cables vecinos? Parece haber un nivel inesperadamente alto de diafonía, considerando que las resistencias son de 1k.
Los cables tienen una longitud de unos 50 cm y no se envían a través de cables vecinos.
¿Alimentas el Zedboard a través de la misma línea GND? En caso afirmativo, la resistencia de la línea GND puede resultar en una elevación a tierra. Use cables más gruesos o más para GND.
Entonces, ¿qué tipo de cable es y cuál es el pinout? I2C enviado a más de 50 cm de cableado deficiente puede no ser confiable, pero cuando todo está diseñado correctamente, puede funcionar a muchos metros (como en VGA, DVI y HDMI).
Intente usar un traductor de nivel para almacenar en búfer sus señales o, si está disponible, un chip de búfer I2C como un P82B715T.

Respuestas (2)

El voltaje que ve en su línea de bus corresponde a una resistencia del interruptor del lado bajo de algo más de 200 ohmios.

Una mirada rápida al esquema de la ZedBoard muestra que algunos pines de entrada tienen una resistencia en serie de 200 ohmios, probablemente para protección ESD. Supongo que usó un pin de este tipo para su comunicación I2C, pero como no nos dijo cómo conectó exactamente el µC al ZedBoard, no puedo decirlo con seguridad.

Tendrá que usar un pin de entrada sin esta resistencia en serie para obtener un buen nivel bajo.

Sí, tiene usted razón. Conecté los pines I2C a JA2 y JA3. Ahora también miré el esquema y vi que todos los pines PMOD que no usan las resistencias de 200 ohmios son diferenciales. ¿Sabes si puede hacer algún daño al usar los pines diferenciales para I2C?
En realidad, no estoy seguro, pero sospecho que los pines se pueden configurar de la forma que desee. Asegúrese de que los pines estén configurados para admitir el alto voltaje de las líneas I2C digitales de 3,3 V. Probablemente, el valor predeterminado para la configuración diferencial es una entrada de voltaje más bajo. Tienes que cavar en la hoja de datos para obtener los detalles.
Lo probé con los pines del diferencial y solucionó el problema. Gracias.

Una opción sería usar un búfer I2C para que pueda usar sus propios pull-ups en el lado del dispositivo.