No obtener el reconocimiento adecuado y la condición de parada en el bus I2C

0

Estoy tratando de comunicar el tablero de torre Kinetis K60 con un Cypress IC CY8CMBR3116 cy8320 placa de desarrollo como IC esclavo. Solo hay dos dispositivos en el bus I2C. Adjunto una instantánea de la comunicación que tiene lugar en el bus I2C.

El problema es que el reconocimiento no es lo suficientemente bajo para que el maestro lo detecte e incluso la condición de parada no es correcta. Esto ocurre después de enviar la dirección predeterminada de 0X37 al cypress IC.

Por favor, dime la razón de esta salida.

    
pregunta Ankit Kumar

1 respuesta

0

TL; DR: Algunos o todos los problemas están en su código.

No proporcionó el código relevante, pero los dos problemas que veo en el rastreo de alcance, están relacionados con el código:

  • Como DoxyLover señaló, la traza muestra claramente un voltaje intermedio, causado por el conflicto entre dos dispositivos que controlan esa señal SDA en direcciones opuestas para el ciclo I²C ACK . Ya que el esclavo I²C está conduciendo esa señal baja (como ACK ), entonces su Kinetis K60 MCU debe conducirlo alto al mismo tiempo.

    Al igual que con muchas MCU, cuando el módulo I²C interno está conectado a los pines externos reales (por ejemplo, a través del multiplexor de pines interno), esos dos pines también deben configurarse en modo de "drenaje abierto" como paso separado en la configuración.

    En el Manual de referencia de NXP, que creo que incluye su MCU K60 específica ( 20MB archivo pdf ), página 282 (sección 11.6.1 Control de pines) dice:

      

    Por ejemplo, si una función I²C está habilitada en un pin, eso no invalida la configuración pullup o de drenaje abierto para ese pin.

    En otras palabras, habilitar I²C en un pin no configura automáticamente el pin a drenaje abierto (ni cambia la configuración actual del pullup interno).

    En este "I2C para Kinetis MCUs" documento, página 23 tiene esta pregunta y respuesta:

      

    P: ¿Por qué la señal de bajo nivel en SDA o SCL no se reduce completamente a 0 voltios?
      R: Para las MCU de Kinetis, es posible que deba configurar los pines I2C para el modo de drenaje abierto configurando el bit PORTx_PCR [ODE]. Otra causa puede ser una mala conexión a tierra entre su dispositivo maestro y el esclavo. dispositivo.
    [mi énfasis arriba]

    (Basado en el seguimiento del alcance, dudo que la conexión a tierra sea la causa de su problema).

    Como ejemplos de cómo configurar el modo de drenaje abierto en algunos códigos I²C, encontré dos ejemplos aleatorios en el código de ejemplo de Kinetis aquí :

    #define I2C_0_PORT_CFG (PORT_PCR_MUX(I2C_0_PIN_AF) | PORT_PCR_ODE_MASK)

    y aquí :

    PORTB->PCR[0] = PORT_PCR_MUX(2) | PORT_PCR_ODE_MASK; PORTB->PCR[1] = PORT_PCR_MUX(2) | PORT_PCR_ODE_MASK;

  • Como glen_geek ha resaltado en comentarios anteriores, parece que su código continúa con la comunicación I²C incluso después de que el ciclo ACK tenga el problema descrito anteriormente. Por lo tanto, es posible que tenga otro error de código en esta área.

respondido por el SamGibson

Lea otras preguntas en las etiquetas