Problema de señal de comunicación I2C

Esquema del microcontroladoringrese la descripción de la imagen aquíComunicación de señal I2C SDA (ROSA) SCL (Amarillo)

Hola a todos,

Estoy trabajando en el dispositivo de comunicación basado en I2C bq27742-g1 (Texas Instrument) El indicador de combustible de la batería, que es la dirección del dispositivo esclavo, es 0xAA. He puesto la resistencia pull up de 10K.

En esto, estoy usando el microcontrolador Cortex M4 de la serie Kinetis como dispositivo maestro. El microcontrolador funciona con otro dispositivo I2C.

Probé el indicador de combustible de la batería bq27741-g1 con una placa Launchpad MSP430 usando un escáner I2C y funciona bien.

Adjunto una captura de pantalla de las señales CRO (SDA(PINK) SCL(Yellow)) del dispositivo I2C en el noveno pulso de reloj de SCL cuando SDA tiene un estado indeterminado. ¿Por qué ocurre esto en este nivel? ¿Es este problema de la resistencia pull-up?

¿usó algún cambiador de nivel en el I2C (como el cambiador de nivel MOSFET, etc.)
Parece que la parte de ti.com intentó pero no pudo reducir la línea de datos para reconocer la dirección enviada por el maestro. ¿Está seguro de que la tierra bq27742-g1 tiene el mismo voltaje que la tierra del procesador?
Hay algo mal con tu circuito. ¿De verdad crees que mantener el esquema en secreto es útil?
@ user19579 estoy usando un microcontrolador de escala libre que tiene 3.3 v de nivel y el dispositivo I2c también es el mismo.
@st2000 ambos terrenos son comunes.
@CL. He actualizado el esquema.
200 ohmios es mucha resistencia para colocar entre el controlador I2C Bq27741-g1 y el bus I2C. Esa parte del esquema de especificación ti.com Bq27741-g1 dice "Protección ESD adicional. No forma parte del circuito de aplicación". por lo que no se sabe si es necesario. Sin embargo, con un aumento de 10K ohmios, no debería causar el problema que muestra en el alcance. Verifique que esté tirando hacia arriba con una resistencia de 10K ohmios. Como parece ser una resistencia de 100 ohmios.
¿Estoy leyendo ese tiro de alcance correctamente? ¿Las líneas I2C realmente oscilan entre 0 y 35V-37V? A 20 V por división, seguro que se ve así. Si ese es realmente el caso, entonces creo que probablemente frió el GQ27741-G1. El máximo absoluto en los pines I2C es de 5,5 V en el GQ27741.
@KalaravN.Parmar - (a) Usted dijo: "He puesto la resistencia pull-up de 10 k", pero no se muestran resistencias pull-up I2C en el esquema que proporcionó. Para un problema de I2C, debe mostrarnos todos los componentes (todas las resistencias, todos los circuitos integrados, etc.) conectados al bus I2C. (b) Esa forma de onda en SDA (rosa) es clásica para la contención de la señal , por ejemplo, dos salidas de tótem que conducen la señal a niveles opuestos. Busque un dispositivo que maneje esa señal, que no esté configurado para salida de drenaje abierto. (c) Como ha resaltado CHendrix , debe explicar por qué su osciloscopio muestra que SCL es de aprox. 37V págs.
@ st2000 según su sugerencia, eliminé la resistencia en serie y lo intenté, pero llegó la misma onda ob cro.
@CHendrix, lo siento, pero estoy usando un dispositivo cuyo nivel de voltaje máximo es de 3,7 v y el cro está funcionando en modo 10X, por lo que me confundió. Disculpa por eso.
@SamGibson hola señor, también he actualizado el esquema del microcontrolador, el indicador de combustible es un tipo de complemento en la tarjeta.
@Kalarav N. Parmar, ¿está implementando el I2C en el software? ¿O usaste el hardware I2C de Kenetic? Si está en el software, debe establecer tres estados (configurar para ingresar) el pin que controla el pin de DATOS I2C cuando no lo conduce bajo. Si está utilizando el hardware I2C de Kenetic, ¿cuál es el número de pieza del procesador, el número de pines, el pin que está usando para los DATOS I2C y el valor que está configurando en el registro mux de Kenetic que controla ese pin?
@KalaravN.Parmar: si sus 2 esquemas ahora muestran todos los dispositivos I2C, entonces la información proporcionada hasta ahora apunta al firmware de MCU como la causa del tipo de problema que expliqué en mi comentario anterior (punto (b), contención de señal) y como También se han mencionado respuestas posteriores y los útiles comentarios de st2000 . Esa es el área que investigaría, si estuviera en su lugar.
@SamGibson, gracias a todos por su mayor apoyo según la sugerencia, defina SCL y SDA como Open Drain Enable y configure su velocidad 100 KHZ y funciona bien y excelente. gracias de nuevo a todos..
gracias a todos por su gran respuesta y apoyo

Respuestas (2)

No estoy familiarizado con Kinetic MCU, pero en una MCU diferente tuve la misma forma de onda cuando configuré mal la línea SDA como una salida normal en lugar de configurarla como una salida de drenaje abierto.

Puede ver que el esclavo está respondiendo con un ACK y tratando de reducir el SDA, pero algo (probablemente el Kinetic como maestro I2C) está elevando el SDA, por lo que ve el voltaje a la mitad del riel durante el bit 9.

Configure SDA como desagüe abierto.

En los procesadores Kinetic, la característica pin multiplex debe configurar (generalmente configura) las propiedades de los pines. Aunque tu comentario me hace cuestionar esto. Puede haber un problema con este procesador Kinetic específico o esta característica específica. Pero según mi experiencia, todo lo que se necesita es "conectar la función al pin físico".
Sabes, se me acaba de ocurrir que @Kalarav N. Parmar puede estar implementando el I2C en el software. Y no conducir el autobús correctamente.
@st2000 sí, estoy implementando i2c en el software.
@ KalaravN.Parmar, entonces lo que debe hacer es configurar el pin en salida y bajo para un nivel bajo. Pero, para un nivel alto, debe configurarlo como una entrada. No conduzca un I2C sino una línea alta. Deje que la resistencia pull up haga eso. Avíseme si quiere que ponga esto en una respuesta con más detalles. Además, ¿por qué no estás usando el I2C incorporado? Estoy casi seguro de que si lo hace, el hardware se ocupará de todo esto. ¡Ja, esto también explica por qué los rastros del osciloscopio no se alinean constantemente! Hay un poco de inestabilidad en los bordes porque está siendo ejecutado por software.
@st2000 lo estoy usando Kinetic microcontrolador interno I2C pero también tiene la característica de que podemos habilitar esos pines como OPEN DRAIN ENABLE después de eso tengo nake SCL y SDA to ODE. entonces, funciona bien I2C Write y I2c Read.
No uso este procesador Kinetic en particular. Pero no recuerdo una característica de Kinetic como la salida de colector abierto en los procesadores Kinetic con los que he trabajado. Además, dijiste que estabas implementando I2C en el software. Ahora está diciendo que está utilizando el I2C interno de Kinetic. Así que estoy confundido. Además, ha dicho que también ha habilitado HABILITAR DRENAJE ABIERTO. Como dije antes, pensé que el hardware de Kinetic configuraría automáticamente el pin I2C cuando eligiera conectar el I2C interno a un pin. De nuevo, estoy confundido. Pero si ahora está funcionando, genial.

Este problema ocurre cuando el esclavo y el maestro I2C intentan conducir la línea al mismo tiempo en direcciones opuestas.

Su indicador de combustible de la batería es esclavo I2C y MSP es maestro I2C. ¿Está utilizando algunas bibliotecas para la comunicación I2C o ha implementado el protocolo I2C por su cuenta?

En el noveno ciclo de reloj, el MSP debe liberar la línea SDA (hacer que sea una entrada triestablecida ), para permitir que el indicador de combustible lo reduzca. Esta baja debe interpretarse como un Reconocimiento. Verifique su código I2C.

En un bus I2C normal, todos los controladores son de colector abierto. Ninguno de los conductores debe ser capaz de hacer subir el autobús.